我目前正在设置 IPtables 来将某些 UDP 有效负载重定向到我的应用程序。
下面是我迄今为止工作的一个例子:
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
这是有效的,它将重定向包含有效载荷的数据包:
FFFFFFFF54536F7572636520456E67696E6520517565727900
从一个端口到另一个端口上的应用程序。
问题是,我还有另一部分数据需要重定向,但它并不总是相同的。数据包如下所示:
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 个字节有关?上面的操作没有错误,但也没有重定向数据包。
答案1
这将以您的方便为准(在一行中,但我必须像这样显示它才能进行粗体工作):
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
&0xFF000000=0x55000000
' -j REDIRECT --to-port 21015
在这两种情况下,您都可以从等式中删除不想比较的部分,方法是向右移动 3 个字节并仅保留第一个字节,或者使用将等式中仅保留第一个字节的掩码。第二种方法更灵活。
有一个man iptables-extensions
与第一个选择类似的例子:
... 0 >> 22 & 0x3C @ 0 >> 24 = 0”
[...]
这是 ICMP 有效负载的前 4 个字节,其中字节 0 是 ICMP 类型。因此,我们只需将值右移 24 即可丢弃除第一个字节之外的所有字节,然后将结果与 0 进行比较。
还要注意,由于它是 nat 表,如果源端口不变,则只会考虑第一个 UDP 数据包。此后,conntrack 将处理流量,而您的规则将看不到其他数据包。因此,如果每个数据包都是独立的,请确保源端口发生变化,并且您可能必须使用该nfct
工具和-j CT --timeout
规则来缩短 conntrack 的“内存”并避免填满其表。