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

我有一个特定的数据包,我想在任何时候被redirect到我的虚拟networking接口上的特定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数据包(匹配一些hex,如果可能,最好带有通配符),无论白名单条目是什么,我都要传递给192.168.0.1:7777 ,我该怎么做?

所以最终这将是结果:

在这里输入图像说明

给我! :-) 我错了。 我想到的( -m string匹配扩展名)是不可能的,我们在nat表中,只有“连接”的第一个数据包(即使udp)会通过这个表。 所以我们不能检查所有相同连接的数据包并且只偏离一个。

您可以检查匹配扩展string-m string )。

另请注意,DNAT目标正在终止,这意味着如果数据包与具有DNAT目标的规则相匹配,则数据包将不会经历随后的规则。

所以你可以去这种解决scheme:

在你的nat表中:

第一条规则:您提到的第一条规则,与白名单相匹配

此规则之后依然stream经的分组是与白名单不匹配的分组(更准确地说,端口7777的UDP分组与白名单不匹配)。

第二条规则:在这里你可以使用-mstring。 请注意,检查数据包中的string可能需要大量资源。 你可以匹配hexstring( --hex-string选项),但是我不知道在这个匹配扩展中的通配符。

第三条规则:可以简化,因为终止目标DNAT

希望这可以帮助。

在[acket内容中匹配string您可以使用

 "--string [!] string" 

如果它编译进你的内核。

但没有wildchar,我没有find方法来使用hex。