大多数 SNAT 示例都给出以下内容
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 100.200.100.200
但是,这似乎不仅适用于转发的数据包,也适用于来自本地主机的数据包。这是不受欢迎的。来自本地主机的传出数据包可能是重要的数据包(SMTP 等),我不想将其 IP 更改为用于 NAT 的 IP。
我看到过这样的例子
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to-source 100.200.100.200
但这对我来说似乎不可靠,因为当您想要更改某些内容时,您需要留意另一个地方。有没有办法定义从本地主机发出的数据包无论如何都不应进行 SNAT?
答案1
如果你看一下 iptables 图(选择任意https://gist.github.com/nerdalert/a1687ae4da1cc44a437d) 您可以看到 nat.POSTROUTING 不仅应用于转发的数据包,还应用于从此主机发出的数据包。因此,如果您有 2 个 IP(100.100.100.5 和 100.100.100.6)分配给此主机,并且您的 iptables 中有类似以下内容
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 100.100.100.5
从此主机传出到的所有连接eth0将被 SNAT 改变。即使软件绑定到某个 IP。那可能很糟糕。
通过添加上述设置可以轻松避免这种情况
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL -j ACCEPT
这将接受该主机生成的任何数据包,无需 SNAT,适用于分配给该主机的所有 IP - 127.0.0.1 或 100.100.100.5 或 100.100.100.6(辅助 IP)等