过滤greater
器根据数据包的总长度进行过滤。是否可以按有效载荷的长度进行过滤?我知道这可以作为显示过滤器,但我想知道是否可以在捕获过滤器中执行此操作。
答案1
实现此目的的方法是几乎举个例子tcpdump
手册中针对 IPv4 的情况如下:
打印往返于端口 80 的所有 IPv4 HTTP 数据包,即仅打印包含数据的数据包,而不是例如 SYN 和 FIN 数据包和仅 ACK 数据包。(IPv6 留给读者练习。)
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
这tcpdump的表达式被编译成带通滤波器 字节码(尝试添加选项-d
来tcpdump
查看它的样子),它可以取消引用指针并对它们执行一些算术和按位运算。
上面的匹配tcp
和tcp[]
取消引用不允许简单地过滤 TCP 有效负载大小。因此,下一个过滤器会减去总IPv4 数据包长度(变量)IP 报头长度得到剩下的TCP 段长度,然后从结果中减去TCP 段数据偏移量(因此删除了 TCP 段头 + 选项长度)。如果剩余的值非零,则表示有效负载中有数据。
例如,要匹配任何 IPv4 数据包,其 TCP 数据有效负载介于 4 到 6 个字节之间,eth0界面,这将是:
tcpdump -n -s0 -p -i eth0 'ip and tcp and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) >= 4) and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) <= 6)'
不要担心,编译后的字节码(再次,可以通过添加选项来显示-d
)已经过优化,并且结果(这里是 Linux,tcpdump 4.9.3 和 libpcap 1.8.3)只需要一行字节码来添加第二次比较,尽管有重复。