从同一 LAN 内的 PC 通过 Web 服务器的公共 IP 访问网站

从同一 LAN 内的 PC 通过 Web 服务器的公共 IP 访问网站

如果两台机器位于同一个 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 环回”。

然而,大多数路由器制造商显然没有意识到这个问题,并没有把这条规则(或路由器专有系统中的等效规则)放入他们的产品中……

相关内容