![服务器认为请求来自我的网关](https://linux22.com/image/606799/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%A4%E4%B8%BA%E8%AF%B7%E6%B1%82%E6%9D%A5%E8%87%AA%E6%88%91%E7%9A%84%E7%BD%91%E5%85%B3.png)
我一直在尝试启动并运行服务器以部署我的云服务。我的大多数操作都是基于客户端 IP 的。当我使用 godaddy 时,返回客户端 IP 的脚本运行良好(php,$_SERVER 变量)。现在在我的服务器上,它返回 192.168.1.1(我的路由器/网关)。这是为什么?我正在运行 Apache、PHP5、Ubuntu Server 12.04 LTS。我非常感谢您的帮助。
答案1
您使用的是发夹式 NAT,它必须重写源 IP 地址。如果您要从内部连接到外部 IP 地址,则源 IP 地址必须始终是网关的 IP 地址。否则,返回数据包将永远不会返回到源计算机。
我的建议是不要这样做。如果你想连接到本地机器,请使用其本地 IP 地址。
这个答案解释了同样的问题。
如果你不使用 SNAT,将会发生以下情况:
该请求源自仅具有私有 IP 地址的机器,因此它具有私有源 IP 地址。
目的地不在本地,因此请求被发送到网关。
网关仅重写目的地(这是错误的!)并将数据包发送到服务器。
服务器看到来自本地 IP 地址的查询,因此它将答复发送到本地 IP 地址。
本地机器看到本地 IP 地址对发送到远程 IP 地址的数据包的回复并忽略该回复。
Hairpin NAT 是一种双重 NAT,同时使用 SNAT 和 DNAT。没有 SNAT 就无法工作。回复也必须经过 NAT,这意味着源必须经过 NAT 才能将回复发送到网关。
答案2
使用 tcpdump 检查到达服务器的数据包是什么样子的。也许网关上已激活 SNAT。
编辑1
这是指访问来自本地网络之外的情况,因此 SNAT 是可能的,但不是必要的。