【问题标题】:Get remote IP in PHP / Apache after port forwarding端口转发后在 PHP/Apache 中获取远程 IP
【发布时间】:2018-06-24 16:55:34
【问题描述】:

我在客户端的网络上有两台 Windows 服务器,其中一台服务器 (S1) 具有公共 IP,并且端口将请求转发到在另一台没有公共 IP 的服务器 (S2) 上运行在 Apache 中的 PHP Web 应用程序。

使用 PHP 和 Apache,S2 只将传入请求的远程地址视为 S1 的内部 IP。

我希望 S2 能够查看实际客户端的 IP 地址以进行日志记录,但经过大量搜索和调试后,我无法使其正常工作。

请求如何流入和流出系统的粗略草图如下:

S1 不使用任何应用程序(反向代理等)转发这些请求,这意味着它不能将 X-FORWARDED-FOR 标头(或任何其他代理标头)附加到 HTTP 请求。

来自phpinfo()$_SERVER 数组的截断版本如下:

我发现这个问题的最佳答案特别提到了端口转发可能会“弄乱数据包”,这似乎正是在这种情况下发生的事情。

有什么办法可以看到远程客户端的IP而不是S1的IP?是否有可以为此在 Apache 或 PHP 中设置的配置?还是在网络层无法在应用层解决?我对这里的网络了解不多,不知道要搜索什么。

【问题讨论】:

    标签: php apache httprequest ip-address portforwarding


    【解决方案1】:

    如果您丢失了客户端 IP,那么这并不是真正的端口转发。这听起来更像是 SSL 终止,其中 S1 处理 SSL 并将解密的流量转发到 S2。这种拦截(不是说它是那种场景——只是有点像它)会导致你看到的场景。

    在这种情况下,最好的办法是找出执行转发的具体配置/技术,并将原始远程 IP 复制到环境变量中,以便向 S2 发出请求。一种简单的方法是将 IP 注入自定义 HTTP 标头中,以便它显示在您的 $_SERVER 数组中。

    但具体如何实现取决于 S1 上的设置,因为 S1 正在重写数据包(IP 存储在数据包头中)。

    【讨论】:

    • 不幸的是,客户的托管服务提供商只告诉我这是“简单的标准端口转发”,这让我相信它没有进行任何 SSL 终止。在这个阶段,我无法从他们那里获得更多信息,所以我认为必须这样做,谢谢。
    • 你所描述的听起来既不简单也不标准。我使用 SSL 终止作为可比较的示例。但是,在不了解设置细节的情况下,任何人都无话可说。
    • 我同意,很遗憾我无法从他们那里获得更多信息。无论如何,感谢您的帮助。
    猜你喜欢
    • 2013-07-11
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2012-07-12
    • 2021-10-19
    • 2015-01-04
    相关资源
    最近更新 更多