iptables SNAT 如何处理本地 IP 的端口转换和将所有流量转发到同一本地 IP 的 DNAT 规则之间的 src 端口困境?

iptables SNAT 如何处理本地 IP 的端口转换和将所有流量转发到同一本地 IP 的 DNAT 规则之间的 src 端口困境?

假设我们有一个基于 Linux 的路由器,其 WAN 接口eth0ip addr 4.3.2.1(带有任何 gw ip)和 LAN 接口eth1ip addr 192.168.51.1/24,这意味着我们需要下面的 iptables 规则来使路由器或 nat 网关工作(与在 sysctl 中启用的 ipv4 转发一起):

iptables -t nat -A POSTROUTING -s 192.168.51.0/24 -j MASQUERADE

然后我们在 LAN 接口上连接了一个新设备,具有 ip addr192.168.51.2/24和 gw 192.168.51.1,因此它可以按预期通过 gw 连接到公共互联网。

现在设备要访问 上的 Web 服务器1.1.1.1,http 请求流量应该从 src like 192.168.51.2:40960(一个随机的 src 端口)到 dst 1.1.1.1:80,当流量通过路由器时,它应该更改为 src like 4.3.2.1:50961(在 上选择并记录的另一个随机 src 端口)网络转换端口表)到 dst 1.1.1.1:80,对吗?

然后当响应返回时,带有 dst 的数据包4.3.2.1:50961192.168.51.2:40960根据神经性皮炎并受到热烈欢迎。到目前为止一切都进展顺利。


现在问题来了,我们想将设备设置192.168.51.2为 DMZ 主机。我们再添加一条 iptables 规则,例如:

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.51.2

现在让我们想象一下设备想要再次访问相同的 Web 服务。这一次,当响应从1.1.1.1:80dst返回时4.3.2.1:50961,我们需要知道它应该走哪条路径 - 要么192.168.51.2:50961根据DNAT 规则我们刚刚设定,或者192.168.51.2:40960基于NAPT 记录流量何时从 WAN 出去?

哪一个有...比方说 - 更高的优先级...来处理响应的数据包?

提前致谢。

答案1

现有的 conntrack 状态(“NAPT 记录”)始终优先于任何-t nat规则。

如果你还记得的话,这个-t nat表只有每个连接的数据包 - 这是因为任何与现有 conntrack 状态匹配的数据包(无论是转发还是回复)都根据该状态中存储的值进行处理,而根本不需要查阅 iptables NAT 规则。

相关内容