代码之家  ›  专栏  ›  技术社区  ›  Francesco Cheinasso

NFTABLES:如何在POSTROUTING中进行DNAT

  •  0
  • Francesco Cheinasso  · 技术社区  · 3 年前

    我在POSTROUTING中设置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
    但是 nftables表格 返回给我此错误 Error: Could not process rule: Operation not supported 。 我认为不可能将后路由DNAT设置为 nftables表格
    是我错了还是我犯了一些错误?
    如果不可能,为什么?这只是一些没有实现的东西吗?
    是否有一些技术问题使其无法实施?
    你将如何解决这个问题?
    谢谢你的建议

    0 回复  |  直到 3 年前
        1
  •  1
  •   Fulvio    3 年前

    弗朗西斯科, 据我所知,您不能在POSTROUTING中执行DNAT。

    原因是在(内核)路由/转发代码中,根据数据包中包含的目的地(例如,下一跳、该数据包必须从何处发送的接口、到达下一跳的MAC地址)调整了几个参数。

    如果执行DNAT,则更改数据包中的目标地址,上述参数可能无效,因此可能需要再次遍历路由/转发代码。然而,考虑到后路由钩子在Linux内核中的位置,这已经不可能了。 例如,SNAT得到了完美的支持。

    这个问题的一个可能的解决方案是编写一个eBPF程序来执行DNAT并调整上述参数。 希望这有帮助。