我一直在试图让服务器正常运行来部署我的云服务。 我的大部分操作都是基于客户端的IP。 当我使用godaddy时,返回客户端ip的脚本正常工作(php,$ _SERVERvariables)。 现在在我的服务器上,它返回192.168.1.1(我的路由器/网关)。 为什么是这样? 我正在运行Apache,PHP5,Ubuntu服务器12.04 LTS。 我很感激提前的帮助。
您正在使用发夹NAT,它必须重写源IP地址。 如果要从内部连接到外部IP地址,源IP地址将始终必须是网关的IP地址。 否则,返回数据包将永远不会回到源机器。
我对你的build议根本就不是这样做的。 如果要连接到本地计算机,请使用其本地IP地址。
这个答案解释了同样的问题。
这里如果你不使用SNAT会发生什么:
请求来自只有一个私有IP地址的机器,所以它有一个私有的源IP地址。
目的地不是本地的,所以请求被发送到网关。
网关只重写目的地(这是错误的!)并将数据包发送到服务器。
服务器看到来自本地IP地址的查询,因此它将回复发送到本地IP地址。
本地机器看到从本地IP地址到发送到远程IP地址的数据包的答复,并忽略答复。
发夹NAT是双NAT的一种forms,同时使用SNAT和DNAT。 没有SNAT就无法工作。 答复也必须是NAT,这意味着源必须经过NAT来获得对网关的答复。
用tcpdump检查数据包到达服务器的样子。 也许SNAT已经在网关上激活了。
编辑1
这是指访问来自本地网之外的情况,以便SNAT可能但不是必需的。