Фильтрация 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

Общий размер пакета 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.

Связанный контент