我有一个特定的数据包,我想在任何时候被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。