iptables u32匹配nat

我目前正在设置IPtables来将某些UDP有效载荷redirect到我的应用程序。

这是我迄今为止工作的一个例子:

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12=0x54536F75 && 0>>22&0x3C@16=0x72636520 && 0>>22&0x3C@20=0x456E6769 && 0>>22&0x3C@24=0x6E652051 && 0>>22&0x3C@28=0x75657279' -j REDIRECT --to-port 21015 

这是工作,它将redirect包含有效载荷的数据包:

 FFFFFFFF54536F7572636520456E67696E6520517565727900 

从一个端口到另一个端口。

问题是,我有另一个我希望redirect的数据,但是这一直是不一样的。 数据包看起来像这样:

 ffffffff55ffffffff 

但是,数据包有时也可能如下所示:

 ffffffff55fa0cf40f 

我试过这样的东西:

 iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12=0x55' -j REDIRECT --to-port 21015 

我猜这个问题是我想要匹配2个字节,而不是4个正常的事情吗? 以上不会出错,但它也不会redirect数据包。

这将在你方便(在一行中,但我必须像这样显示,以大胆的工作):

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12 >>24 =0x55' -j REDIRECT --to-port 21015 iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12 =0x55' -j REDIRECT --to-port 21015

要么

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12 &0xFF000000=0x55000000 ' -j REDIRECT --to-port 21015

在这两种情况下,您都可以从等式中删除不想比较的部分,方法是将3个字节向右移并仅保留第一个字节,或者使用只在第一个字节中保留的掩码。 第二个是更灵活。

在类似于第一select的man iptables-extensions有一个例子:

… 0 >> 22&0x3C @ 0 >> 24 = 0“

[…]

这是ICMP有效载荷的前4个字节,其中字节0是ICMPtypes。 因此,我们只需将值24向右移位,即可将除第一个字节以外的所有字符进行比较,并将结果与​​0进行比较。

还要注意,由于它是nat表,如果源端口不改变,只有第一个UDP数据包将被考虑。 在这个conntrack将处理stream程,你的规则将不会看到其他数据包。 因此,如果每个数据包都是独立的,请确保源端口发生更改,并且可能必须使用nfct工具以及-j CT --timeout规则来缩短conntrack的“内存”并避免填充其表。