假设我们有一个基于 Linux 的路由器,其 WAN 接口eth0
ip addr 4.3.2.1
(带有任何 gw ip)和 LAN 接口eth1
ip 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:50961
将192.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:80
dst返回时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 规则。