dnat 时是否可以在 iptables 中提及目标接口?

dnat 时是否可以在 iptables 中提及目标接口?

我正在尝试使用 iptables 进行 dnat,如下所示

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 10.0.0.1:9000

是否可以提到output interface使用 iptables 或路由表是唯一的方法?

答案1

这是不可能的,因为命令会告诉 ( Can't use -o with PREROUTING),原因如下:

  • DNAT 发生在 nat/PREROUTING 中,顾名思义,路由决策。
  • 在路由决策之前,路由栈还没有被用来确定什么将是输出接口(如果它不是主机本身,则 iptables 的过滤器根本没有输出接口)。因此,此信息不可用于 nat/PREROUTING,这就是为什么不允许指定输出接口的原因:您无法匹配您没有的(元)数据。

这是一个示意图解释它是如何工作的:

Netfilter 和通用网络中的数据包流

路由决策永远不会由网络过滤器或者iptables,但是通过路由堆栈。所以对于具体的路由,ip route必须使用路由栈( ...)。有时如果没有 iptables 就无法做到这一点,您可以通过使用 iptables 在数据包上设置标记来将路由堆栈推向正确的方向。但路由部分可能会变得非常棘手。

如果您有特定需求,应在问题中提出这些需求:问题还应解释为什么而且不仅是如何你想这样做,以避免XY问题

答案2

看来你不能

 iptables -t nat -A PREROUTING -i eth0 -o eth0 -p tcp --dport 9000 -j DNAT --to-destination 10.0.0.1:9000
 iptables v1.8.4 (nf_tables): Can't use -o with PREROUTING

相关内容