我正在尝试使用 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,这就是为什么不允许指定输出接口的原因:您无法匹配您没有的(元)数据。
这是一个示意图解释它是如何工作的:
路由决策永远不会由网络过滤器或者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