我在 NATed 家庭网络(10.0.0.0/8)上,其中电缆调制解调器具有公共 IP 1.1.1.2,并且内部网络 10.1.10.2 上的网络服务器“www”具有由电缆调制解调器转发的端口 80。
现在我使用桌面客户端 (10.1.10.3) 从浏览器访问 www;DNS 将其转换为网络服务器的民众IP 为 1.1.1.2,浏览器挂起。这种情况发生在我网络内的各种内部机器上,但对于 LAN 之外的客户端来说却很正常。
此外,内部客户端可以在其浏览器上输入 10.1.10.2 并正常访问网络服务器。
问题:知道为什么公共 IP 会导致失败吗?
笔记:我通过运行自己的 DNS(通过 dnsmasq)并将“www”设置为 10.1.10.2,同时将所有其他名称转发到外部名称服务器来解决了这个问题。
答案1
要实现此功能,您的路由器需要支持一项称为 hairpin NAT 的功能。基本上,即使数据包不在 WAN 接口(通常应用 NAT 的接口)上传输,路由器也必须执行 NAT 转换。有些路由器支持此功能,有些则不支持。例如,Linux 不支持,而且许多家用路由器都是用 Linux 构建的。您必须拥有一种不支持此功能的路由器。
请注意,即使发夹式 NAT 有效,该场景中的所有流量也必须通过路由器,而如果您直接与 Web 服务器的内部 IP 通信,流量可以直接在第 2 层进入 Web 服务器。因此,您的dnsmasq
解决方案更好。该解决方案并非总是可行的(例如,如果 NAT 后面的某些主机静态配置为使用 DHCP 服务器提供的名称服务器以外的名称服务器),但如果它对您有效,您应该使用它。