服务器认为请求来自我的网关

我一直在试图让服务器正常运行来部署我的云服务。 我的大部分操作都是基于客户端的IP。 当我使用godaddy时,返回客户端ip的脚本正常工作(php,$ _SERVERvariables)。 现在在我的服务器上,它返回192.168.1.1(我的路由器/网关)。 为什么是这样? 我正在运行Apache,PHP5,Ubuntu服务器12.04 LTS。 我很感激提前的帮助。

您正在使用发夹NAT,它必须重写源IP地址。 如果要从内部连接到外部IP地址,源IP地址将始终必须是网关的IP地址。 否则,返回数据包将永远不会回到源机器。

我对你的build议根本就不是这样做的。 如果要连接到本地计算机,请使用其本地IP地址。

这个答案解释了同样的问题。

这里如果你不使用SNAT会发生什么:

  1. 请求来自只有一个私有IP地址的机器,所以它有一个私有的源IP地址。

  2. 目的地不是本地的,所以请求被发送到网关。

  3. 网关只重写目的地(这是错误的!)并将数据包发送到服务器。

  4. 服务器看到来自本地IP地址的查询,因此它将回复发送到本地IP地址。

  5. 本地机器看到从本地IP地址到发送到远程IP地址的数据包的答复,并忽略答复。

发夹NAT是双NAT的一种forms,同时使用SNAT和DNAT。 没有SNAT就无法工作。 答复也必须是NAT,这意味着源必须经过NAT来获得对网关的答复。

用tcpdump检查数据包到达服务器的样子。 也许SNAT已经在网关上激活了。

编辑1

这是指访问来自本地网之外的情况,以便SNAT可能但不是必需的。