Simon Shkolnik Asked: 2020-05-10 08:26:27 +0800 CST2020-05-10 08:26:27 +0800 CST 2020-05-10 08:26:27 +0800 CST 在 tcpdump 中过滤 tcp 数据包有效负载长度 772 greater过滤器按数据包的总长度过滤数据包。是否可以按有效载荷的长度进行过滤?我知道这可以作为显示过滤器,但我想知道是否可以在捕获过滤器中执行此操作。 tcpdump tshark 1 个回答 Voted Best Answer A.B 2020-05-10T11:01:26+08:002020-05-10T11:01:26+08:00 对于 IPv4 的情况,执行此操作的方法几乎tcpdump在's 手册中作为示例给出: 打印进出端口 80 的所有 IPv4 HTTP 数据包,即仅打印包含数据的数据包,而不是,例如,SYN 和 FIN 数据包以及 ACK-only 数据包。(IPv6 留给读者作为练习。) tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' tcpdump的表达式被编译成BPF 字节码(尝试添加选项-d来tcpdump查看它的样子),它可以取消引用指针并对它们进行一些算术和按位运算。 上面的tcp匹配和tcp[]取消引用不允许简单地过滤 TCP 有效负载大小。因此,下一个过滤器将总IPv4 数据包长度减去(可变)IP 标头长度以获得剩余的TCP 段长度,然后从结果中减去TCP 段数据偏移量(从而移除 TCP 段标头 + 选项长度)。如果剩余的值非零,则表示有效负载中有数据。 因此,例如,要将任何 IPv4 数据包与eth0接口上 4 到 6 个字节之间的 TCP 数据有效负载匹配,这将是: 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)只需多行字节码即可添加第二行尽管重复比较。
对于 IPv4 的情况,执行此操作的方法几乎
tcpdump
在's 手册中作为示例给出:tcpdump的表达式被编译成BPF 字节码(尝试添加选项
-d
来tcpdump
查看它的样子),它可以取消引用指针并对它们进行一些算术和按位运算。上面的
tcp
匹配和tcp[]
取消引用不允许简单地过滤 TCP 有效负载大小。因此,下一个过滤器将总IPv4 数据包长度减去(可变)IP 标头长度以获得剩余的TCP 段长度,然后从结果中减去TCP 段数据偏移量(从而移除 TCP 段标头 + 选项长度)。如果剩余的值非零,则表示有效负载中有数据。因此,例如,要将任何 IPv4 数据包与eth0接口上 4 到 6 个字节之间的 TCP 数据有效负载匹配,这将是:
不用担心编译后的字节码(同样,可以通过添加
-d
选项来显示)已经过优化,结果(这里是 Linux,tcpdump 4.9.3 和 libpcap 1.8.3)只需多行字节码即可添加第二行尽管重复比较。