我想捕获发往本地端口的 UDP 数据包,过滤表达式就像udp port 20000
. 我注意到如果 UDP 数据包上有 IP 碎片,libpcap 只能捕获第一个 IP 碎片。我猜原因是第二个 IP 片段没有 UDP 标头(我认为 TCP 相同),所以 libpcap 无法使用过滤器 express 捕获它们udp port 20000
。
有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?
谢谢!
我猜原因是第二个 IP 片段没有 UDP 标头(我认为 TCP 相同),所以 libpcap 无法使用过滤器 express udp 端口 20000 捕获它们。
对,那是正确的。
您可以尝试udp port 20000 or (ip[6:2] & 0x1fff) != 0
,它将捕获到或来自端口 20000 的数据包和第一个片段以外的 IP 片段;这并不理想,但这是你可以用 libpcap 过滤器做的所有事情,因为它使用的过滤器机制(它是 OS 内核的一部分)不维护数据包之间的任何历史记录,因此无法知道带有给定的 IP ID 恰好与另一个具有相同 IP ID、片段偏移量为 0 和端口为 20000 的 UDP 标头的数据包属于同一片段。
(另请注意,至少某些版本的 Linux 会以相反的顺序传输 IP 数据报的片段 - 以便让接收者首先看到最后一个片段,从而能够更经常地正确估计重组数据包的大小. 这将使使用检查 TCP 或 UDP 标头中的字段的过滤器捕获 IP 数据包的所有片段变得更加困难。)