Основы Tcpdump

Я думаю, что наиболее важным элементом для отладки сетевой проблемы является инструмент захвата пакетов или сниффер, и наиболее распространенным в дистрибутивах Linux является tcpdump.

Tcpdump выводит описание содержимого пакетов в сетевом интерфейсе, соответствующее выражению; описанию предшествует отметка времени, по умолчанию печатаемая в виде часов, минут, секунд и долей секунды с полуночи.

Основы

Захват всех пакетов с определенного интерфейса (-i имя_интерфейса или идентификатор)

Введите ip link show up, чтобы просмотреть текущие интерфейсы вашей системы, например:

$ ip link show up
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:db:88:56 brd ff:ff:ff:ff:ff:ff
Затем, для этого примера, вот как захватывать пакеты с интерфейса Ethernet enp0s3:
$ sudo tcpdump -i enp0s3

Другой метод заключается в использовании tcpdump для получения списка интерфейсов с помощью команды: tcpdump -D, это может быть полезно в системах, в которых нет другой команды для их перечисления:

$ sudo tcpdump -D
1.enp0s3 [Up, Running, Connected] 2.any (Pseudo-device that captures on all interfaces) [Up, Running] 3.lo [Up, Running, Loopback] 4.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless] 5.nflog (Linux netfilter log (NFLOG) interface) [none] 6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none] 7.dbus-system (D-Bus system bus) [none] 8.dbus-session (D-Bus session bus) [none]

Затем можно использовать имя или номер интерфейса с -i аргументом, например:

$ sudo tcpdump -i 1 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on enp0s3, (...)

Пожалуйста, обратите внимание, что для ясности я удалил фильтр интерфейса в приведенных ниже примерах. Но во многих ситуациях лучше указать интерфейс, который вы хотите “слушать”, в дополнение к другим фильтрам.

 

Захват пакетов и запись в файл (-w /path/to/file) или считывать из файла (-r /path/to/file)

Tcpdump также можно запустить с -w флагом, который заставляет его сохранять данные пакета в файл для последующего анализа. Например, для захвата пакетов из определенного интерфейса и записи их в файл (рекомендуется использовать расширение .pcap):

$ sudo tcpdump -w test.pcap

Затем вы можете прочитать этот файл с помощью приложения, такого как Wireshark, или также с помощью tcpdump. Для этого мы можем использовать  флаг, который позволяет tcpdump считывать данные из сохраненного файла пакетов, а не из сетевого интерфейса:

$ sudo tcpdump -r test.pcap

Захват пакетов и запись в несколько файлов (-w -C-W) в “обновляющемся” буфере

То filecount  (-W) опция, используемая в сочетании с file_size  (-C) и write (-w) опции, позволяющие записывать несколько файлов заранее определенного максимального размера. Затем, в конце записи последнего файла, tcpdump начнет перезаписывать файлы с самого начала, создавая «обновляющийся» буфер из n файлов.

Давайте возьмем пример, записав 10 файлов размером около 1 Мбайт каждый. Потому что единицы измерения размера файла составляют миллионы байт: 1’000’000 байт, а не 1’048’576 байт:

$ sudo tcpdump -C 1 -W 10 -w test.pcap

Кроме того, tcpdump будет называть файлы с достаточным количеством завершающих 0, чтобы поддерживать максимальное количество файлов, позволяя их правильно сортировать.

 

Захват пакетов и запись в несколько файлов, создаваемых каждый x раз, с отметкой времени в имени файла (-G -w)

Вот пример создания файла захвата каждые 10 секунд, таким образом, 6 файлов захвата в минуту, неограниченно, с Месяц – День – Час – Минута – Секунды временной меткой в имени файла:

$ sudo tcpdump -G 10 -w test-%m-%d-%H-%M-%S.pcap

В этом случае параметр -G равен 10 секундам. Поэтому каждые 10 секунд у нас будет новый файл.

Пожалуйста, обратите внимание, что если мы не укажем параметры Месяца и Дня, tcpdump перезапишет файлы через 24 часа.

 

Чтение из нескольких файлов (-V /path/to/file)

Он также может быть запущен с помощью  флага, который заставляет его считывать список сохраненных файлов пакетов. Во всех случаях tcpdump будет обрабатывать только пакеты, соответствующие выражению.

