我在poststrouting中设置DNAT时遇到了问题(我真的需要它用于项目)。
一开始,我试着用iptables设置它:iptables -t nat -A POSTROUTING -p icmp -d 30.0.0.1 -j DNAT --to-destination 40.0.0.1
,但iptables给了我这个错误iptables v1.8.7 (nf_tables): RULE_APPEND failed (Invalid argument): rule in chain POSTROUTING
.
然后我阅读iptables手册页我想做的事是不可能的。在那之后,我尝试用nftables做同样的事情nft add table nat
nft 'add chain nat postrouting { type nat hook postrouting priority -100; }'
nft add rule nat postrouting oif wg-1to2 dnat to 40.0.0.1
.
Butnftables返回给我这个错误Error: Could not process rule: Operation not supported
。我认为用nftables设置poststrouting DNAT是不可能的.
是我错了还是我犯了一些错误?
如果不可能,为什么?它只是没有被执行吗?
是否存在一些技术问题使其无法实现?你会如何解决这个问题?
谢谢你的建议
根据我的理解,你不能在poststrouting中做DNAT。
原因是在(内核)路由/转发代码中,根据数据包中包含的目的地(例如,下一跳,该数据包必须从何处发送的接口,到达下一跳的MAC地址)调整了几个参数。
如果你做DNAT,因此你改变了数据包中的目的地址,上述参数可能会失效,因此你可能需要再次遍历路由/转发代码。然而,鉴于poststrouting钩子在Linux内核中的位置,这不再是可能的了。例如,完全支持SNAT。
这个问题的一个可能的解决方案是编写一个eBPF程序进行DNAT并调整上述参数。希望对你有帮助。