iptables u32 匹配nat

iptables u32 匹配nat

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

相关内容