如果两台机器位于同一个 LAN 上(一台 PC 和一台 Web 服务器),为什么需要在路由器上启用“NAT 环回”,以便 PC 使用路由器的公共 IP(哪个端口在端口 80 上转发到 Web 服务器)访问托管在 Web 服务器上的网站?这篇关于动态 DNS 的文章完美地说明了设置http://www.dyndns.com/support/kb/loopback_connections.html
(在示例中,他们尝试使用 URL www.example.com 访问 Web 服务器,但这对于我的问题来说并不相关,我只想通过公共 IP 访问 Web 服务器,不涉及 URL)
上述文章的最后一句话是:“如果他们尝试通过主机名 www.example.com 访问计算机,NAT 路由器将尝试将其路由出其 WAN 接口然后再返回。在大多数情况下,这将失败或返回路由器本身的 Web 界面,因为路由器不明白用户正在尝试做什么。”
有人能从技术上解释一下路由器为什么会混淆吗?在这种情况下,数据包到达路由器后究竟会发生什么,导致路由器混淆?
第二个问题,如果路由器支持“NAT环回”,那么此功能会在路由中改变什么以允许您使用公共 IP?
答案1
以下是一个例子。有些路由器,如 Neufbox4(法国 ISP 提供的路由器)运行的是 Linux。在这些路由器上,程序“iptables”用于配置 NAT 行为(iptables 是 Linux 网络的某种瑞士军刀)。
假设您的路由器后面有一个 Web 服务器(端口 TCP 80),监听 LAN 地址 192.168.0.2,并且您为其添加了端口映射(重定向)。这在 iptables 术语中相当于以下内容:
iptables -t nat -A PREROUTING -i wan -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
这意味着“对于通过 WAN 接口进入的每个数据包,将其发送到 TCP 端口 80”。这正是您想要的。目前一切都很好……
您必须了解,与路由器的 WAN 接口关联的 IP 地址是您的公共 Internet 地址。例如,如果您的 Internet IP 是 1.2.3.4,则路由器上的“wan”接口的 IP 地址为 1.2.3.4。
现在假设您尝试从 LAN 访问 Web 服务器,例如从地址为 192.168.0.3 的个人计算机,使用您自己的 Internet 地址。例如,您输入“http://1.2.3.4/“在您的浏览器中。
实际情况是,您的计算机将发送一个数据包,定向到 LAN 上的 1.2.3.4、TCP 端口 80。路由器将接收此数据包。但它不会将其重定向到 192.168.0.2。为什么?因为上面的 iptables 规则仅处理从 WAN 接口传入的数据包,而不是来自 LAN 的数据包!
那么会发生什么呢?这取决于路由器上的其他网络规则。一般来说,会发生以下两种情况之一:
路由器将看到一个发往自身的数据包(请记住,1.2.3.4 是路由器的 IP 地址之一,因此这完全正常)。大多数路由器上都有一个 Web 服务器在端口 80 上监听管理界面。因此,该 Web 服务器将处理数据包,而不是 LAN 上的 Web 服务器,您将获得管理界面,而不是您的网站。
或者路由器会因为某种原因丢弃数据包,仅仅是因为它不知道如何处理指向其 LAN 端口上的 WAN 地址的数据包。
从技术上讲,解决方案非常简单,它包含以下形式的 iptables 规则:
iptables -t nat -A PREROUTING -i lan -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
这意味着“对于通过 LAN 接口进入的每个数据包,如果该数据包指向 TCP 端口 80,并且目的地址为 1.2.3.4,则将其发送到 192.168.0.2”。这就是所谓的“NAT 环回”。
然而,大多数路由器制造商显然没有意识到这个问题,并没有把这条规则(或路由器专有系统中的等效规则)放入他们的产品中……