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

Mik*_*kov 7 iptables openwrt 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
Run Code Online (Sandbox Code Playgroud)

我知道规则是什么意思。但是还有另外两条规则负责 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
Run Code Online (Sandbox Code Playgroud)

这意味着所有从 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
Run Code Online (Sandbox Code Playgroud)

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

plu*_*ash 19

为了使 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
Run Code Online (Sandbox Code Playgroud)

有了这条规则,就会发生以下情况。

  • 客户端创建初始数据包 (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
Run Code Online (Sandbox Code Playgroud)

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

  • 客户端创建初始数据包 (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 来回转换数据包。