我已经成功地使用了这个规则:
iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
将 NAT 流量从本地 10.0.2.0 子网传到互联网(在 eno1 的远端)。
来自更远的 192.168.3.0 子网的流量(通过 192.168.3 网络上的路由器发送)在通过此 Linux 路由器传到互联网时并未经过 NAT。相反,传出数据包保留其 192.168.3.x 地址,因此没有收到来自互联网服务器的回复。
将 MASQUERADE 规则替换为:
iptables -t nat -A POSTROUTING -o eno1 -j SNAT --to 1.2.3.4
(其中 1.2.3.4 是 eno1 上 Linux 路由器的互联网地址)修复了该问题。
iptables MASQUERADE 是否应该只重写来自 Linux 路由器本地网络的数据包,就像这里的情况一样?或者还有其他的解释吗?
答案1
这很有趣,因为man iptables-extensions
说
伪装相当于指定到数据包发出的接口的 IP 地址的映射,但也会导致接口关闭时忘记连接
soMASQUERADE
相当于SNAT
, where--to
是从界面中获取的,我很惊讶你看到这两个 wrt 之间的差异。转发的数据包。
此外,我还用于MASQUERADE
从我的机器上的网络命名空间转发数据包,并且它工作得很好。
所以我的第一个想法是你看到了一些其他效果,我会仔细检查是否确实是不同的规则造成了差异,而不是其他东西。