iptables接受特定的数据包ID

我想只允许具有特定id(标识字段)的数据包,例如,具有id = 3的数据包被接受,而其他数据被丢弃。 我想用偏移量做同样的事情,例如这个数据包被接受:

09:59:29.216755 IP (tos 0x0, ttl 64, id 3, offset 0, flags [DF], proto UDP (17), length 35) XXX.XXX.XXX.XXX.XXXXX > XXX.XXX.XXX.XXX.XXXXX: UDP, length 7 

在此先感谢,抱歉我的英文不好。

你可以做到这一点,但它需要掌握可怕的u32语言:

 iptables -I INPUT 1 -m u32 --u32 "2 & 0xFFFF = 3" -j LOG 

这导致像下面的日志条目(注意ID=字段):

 Oct 14 16:09:01 risby kernel: IN=p1p1 OUT= MAC=70:71:bc:ac:44:5a:00:13:72:ba:37:50:08:00 SRC=10.11.0.6 DST=192.168.3.11 LEN=1407 TOS=0x10 PREC=0x00 TTL=63 ID=3 DF PROTO=TCP SPT=45933 DPT=22 WINDOW=883 RES=0x00 ACK URGP=0 

细节是:

  • 2select从头部的字节2开始的四个字节,即字节2-5,其中4和5是ID字段

  • & 0xFFFF只select前面的两个字节,即id字段

  • = 3是真的IFO前一个是3。

至于偏移量,我的Stevens副本说偏移字段是字节6和7的底部13位,所以对于偏移量= 2,你可能想要类似

 iptables -I INPUT 1 -m u32 --u32 "4 & 0x1FFF = 2" -j LOG 

如果您想使用除LOG之外的目标,例如ACCEPTDROP 。 不过,我也同意古特伯特对于你为什么要这样做的好奇心。