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

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

我一直在尝试启动并运行服务器以部署我的云服务。我的大多数操作都是基于客户端 IP 的。当我使用 godaddy 时,返回客户端 IP 的脚本运行良好(php,$_SERVER 变量)。现在在我的服务器上,它返回 192.168.1.1(我的路由器/网关)。这是为什么?我正在运行 Apache、PHP5、Ubuntu Server 12.04 LTS。我非常感谢您的帮助。

答案1

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

我的建议是不要这样做。如果你想连接到本地机器,请使用其本地 IP 地址。

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

如果你不使用 SNAT,将会发生以下情况:

  1. 该请求源自仅具有私有 IP 地址的机器,因此它具有私有源 IP 地址。

  2. 目的地不在本地,因此请求被发送到网关。

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

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

  5. 本地机器看到本地 IP 地址对发送到远程 IP 地址的数据包的回复并忽略该回复。

Hairpin NAT 是一种双重 NAT,同时使用 SNAT 和 DNAT。没有 SNAT 就无法工作。回复也必须经过 NAT,这意味着源必须经过 NAT 才能将回复发送到网关。

答案2

使用 tcpdump 检查到达服务器的数据包是什么样子的。也许网关上已激活 SNAT。

编辑1

这是指访问来自本地网络之外的情况,因此 SNAT 是可能的,但不是必要的。

相关内容