我有一些这样的端口转发规则
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
我想知道是否有办法在一行而不是两行中添加新的转发规则,这样我就不必输入两次相同的数据。我的意思是这样的规则:
- 在 nat PREROUTING 中将数据包转发到目的地并对其进行标记
- 在过滤器 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