如何在 nat 预路由表中转发数据包时设置标记?

如何在 nat 预路由表中转发数据包时设置标记?

我有一些这样的端口转发规则

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000
iptables -A FORWARD -p tcp -d 172.16.8.2 --dport 46000 -j ACCEPT

我想知道是否有办法在一行而不是两行中添加新的转发规则,这样我就不必输入两次相同的数据。我的意思是这样的规则:

  1. 在 nat PREROUTING 中将数据包转发到目的地并对其进行标记
  2. 在过滤器 FORWARD 中允许所有使用规则 1 标记的数据包

是否可以?

答案1

不可能只用每个 DNAT 一个命令来完成此操作 - 除非... 见下文。但可以只输入一次数据。

让我们为获得 DNAT 和转发的连接定义标记范围 1024-2047。

mangle 中每个 DNAT 匹配条件占一行:

iptables -t mangle -A PREROUTING -p tcp --dport 46000 -j MARK --set-mark 0x400
iptables -t mangle -A PREROUTING -p tcp --dport 46001 -j MARK --set-mark 0x401
iptables -t mangle -A PREROUTING -p tcp --dport 46002 -j MARK --set-mark 0x402

nat 中的每个命令一个:

iptables -t nat -A PREROUTING -m mark --mark 0x400 -j DNAT \
  --to-destination 172.16.8.2:46000
iptables -t nat -A PREROUTING -m mark --mark 0x401 -j DNAT \
  --to-destination 172.16.8.2:46001
iptables -t nat -A PREROUTING -m mark --mark 0x402 -j DNAT \
  --to-destination 172.16.8.2:46002

一个命令即可完成所有过滤:

iptables -A FORWARD -m mark --mark 0x400/0x400 -j ACCEPT

-j DNAT顺便说一句:如果没有改变,则无需提供目的港。

编辑1:

如果你愿意允许所有经过 DNAT 处理的内容,并且不明确允许连接,那么你可以这样做。在这种情况下,你应该坚持你的

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000

但对于所有规则只有一条 FORWARD 规则:

iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

相关内容