我目前正在设置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的“内存”并避免填充其表。