使用 tcpdump 过滤 GRE 封装的数据包

Daz*_*all 4 tcpdump

我可以要求 tcpdump 非常简单地向我展示 GRE 封装的数据包tcpdump -ni any proto gre

15:02:57.209082 IP 10.14.0.3 > 10.14.0.2: GREv0, key=0x1, length 106: IP 10.10.10.11 > 10.10.10.1: ICMP echo request, id 21073, seq 2784, length 64
15:02:57.209138 IP 10.14.0.2 > 10.14.0.3: GREv0, key=0x1, length 106: IP 10.10.10.1 > 10.10.10.11: ICMP echo reply, id 21073, seq 2784, length 64
15:02:57.345098 IP 10.14.0.2 > 10.14.0.3: GREv0, key=0x1, length 74: IP 169.254.192.1 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 50, authtype none, intvl 2s, length 20
Run Code Online (Sandbox Code Playgroud)

但是是否可以过滤例如仅封装的 icmp 数据包或任何其他任意表达式?

小智 5

由于这对我有用,因此更新此答案。

如果您想查看另一个 proto 中的一个 proto,则不能只在 match 中使用proto

protochain 的工作方式类似于proto,但它专门为此目的更改了下一次匹配的偏移量。

而是使用:

protochain GRE && proto ICMP
Run Code Online (Sandbox Code Playgroud)

来源:pcap-过滤器(7)


小智 5

例如,如果您的tcpdump版本不支持protochainDebian 8 中的版本,您可以手动计算位置,确定 GRE 隧道内 ip 数据包的协议号。

ICMP 的协议编号为 0x01。它存储在数据包的第 10 个字节中。GREv0 有 24 个字节,加上九个(因为从零开始计数)等于 33:

tcpdump -i any proto 47 and ip[33]=0x01
Run Code Online (Sandbox Code Playgroud)