端口转发后,在PHP / Apache中获取远程IP

时间:2018-01-16 03:05:54

标签: php apache httprequest ip-address portforwarding

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

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

我希望S2能够看到实际客户端的IP地址进行日志记录,但经过大量的搜索和调试后,我还没有能够使用它。

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

request flow chart

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

来自$_SERVER的{​​{1}}数组的截断版本如下:

truncated $_SERVER from phpinfo()

我找到了这个问题,其最高答案明确提到端口转发,可能是"搞乱数据包",这似乎正是在这种情况下发生的事情。

有没有办法查看远程客户端的IP而不是S1的IP?是否有可以在Apache或PHP中设置的配置?或者它是在网络层中,因此无法在应用层解析?我不太了解网络知识,知道要搜索什么。

1 个答案:

答案 0 :(得分:1)

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

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

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