跳转至
阅读量:

NAT 回流问题

现象

通过在路由器上进行端口映射,将局域网主机暴露到公网。不在此局域网内的主机可通过公网 IP 直接访问该局域网主机,但是和局域网主机同一个局域网的主机不能通过公网 IP 访问该局域网主机。

原因

当同一局域网主机通过公网 IP 访问时,由于路由规则,数据包会被发送到路由器。

在路由器上此时同时存在两种NAT规则,SNAT和DNAT:

  • SNAT 主要目的是让是让源地址为内网网段的数据包的源地址转换为 WAN口IP;
  • DNAT 主要目的是让目的地址为 WAN 口 IP,且端口为映射的端口的数据包的目的地址转换为内网主机的IP和端口。

当内网主机通过公网 IP 访问时,在路由器上会同时匹配两条NAT规则,导致数据包的目的IP和源IP都发生改变。从而导致了路由器的丢包。

解决方案

  1. 增加 NAT 规则,让局域网主机访问端口映射主机时把源地址改为路由器 LAN 口地址。这样回包就会经过路由器进行转换,请求主机就能正常处理;
  2. 内网进行 DNS 劫持。外部访问时解析为公网地址,内网访问时解析为内网地址;
  3. 启用 Haripin 模式。在 Hairpin 模式下,内网流量全部会做一次源端口转换(这种会比较影响性能,大多数路由器也不支持这个功能)。

评论