根据数据包长度过滤 TCPDUMP

根据数据包长度过滤 TCPDUMP

我想通过tcpdump数据包长度缩小范围。我知道我可以使用 `| grep,但我想知道我是否可以将此特定数据包长度作为“tcpdump”中的选项传递。我正在尝试编写一个脚本,使用以下命令向我显示网络上所有存在的 MPEG-TS 多播:

sudo tcpdump -c 1000 -ti <network_interface> multicast | grep 1316 | sort | uniq

所以这个命令有效并且给了我我想要的输出但是我想我可以通过在命令中传递长度来简化它tcpdump,例如:

sudo tcpdump -c 1000 -ti <network_interface> multicast and length 1316 | sort | uniq

答案1

以太网数据包总大小

根据pcap 过滤器(7),则可以使用以下条件:

  • less length, 相当于len <= length

  • greater length, 相当于len >= length

  • 根据示例,您还应该能够使用,但这没有记录。len == length

请注意,这包括链路层和网络层标头(即捕获的所有内容),因此空的 TCP ACK 将具有 60 的 IP“总长度”字段,但总共被视为 74 字节。

另请参阅此 StackOverflow 线程:https://stackoverflow.com/questions/9874093/how-to-filter-tcpdump-output-based-on-packet-length

IP 数据包总大小

根据tcpdump(1),您可以访问 IPv4 标头的“总长度”字段:

  • ip[2:2] > 576
  • ip[2:2] <= 1000
  • 和类似的。

UDP 数据包或有效负载总大小

UDP 没有长度字段,但其报头大小始终为 8,你可以通常假设 IPv4 报头大小始终为 20(IPv4 选项为非常尽管它们在 IGMP 中确实有使用,但很少见。

因此,如果您尝试过滤 1316 字节的 UDP 数据报,

  • IP.总长度 = IP.报头[20] + UDP.报头[8] + UDP.有效负载[1316]

你就得到了过滤器ip[2:2] == 1344

相关内容