Я хочу сузить свой 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
Общий размер пакета Ethernet
В соответствии сpcap-фильтр(7), вы можете использовать следующие условия:
less length
, эквивалентноlen <= length
greater length
, эквивалентноlen >= length
Судя по примерам, вы также должны иметь возможность использовать , но это не документировано.
len == length
Обратите внимание, что сюда входят заголовки канального и сетевого уровней (т. е. все, что было захвачено), поэтому пустой TCP ACK будет иметь поле «общая длина» IP, равное 60, но будет рассматриваться как имеющий в общей сложности 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.TotalLength = IP.Header[20] + UDP.Header[8] + UDP.Payload[1316]
вы получаете фильтр ip[2:2] == 1344
.