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

Pom*_*oma 5 networking nat routing iptables port-forwarding

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

是否可以?

Hau*_*ing 4

每个 DNAT \xe2\x80\x93 仅使用一个命令来完成此操作是不可能的,除非......见下文。但可以只输入一次数据。

\n\n

让我们为进行 DNAT 转发的连接定义标记范围 1024\xe2\x80\x932047。

\n\n

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

\n\n
iptables -t mangle -A PREROUTING -p tcp --dport 46000 -j MARK --set-mark 0x400\niptables -t mangle -A PREROUTING -p tcp --dport 46001 -j MARK --set-mark 0x401\niptables -t mangle -A PREROUTING -p tcp --dport 46002 -j MARK --set-mark 0x402\n
Run Code Online (Sandbox Code Playgroud)\n\n

nat 中的每个命令一个:

\n\n
iptables -t nat -A PREROUTING -m mark --mark 0x400 -j DNAT \\\n  --to-destination 172.16.8.2:46000\niptables -t nat -A PREROUTING -m mark --mark 0x401 -j DNAT \\\n  --to-destination 172.16.8.2:46001\niptables -t nat -A PREROUTING -m mark --mark 0x402 -j DNAT \\\n  --to-destination 172.16.8.2:46002\n
Run Code Online (Sandbox Code Playgroud)\n\n

一条命令可用于过滤器中的所有内容:

\n\n
iptables -A FORWARD -m mark --mark 0x400/0x400 -j ACCEPT\n
Run Code Online (Sandbox Code Playgroud)\n\n

-j DNATBTW:如果不更改,则无需指定目的端口。

\n\n

编辑1:

\n\n

如果您不明确允许连接,或者您同意允许所有经过 DNAT 处理的内容,那么您就可以做到这一点。在这种情况下,你会坚持你的

\n\n
iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000\n
Run Code Online (Sandbox Code Playgroud)\n\n

但只有一条 FORWARD 规则适用于所有规则:

\n\n
iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT\n
Run Code Online (Sandbox Code Playgroud)\n