NAT 反射(NAT 环回)如何工作?

NAT 反射(NAT 环回)如何工作?

我使用 OpenWRT 自动生成的规则作为 NAT 反射(NAT 环回)的示例。

因此,我们假设有一个网络 192.168.1.0/24,有两个主机(+ 路由器):192.168.1.100 和 192.168.1.200。路由器有两个接口 LAN (br-lan) 和 WAN (eth0)。 LAN 接口的 IP 为 192.168.1.1,WAN 接口的 IP 为 82.120.11.22(公共)。 192.168.1.200 上有一个 www 服务器。我们希望使用公共 IP 地址从 192.168.1.100 连接到 Web 服务器。

如果您想重定向 WAN->LAN,以便来自互联网的人们可以访问 Web 服务器,您可以将以下规则添加到 iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80

我知道规则意味着什么。但还有另外两个规则负责 NAT 反射。其中之一对我来说不如上面的那么清楚。所以第一条规则看起来像这样:

iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

这意味着从 192.168.1.0/24 网络发往公共 IP 到端口 80 的所有流量都应该发送到本地 Web 服务器,这意味着我在 Firefox 中输入公共 IP,我应该得到服务器返回的页面,对吗?表中的所有其他转发魔法filter都已完成,但我仍然无法使用公共 IP 连接到 Web 服务器。数据包符合规则,但没有任何反应。

我们需要另一条nat规则才能使整个机制发挥作用:

iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

我不知道为什么需要这条规则。谁能解释一下这个规则到底是做什么用的?

答案1

为了使 NAT 正常工作,从客户端到服务器的数据包以及从服务器到客户端的数据包都必须经过 NAT。

请注意,iptables 中的 NAT 表仅用于连接的第一个数据包。使用第一个数据包转换时建立的内部映射表来处理与连接相关的后续数据包。

iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

只要制定了这条规则,就会发生以下情况。

  • 客户端创建初始数据包 (tcp syn) 并将其寻址到公共 IP。客户端期望得到对此数据包的响应,其中源 ip/端口和目标 ip/端口交换。
  • 由于客户端在其路由表中没有特定条目,因此会将其发送到其默认网关。默认网关是 NAT 盒。
  • NAT 盒接收初始数据包,修改目标 IP,建立映射表条目,在其路由表中查找新目标并将数据包发送到服务器。源地址保持不变。
  • 服务器接收初始数据包并制作响应(syn-ack)。在响应中,源 IP/端口与目标 IP/端口交换。由于传入数据包的源 IP 未更改,因此回复的目标 IP 是客户端的 IP。
  • 服务器在其路由表中查找 IP,并将数据包发送回客户端。
  • 客户端拒绝数据包,因为源地址与预期不匹配。
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

一旦我们添加了这条规则,事件的顺序就会改变。

  • 客户端创建初始数据包 (tcp syn) 并将其寻址到公共 IP。客户端期望得到对此数据包的响应,其中源 ip/端口和目标 ip/端口交换。
  • 由于客户端在其路由表中没有特定条目,因此会将其发送到其默认网关。默认网关是 NAT 盒。
  • NAT 盒接收初始数据包,根据 NAT 表中的条目修改目标 IP、源 IP 和可能的源端口(仅在需要消除歧义时才修改源端口),建立映射表条目,查找新目标在其路由表中并将数据包发送到服务器。
  • 服务器接收初始数据包并制作响应(syn-ack)。在响应中,源 IP/端口与目标 IP/端口交换。由于传入数据包的源 IP 已被 NAT 盒修改,因此数据包的目标 IP 是 NAT 盒的 IP。
  • 服务器在其路由表中查找 IP,并将数据包发送回 NAT 盒。
  • NAT 盒在其 NAT 映射表中查找数据包的详细信息(源 IP、源端口、目标 IP、目标端口)并执行反向转换。这会将源 IP 更改为公共 IP,将源端口更改为 80,将目标 IP 更改为客户端的 IP,并将目标端口更改回客户端使用的任何源端口。
  • NAT 盒在其路由表中查找新的目标 IP,并将数据包发送回客户端。
  • 客户端接受数据包。
  • NAT 来回转换数据包,通信继续进行。

答案2

听起来它强制反向流量也流经 openwrt。通过重写网络服务器将看到的源地址。

如果网络服务器直接回复客户端,则源地址为那些数据包仍然是网络服务器的数据包。但客户端正在尝试与 openwrt IP 通信。因此,回复数据包将被丢弃。

在第一种情况下,您不需要强制执行,因为从网络服务器到互联网上的客户端的路由已经通过了 openwrt 盒子。

相关内容