路由决定后如何更改目标IP地址,即在iptables的POSTROUTING链中?
e …顾名思义 – 在POSTROUTING表中执行它有点太晚了。
这和这是相当有用的,看看什么时候发生。 如果你真的必须重写地址 – 也许把另一台机器在线[虚拟? ]甚至更好 – 重新考虑你为什么要这样做。
如果你真的想改变POSTROUTING的目的地,也许你可以尝试滥用NETMAP目标? 我不确定它是否有效,但尝试像这样:
iptables -t nat -A POSTROUTING -d 1.2.2.2/32 -j NETMAP --to=1.3.3.3/32
我不认为这是一个好的答案。 我不认为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地址,那么更改路由select就太迟了(这对我的示例使用会很好)。 你只能路由一次数据包。
我知道的唯一的解决scheme将是有一个虚拟机,位于eth0和真正的networking之间,然后可以做DNAT。
出于我的目的,当VPN接口出现故障或出现时,我可以dynamic添加或删除预路由规则,但感觉像是一个笨拙的解决scheme。
在POSTROUTING表中没有办法改变目的IP地址。
在POSTROUTING链中使用NETMAP将作为整个映射networking的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
以上规则将在24networking中replace源IP地址1.2.3.4到11.22.33.44 。