我有一个特定的数据包,我希望它始终被重定向到我的虚拟网络接口上的特定 IP。目前我的 iptables 设置如下:
(这些命令,我暂时使用 \ 来使其更具可读性,读作“将下一行合并到此行”:))对于允许的 IP:
iptables \
-t nat -A PREROUTING \
-i vmbr0 -p udp --dport 7777 \
-m set --match-set whitelist \
-j DNAT --to 192.168.0.1:7777
对于不允许的 IP:
iptables \
-t nat -A PREROUTING \
-i vmbr0 -p udp --dport 7777 \
-m set ! --match-set whitelist \
-j DNAT --to 192.168.0.1:7778
但是有一个特定的 udp 数据包(与某个十六进制匹配,最好使用通配符),192.168.0.1:7777
无论白名单条目如何,我都想将其传递,我该怎么做?
所以最终的结果将是这样的:
答案1
明白了!:-) 我错了。我所想的(-m string
匹配扩展)是不可能的,我们在 nat 表中,只有“连接”的第一个数据包(即使是 udp)会通过此表。所以我们无法检查同一连接的所有数据包并只偏离一个。
您可以检查匹配扩展string
(-m string
)。
还要注意,DNAT 目标正在终止,这意味着如果数据包与 DNAT 目标的规则匹配,则该数据包将不会遵循后续规则。
因此你可以选择这种解决方案:
在你的 nat 表中:
第一条规则:您提到的第一条规则,与白名单匹配
该规则之后仍然流过的数据包是与白名单不匹配的数据包(更准确地说是与白名单不匹配的端口 7777 的 UDP 数据包)。
第二条规则:在这里您可以使用 -m 字符串。请注意,检查数据包中的字符串可能会耗费大量资源。您可以匹配十六进制字符串(--hex-string
选项),但我不知道此匹配扩展中的通配符。
第三条规则:可以简化,因为终止目标 DNAT
希望这可以帮助。
答案2
要匹配 [ack内容中的字符串,您可以使用
"--string [!] string"
如果它在你的内核中编译。
但是没有通配符并且我也没有找到使用十六进制的方法。