Для этого, во-первых, вам необходимо создать плоский файл, включающий файлы .pcap, которые вы хотите прочитать. Например, если мои файлы .pcap: test.pcap0, test.pcap1, test.pcap2… test.pcap9. Я создаю файл .txt, подобный этому:

test.pcap0
test.pcap1
test.pcap2
test.pcap3
test.pcap4
test.pcap5
test.pcap6
test.pcap7
test.pcap8
test.pcap9

И тогда я смогу читать все сразу с:

$ sudo tcpdump -V test.txt

Конечно, цель чтения нескольких файлов-отфильтровать содержимое для поиска чего-то конкретного. Ниже мы увидим различные фильтры.

 

Захват пакетов с определенного IP-адреса источника или назначения (host address_or_fqdn)

$ sudo tcpdump host 192.168.1.1 $ sudo tcpdump host 2001:4860:4860::8888 

Захват пакетов, отфильтрованных по IP-адресу источника или назначения (src адрес или dst адрес)

$ sudo tcpdump src 192.168.1.1
$ sudo tcpdump dst 2001:4860:4860::8888

Захват пакетов, отфильтрованных по IP-адресу источника или назначения сети (net network)

$ sudo tcpdump net 192.168.0.0/24 $ sudo tcpdump net 2001:4860:4860::/64 

Захват пакетов без преобразования адресов хостов, портов или протоколов в имена (-n)

По умолчанию tcpdump преобразует протоколы в имена, вот пример:

$ sudo tcpdump dst port 80
14:17:37.124655 IP manjaro-xfce-20.local.32812 > zrh04s15-in-f4.1e100.net.http: Flags [S], seq 1529204080, win 64240, options [mss 1460,sackOK,TS val 766022782 ecr 0,nop,wscale 7], length 0 14:17:37.125833 IP manjaro-xfce-20.local.32812 > zrh04s15-in-f4.1e100.net.http: Flags [.], ack 64192002, win 64240, length 0 14:17:37.126166 IP manjaro-xfce-20.local.32812 > zrh04s15-in-f4.1e100.net.http: Flags [P.], seq 0:78, ack 1, win 64240, length 78: HTTP: GET / HTTP/1.1 
$ sudo tcpdump -n dst port 80 
14:17:13.543893 IP 10.0.2.15.32808 > 172.217.168.68.80: Flags [S], seq 2815315033, win 64240, options [mss 1460,sackOK,TS val 765999201 ecr 0,nop,wscale 7], length 0 14:17:13.544509 IP 10.0.2.15.32808 > 172.217.168.68.80: Flags [.], ack 64064002, win 64240, length 0 14:17:13.544616 IP 10.0.2.15.32808 > 172.217.168.68.80: Flags [P.], seq 0:78, ack 1, win 64240, length 78: HTTP: GET / HTTP/1.1

Захват пакетов, отфильтрованных по номеру порта или диапазону портов (port port_number | portrange port_number-port_number) – может сочетаться с dst или src

Если мы не указываем порт источника (src) или назначения (dst), tcpdump будет захватывать оба направления.

$ sudo tcpdump port 443
$ sudo tcpdump dst port 443
$ sudo tcpdump src portrange 1024-65535

Захват пакетов, отфильтрованных по протоколу (icmp, tcp, udp, ip, ip6)

Мы можем фильтровать пакеты icmp, udp, tcp, а также пакеты только IPv4 (ip) или IPv6 (ip6).:

$ sudo tcpdump icmp
$ sudo tcpdump udp
$ sudo tcpdump tcp
$ sudo tcpdump ip
$ sudo tcpdump ip6

Захват пакетов и выход после n пакетов (-c count)

Выйдет после получения требуемого кол-ва пакетов.

$ sudo tcpdump -c 10
 (...)
 10 packets captured
 17 packets received by filter  0 packets dropped by kernel $

Захват пакетов и печать данных каждого пакета (-X)

Для печати данных каждого пакета (за вычетом заголовка уровня канала) в шестнадцатеричном формате и ASCII.

Вот пример, с пингами ICMP до 8.8.8.8, включая конкретное содержимое в шаблоне данных ICMP:

$ ping -p "cafe" 8.8.8.8 
PATTERN: 0xcafe
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 octets de 8.8.8.8 : icmp_seq=1 ttl=63 temps=4.10 ms 64 octets de 8.8.8.8 : icmp_seq=2 ttl=63 temps=4.06 ms (...)

