我可以用下面的方法很简单的让 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
但是,是否可以过滤例如仅封装的 icmp 数据包或任何其他任意表达式?
答案1
因为这对我有用,所以更新了这个答案。
如果你想查看另一个原型中的原型,你不能只使用原始在比赛中。
原链类似于原始,但为了这个目的,它特意改变了下一场比赛的偏移量。
改为使用:
protochain GRE && proto ICMP
来源:pcap-filter(7)
答案2
如果您的tcpdump
版本不支持protochain
(例如 Debian 8 中的版本),您可以手动计算确定 GRE 隧道内 ip 数据包的协议号的位置。
ICMP 的协议号为 0x01。它存储在数据包的第 10 个字节中。GREv0 有 24 个字节,加上 9 个(因为从零开始计数)等于 33:
tcpdump -i any proto 47 and ip[33]=0x01