如何在做出路由决策后(即在 iptables 的 POSTROUTING 链中)更改目标 IP 地址?
答案1
答案2
如果你真的想改变 POSTROUTING 中的目标,也许你可以尝试滥用 NETMAP 目标?我不确定它是否有效,但请尝试以下方法:
iptables -t nat -A POSTROUTING -d 1.2.2.2/32 -j NETMAP --to=1.3.3.3/32
答案3
我认为这个问题没有好的答案。我认为 iptables 不允许你在路由后更改目标 IP 地址。我想要做的是:
iptables -t nat -A POSTROUTING -o eth0 -p udp -d 10.0.0.0/8 --dport 53 -m comment --comment "Redirect DNS when VPN is down" -j DNAT --to-destination 8.8.8.8
但这不合法。我想根据输出接口更改目标地址,而这在路由之后才知道。
如果您可以更改目标 IP 地址,则更改路由就太晚了(这对于我的示例用途来说没问题)。您只能路由数据包一次。
我知道的唯一解决方案是在 eth0 和真实网络之间建立一个虚拟机,然后可以执行 DNAT。
就我的目的而言,我可以在 VPN 接口关闭或启动时动态添加或删除预路由规则,但这感觉像是一个笨拙的解决方案。
答案4
无法更改POSTROUTING
表中的目标 IP。
使用链NETMAP
中的方法POSTROUTING
将充当SNAT
整个映射网络。
例如
iptables -t nat -A POSTROUTING -s 1.2.3.4/24 -d 5.6.7.8/24 -j NETMAP --to 11.22.33.44/24
上述规则将会替换网络中的源1.2.3.4
IP11.22.33.44
地址24
。