Я могу попросить 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 или любое другое произвольное выражение?
Поскольку это было полезно для меня, обновил этот ответ.
Если вы хотите посмотреть на прототип внутри другого прототипа, вы не можете просто использовать прото в матче.
протоцепь работает как прото, однако он специально изменяет смещение для следующего совпадения именно для этой цели.
Вместо этого используйте:
protochain GRE && proto ICMP
Источник: pcap-filter (7)
Если ваш tcpdump
версия не поддерживает protochain
как, например, в Debian 8, вы можете вручную вычислить позицию, где определяется номер протокола пакета ip в туннеле GRE.
ICMP имеет номер протокола 0x01. И хранится в 10-м байте пакета. GREv0 имеет 24 байта, плюс девять (потому что один считается с нуля) равно 33:
tcpdump -i any proto 47 and ip[33]=0x01
tcpdump использует синтаксис фильтра pcap
Фильтр XX в пределах YY;
proto YY && proto XX
ICMP внутри GRE:
proto GRE && proto ICMP