如何使用 iptables 重定向与特定模式匹配的数据包?(例如,使用 UDP 的 QUERY 命令)

如何使用 iptables 重定向与特定模式匹配的数据包?(例如,使用 UDP 的 QUERY 命令)

我有一个特定的数据包,我希望它始终被重定向到我的虚拟网络接口上的特定 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"

如果它在你的内核中编译。

但是没有通配符并且我也没有找到使用十六进制的方法。

相关内容