我想捕获发往本地端口的UDP数据包,过滤表达式类似于udp port 20000
。我注意到如果UDP数据包上存在IP分片,libpcap只能捕获第一个IP分片。我想原因是第二个IP片段没有UDP头(我认为它与TCP相同),因此libpcap无法使用过滤快递udp port 20000
来捕获它们。
有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?
谢谢!
答案 0 :(得分:9)
我猜原因是第二个IP片段没有UDP头(我认为它对TCP来说是一样的),所以libpcap无法使用filter express udp port 20000捕获它们。
是的,这是正确的。
您可以尝试udp port 20000 or (ip[6:2] & 0x1fff) != 0
,它将从第一个片段以外的端口20000 和 IP片段捕获数据包;虽然它使用的过滤机制(它是操作系统内核的一部分)不能保持数据包之间的任何历史记录,但它无法知道带有数据包的数据包给定的IP ID恰好是与具有相同IP ID的另一个数据包相同的片段的一部分,片段偏移量为0,UDP端口为20000。
(另请注意,至少某些版本的Linux会以 reverse 顺序传输IP数据报的片段 - 以便允许收件人首先查看最后一个片段,从而能够更经常地正确地估计重组数据包的大小。这将使得甚至更多难以使用检查TCP或UDP报头中的字段的过滤器捕获所有IP数据包的片段。)