И в результат tcpdump увидим много кофе) :

$ sudo tcpdump -X icmp
(...)
11:00:06.783376 IP manjaro-xfce-20.local > dns.google: ICMP echo request, id 3, seq 1, length 64 0x0000: 4500 0054 8110 4000 4001 9d7a 0a00 020f [email protected]@..z.... 0x0010: 0808 0808 0800 b1ea 0003 0001 96d4 c160 ...............` 0x0020: 0000 0000 06f4 0b00 0000 0000 cafe cafe ................
0x0030: cafe cafe cafe cafe cafe cafe cafe cafe ................
0x0040: cafe cafe cafe cafe cafe cafe cafe cafe ................
0x0050: cafe cafe

Опция  (в нижнем регистре) выводится только с шестнадцатеричной частью:

$ sudo tcpdump -x icmp
(...)
11:08:54.070651 IP manjaro-xfce-20.local > dns.google: ICMP echo request, id 5, seq 1, length 64 0x0000: 4500 0054 d4c5 4000 4001 49c5 0a00 020f 0x0010: 0808 0808 0800 dbc6 0005 0001 a6d6 c160 0x0020: 0000 0000 d713 0100 0000 0000 cafe cafe
0x0030: cafe cafe cafe cafe cafe cafe cafe cafe
0x0040: cafe cafe cafe cafe cafe cafe cafe cafe
0x0050: cafe cafe

Опция , выдает вывод только с частью ASCII:

$ sudo tcpdump -A icmp

Пакеты захвата, отфильтрованные по размеру (less | greater size)

Если вы ищете пакеты определенного размера, вы можете использовать термины “меньше” или “больше”. Вот пример:

$ ping 8.8.8.8 -s 1
PING 8.8.8.8 (8.8.8.8) 1(29) bytes of data. 9 bytes from 8.8.8.8: icmp_seq=1 ttl=63 9 bytes from 8.8.8.8: icmp_seq=2 ttl=63

Здесь мы должны учитывать размер заголовков: Ethernet без CRC (14 байт) + IPv4 (20 байт) + ICMP (8 байт). Таким образом, этот пакет пинга ICMP с 1 байтом данных (-s 1) в общей сложности составит 43 байта. Давайте попробуем это увидеть:

$ sudo tcpdump -i 1 less 43
(...)
11:17:30.051339 IP manjaro-xfce-20.local > dns.google: ICMP echo request, id 10, seq 52, length 9 11:17:31.055479 IP manjaro-xfce-20.local > dns.google: ICMP echo request, id 10, seq 53, length 9

В этот момент вы должны подумать “Но если пакет состоит из 43 байт, то почему Меньше?!?

На самом деле:

  • Меньше length, эквивалентно “less than or equal to” length (<=)
  • более length, эквивалентно “greater than or equal to” length (>=)

 

Захват пакетов, отфильтрованных по MAC-адресу (ether host mac) и отобразить заголовок уровня ссылки (-e)

Мы можем использовать ключевое слово для фильтрации захвата трафика на один MAC-адрес или для широковещательных передач, например:

$ sudo tcpdump ether host ff:ff:ff:ff:ff:ff 08:40:48.622995 ARP, Request who-has 10.0.2.20 tell manjaro-xfce-20.local, length 28
08:40:49.696943 ARP, Request who-has 10.0.2.20 tell manjaro-xfce-20.local, length 28

Здесь я запустил захват и попытался пропинговать IP-адрес в той же сети, чтобы перехватить широковещательные ARP-пакеты.

Но тогда мы сможем использовать -e для печати заголовка уровня ссылки в каждой строке дампа:

$ sudo tcpdump ether host ff:ff:ff:ff:ff:ff -e
08:46:06.625825 08:00:27:db:88:56 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 10.0.2.21 tell manjaro-xfce-20.local, length 28

С -n вариант, его немного легче читать:

$ sudo tcpdump ether host ff:ff:ff:ff:ff:ff -en
08:47:53.609426 08:00:27:db:88:56 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.2.21 tell 10.0.2.15, length 28

Более расширенные опции и фильтры

Комбинируйте фильтры (and, or, not)

Возможность использовать вышеуказанные фильтры-это одно, но реальная сила tcpdump заключается в возможности комбинировать эти параметры, чтобы изолировать то, что вы ищете. Для этого мы можем использовать логические функции “and“, “or” и “not“. Мы можем использовать круглые скобки (менее рекомендуемые), кавычки или двойные кавычки в качестве разделителей.

$ sudo tcpdump ip6 and tcp
$ sudo tcpdump src portrange 1024-65535 and dst port 443
$ sudo tcpdump tcp and \( src portrange 1024-65535 and dst port 443 \)
$ sudo tcpdump tcp and 'src portrange 1024-65535 and dst port 443'
$ sudo tcpdump tcp and "src portrange 1024-65535 and dst port 443"

Добавление подробностей к выводу (-v, -vv, -vvv)

Tcpdump имеет три уровня подробностей. Вы можете добавить больше подробностей, добавив дополнительную букву “v” в параметры командной строки:

При разборе и печати, опция -v выдает несколько более подробный вывод. Например, печатается время жизни, идентификация, общая длина и параметры в IP-пакете. Также позволяет проводить дополнительные проверки целостности пакетов, такие как проверка контрольной суммы заголовка IP и ICMP. При записи в файл с -w опцией и в то же время считывание из файла с опцией, сообщайте stderr один раз в секунду о количестве захваченных пакетов. В Solaris, FreeBSD и, возможно, в других операционных системах это периодическое обновление в настоящее время может привести к потере захваченных пакетов на пути от ядра к tcpdump.

Опция -vv, еще более подробный вывод. Например, дополнительные поля печатаются из пакетов ответов NFS, а пакеты SMB полностью декодируются.

Опция -vvv, еще более подробный вывод. Например, telnet sb … SE опции печатаются полностью. Параметры Telnet с -X также печатаются в шестнадцатеричном формате.

 

Укажите размер захвата каждого захваченного пакета (-s snaplen)

По умолчанию tcpdump будет захватывать 262144 байта. Однако в некоторых ситуациях вам может не потребоваться фиксировать длину пакета по умолчанию. Если вам нужно уменьшить размер снимка ниже значения по умолчанию, вам следует ограничить snaplen до наименьшего числа, которое будет содержать интересующую вас информацию о протоколе. Установка snaplen значение 0 устанавливает значение по умолчанию 262144 для обеспечения обратной совместимости с последними более старыми версиями tcpdump.

Например, если мы хотим захватить только первые 14 байтов пакетов:

$ sudo tcpdump -s 14

Различные варианты временных меток (-t, -tt, -ttt, -tttt, -ttttt)

По умолчанию tcpdump будет отображать в качестве метки времени для каждого пакета местное время системы. Но мы можем это изменить:

  • -t – НЕ печатайте метку времени в каждой строке дампа.
  • -tt – Выведите метку времени в секундах с 1 января 1970 00:00:00 UTC и доли секунды с того времени на каждой строке сброса.
  • -ttt – Печать дельты (разрешение микросекунды или наносекунды в зависимости от  –time-stamp-precision опции) между текущей и предыдущей строками в каждой строке дампа. По умолчанию используется разрешение в микросекундах.
  • -tttt – Выведите метку времени в виде часов, минут, секунд и долей секунды с полуночи, перед датой, в каждой строке дампа.
  • -ttttt – Печать дельты (разрешение микросекунды или наносекунды в зависимости от –time-stamp-precision опции) между текущей и первой строкой в каждой строке сброса. По умолчанию используется разрешение в микросекундах.

В некоторых ситуациях полезно видеть разницу во времени между двумя пакетами, например, между запросом базы данных и ответом.

 

Определите тип пакетов на выходе (флаг TCP)

Из приведенного ниже примера мы можем сказать, что пакет является SYN-ACK пакетом. Мы можем определить это по Flags [S.] вывода:

$ sudo tcpdump -tn src port 80 IP 172.217.168.68.80 > 10.0.2.15.32820: Flags [S.], seq 70400001, ack 171581542, win 65535, options [mss 1460], length 0

Разные типы пакетов имеют разные флаги:

  • [S] – SYN
  • [S.] – SYN-ACK
  • [.] – No Flag Set
  • [P] – PSH (Push Data)
  • [F] – FIN (Finish)
  • [R] – RST (Reset)

Вы можете найти больше TCP флагов здесь: https://www.howtouselinux.com/post/tcp-flags

Grep tcpdump output (-l)

Опция -l означает “вывод для чтения строк”, она позволяет вам видеть трафик по мере его захвата и помогает использовать такие команды, как grep. Например:

$ sudo tcpdump -vvAls0 | grep 'GET'

Как вы можете видеть, мы обычно сочетаем это с -s0 чтобы обязательно все запечатлеть. См. (-s snaplen) чуть выше.

Еще более сложная фильтрация

Пример поиска по заголовку TCP

С помощью tcpdump мы можем, например, выполнять поиск в различных полях заголовка TCP. Во-первых, давайте взглянем на заголовок TCP (источник Википедия):

Теперь предположим, что мы хотим отфильтровать все пакеты с установленным флагом ACK. Итак, сначала мы указываем байт TCP с помощью TCP[byte_number], так что TCP[13] в данном случае. Смотрите номер байта 13 для флагов после 4 бит “смещения данных” и 3 бит “зарезервировано».

Затем мы можем указать местоположение в этом байте. Справа налево: FIN = 0, SYN = 2, RST = 4, PSH = 8, ACK = 16 и т. Д. (да, мы указываем это в десятичной дроби). Поэтому, если мы хотим отфильтровать ACK, мы пишем его так: TCP[13] и 16.

Итак, наконец, если мы хотим видеть все пакеты с установленным флагом ACK (отличным от 0), мы можем сделать:

$ sudo tcpdump 'tcp[13] & 16 != 0'

Пример поиска по IP-заголовку

Мы можем сделать то же самое с заголовком IP, например, для фильтрации на основе значения ToS или DSCP.

Поле ToS является вторым байтом IP-заголовка, так что байт номер 1, потому что мы начинаем отсчет с 0. Таким образом, мы можем исследовать IP[1] для значений ToS/DSCP.

Итак, чтобы найти любой пакет с ненулевым значением ToS или DSCP, мы можем сделать следующее:

$ sudo tcpdump -v -n ip and ip[1]!=0

Затем более сложным вариантом использования является поиск определенного значения DSCP, допустим, мы хотим получить все пакеты с тегом DSCP ускоренной пересылки (DSCP EF), например, голосовые пакеты в корпоративной сети.

Во-первых, мы должны запомнить некоторые основные правила QoS: значение DSCP EF = 46 в десятичной системе счисления = 101110 в двоичной системе счисления.

К этому мы должны добавить два первых бита ECN, чтобы построить весь байт ToS: = 10111000 = десятичное значение 184 = 0xB8 в шестнадцатеричном формате.

Затем, чтобы отфильтровать это значение, мы могли бы сделать:

$ sudo tcpdump -v -n 'ip and (ip[1] == 184)'

Чтобы сделать это проще, без необходимости конвертировать DSCP 46 в ToS 184, давайте воспользуемся трюком, чтобы игнорировать первые два бита и искать точное значение DSCP:

$ sudo tcpdump -v -n 'ip and (ip[1] & 252) >> 2 == 46'

Итак, что же там произошло?

252-это десятичное значение для 11111100, это означает игнорировать значение битов ECN с “побитовым И”, записанным здесь с “&”. Это также работает и без этого, но с этим мы обязательно получим все пакеты, независимо от значения битов ECN.

Затем “>>” должно исключить два первых бита ECN из значения. Чтобы “сдвинуть их вправо”, если хотите. Таким образом, мы можем использовать правильное значение DSCP в десятичной или шестнадцатеричной форме:

$ sudo tcpdump -v -n 'ip and (ip[1] & 252) >> 2 == 0x2e'

Мы можем проверить с помощью ping до 8.8.8.8 со значением DSCP, равным EF (DSCP 46 / 101110 == ToS 184 / 10111000):

$ ping 8.8.8.8 -Q 184
PING 8.8.8.8 (8.8.8.8) 56(84) octets de données. 64 octets de 8.8.8.8 : icmp_seq=1 ttl=118 temps=3.79 ms 64 octets de 8.8.8.8 : icmp_seq=2 ttl=118 temps=4.09 ms 64 octets de 8.8.8.8 : icmp_seq=3 ttl=118 temps=3.85 ms $ sudo tcpdump -i 1 -t -v -n 'ip and (ip[1] & 252) >> 2 == 46'
IP (tos 0xb8, ttl 64, id 51956, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.2.15 > 8.8.8.8: ICMP echo request, id 15, seq 54, length 64 IP (tos 0xb8, ttl 63, id 10245, offset 0, flags [DF], proto ICMP (1), length 84) 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 15, seq 54, length 64 IP (tos 0xb8, ttl 64, id 52091, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.2.15 > 8.8.8.8: ICMP echo request, id 15, seq 55, length 64 The same in hex: $ sudo tcpdump -i 1 -t -v -n 'ip and (ip[1] & 0xfc) >> 2 == 0x2e'
IP (tos 0xb8, ttl 64, id 57009, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.2.15 > 8.8.8.8: ICMP echo request, id 15, seq 86, length 64 IP (tos 0xb8, ttl 63, id 10277, offset 0, flags [DF], proto ICMP (1), length 84) 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 15, seq 86, length 64 IP (tos 0xb8, ttl 64, id 57283, offset 0, flags [DF], proto ICMP (1), length 84)
10.0.2.15 > 8.8.8.8: ICMP echo request, id 15, seq 87, length 64

Повседневные примеры

 

Проверка HTTP-трафика

Поиск HTTP User Agents

$ sudo tcpdump -vvAls0 | grep 'User-Agent:'
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36

Cleartext GET Requests

$ sudo tcpdump -vvAls0 | grep 'GET'
 GET /favicon.ico HTTP/1.1

Поиск HTTP Host Headers

$ sudo tcpdump -vvAls0 | grep 'Host:'
Host: www.google.com

Поиск HTTP Cookies

$ sudo tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'
Cookie: _ga=GA1.2.1819519503.1611300810; _fbp=fb.1.1611300810366.1600009966

Извлечение HTTP Request URL’s

$ sudo tcpdump -vnls0 | egrep -i "POST /|GET /|Host:"

Фильтрация по типу трафика

Поиск SSH соединений

$ sudo tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'

Примечание: отработает независимо от порта, потому что он получает ответ на баннер.

Поиск DNS трафика

$ sudo tcpdump -vvAs0 port 53

Поиск FTP трафика

$ sudo tcpdump -vvAs0 port ftp or ftp-data

Поиск NTP трафика

$ sudo tcpdump -vvAs0 port 123

 

Фильтрация по TCP флагу

Отобразить все ACK пакеты

$ sudo tcpdump 'tcp[13] & 16 != 0'

Отобразить все PSH пакеты

$ sudo tcpdump 'tcp[13] & 8 != 0'

Отобразить все RST пакеты

$ sudo tcpdump 'tcp[13] & 4 != 0'

Отобразить все SYN пакеты

$ sudo tcpdump 'tcp[13] & 2 != 0'

Отобразить все FIN пакеты

$ sudo tcpdump 'tcp[13] & 1 != 0'

Отобразить все SYN-ACK пакеты

$ sudo tcpdump 'tcp[13] = 18'

 

QoS Фильтры

Показывать все IP-пакеты с ненулевым полем TOS (одно байтовое поле TOS имеет смещение 1 в IP-заголовке)

$ sudo tcpdump -v -n ip and ip[1]!=0

Показать все IP-пакеты со значением DSCP EF (десятичное число 46)

$ sudo tcpdump -n -vvv 'ip and (ip[1] & 0xfc) >> 2 == 46'

Разное

Показывать пакеты эхо-запроса и эхо-ответа icmp

$ sudo tcpdump -n icmp and 'icmp[0] = 8 or icmp[0] = 0'

То же самое, но для получения любых пакетов ICMP, кроме ping и ping-reply:

$ sudo tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

Показывать пакеты ARP, включая MAC-адрес

$ sudo tcpdump -vv -e -nn ether proto 0x0806

Поиск паролей открытым текстом

$ sudo tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '

Захват пакетов и запись в несколько файлов, создаваемых каждые x раз, с отметкой времени в имени файла

Вот пример создания файла записи каждые 10 секунд, таким образом, 6 файлов записи в минуту, неограниченно, с отметкой времени Месяц – День – Час – Минута – Секунды в имени файла:

$ sudo tcpdump -G 10 -w test-%m-%d-%H-%M-%S.pcap

В этом примере параметр -G равен 10 секундам. Поэтому каждые 10 секунд у нас будет новый файл. Пожалуйста, обратите внимание, что если мы не укажем параметры Месяца и Дня, tcpdump перезапишет файлы через 24 часа.

Подробнее

Официальный сайт tcpdump

Онлайн — версия справочной страницы tcpdump

Добавить комментарий