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

我有几个像这样的端口转发规则

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 

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

  1. 在nat PREROUTING转发数据包到目的地并将其标记
  2. 在FORWARDfilter中,允许所有使用规则1标记的数据包

可能吗?

每个DNAT只有一个命令就不可能完成 – 除非…见下文。 但是可以只input一次数据。

让我们定义标记范围1024-2047,获取DNATted和转发的连接。

每条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 

一个在filter中的命令:

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

顺便说一句:如果没有改变,就不需要为-j DNAT提供目标端口。

编辑1:

你可以做到这一点,如果你不明确允许连接,如果你是允许所有已经被DNATted的罚款。 在这种情况下,你会坚持你的

 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