Утилита tcpdump используется для захвата сетевого трафика в Linux и может пригодиться администраторам для диагностики сетевых подключений.
Однако если использовать команду без каких-либо опций, будет сложно отследить нужную информацию в потоке выводимых данных. К счастью, tcpdump позволяет фильтровать вывод команды, отлавливая только те пакеты, которые нас интересуют. В данной статье мы кратко расскажем о tcpdump и приведем примеры использования утилиты для захвата сетевого трафика в Linux.
Как установить tcpdump
С большой долей вероятности tcpdump уже предустановлен в вашем дистрибутиве. Если это не так, ПО можно установить с помощью менеджера пакетов.
Для установки tcpdump в Ubuntu, Debian и подобных операционных системах:
sudo apt install tcpdump
Установить tcpdump в дистрибутивах семейства RHEL можно командой:
sudo dnf install tcpdump
Установка в Arch Linux и его производных происходит следующим образом:
sudo pacman -S tcpdump
Примеры использования tcpdump
tcpdump требует привилегий администратора, примеры далее будут приведены для пользователя root. Вы также можете использовать sudo для выполнения данных команд.Самая простая форма команды – ее запуск без дополнительных опций:
tcpdumpЕсли, как в примере выше, не указан интерфейс для захвата трафика, tcpdump выберет его автоматически.
Вывод содержимого трафика будет происходить до тех пор, пока выполнение команды не будет прервано. Завершить процесс можно комбинацией клавиш Ctrl + C.
Если на машине, на которой проводится диагностика, более одного интерфейса, надежнее указать нужный интерфейс вручную. Узнать доступные интерфейсы можно командой с ключом -D:
tcpdump -D
Пример вывода команды:
1.nic2 [Up, Running, Connected]
2.vlan20 [Up, Running, Connected]
3.vlan30 [Up, Running, Connected]
4.vmbr0 [Up, Running, Connected]
5.any (Pseudo-device that captures on all interfaces) [Up, Running]
6.lo [Up, Running, Loopback]
7.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless]
8.nflog (Linux netfilter log (NFLOG) interface) [none]
9.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
10.dbus-system (D-Bus system bus) [none]
11.dbus-session (D-Bus session bus) [none]
12.nic1 [none, Disconnected]Помимо одиночных интерфейсов, также существует псевдоинтерфейс any, позволяющий захватывать трафик со всех интерфейсов одновременно. Для указания интерфейса используется ключ -i, например, для захвата трафика с интерфейса nic2 команда будет выглядеть следующим образом:
tcpdump -i nic2
По умолчанию tcpdump ограничивает объем выводимой информации о захватываемых пакетах. Повысить “вербозность” вывода можно флагами -v, -vv и -vvv:
tcpdump -i nic2 -vv
Если вы не хотите бесконечно захватывать пакеты, вы можете использовать ключ -c для указания количества пакетов. Программа автоматически завершит выполнение после захвата указанного количества пакетов. Например, следующая команда выведет информацию о первых 10 пакетах:
tcpdump -c 10
По умолчанию tcpdump пытается выполнить DNS-запросы для адресов в выводе, однако в некоторых случаях это может быть невозможно или не нужно. В таком случае отключить данное поведение можно ключом -n:
tcpdump -n
Если вы хотите сохранить трафик в файл вместо вывода на экран, можно использовать как обычное перенаправление вывода:
tcpdump > tcpdump_out.txt
Так и запись в файл .pcap. В последнем случае файл нельзя прочитать обычным текстовым редактором:
tcpdump -n -w dump.pcap
Для последующего анализа трафика используйте ключ -r и путь до файла:
tcpdump -r dump.pcap
Как интерпретировать вывод tcpdump для TCP-пакета
Каждый перехваченный пакет в выводе tcpdump записывается в виде новой строки. Пример подобной строки:
20:24:38.696750 IP 45.227.46.47.49833 > 10.0.30.3.443: Flags [S], seq 2195959688, win 64240, options [mss 1300,nop,wscale 8,nop,nop,sackOK], length 0
Разберем эту строку:
20:24:38.696750– время, в которое был захвачен пакет.IP 45.227.46.47.49833– IP и порт источника (source) пакета.10.0.30.3.443– IP и порт назначения (destination) пакета.Flags [S]– флаги TCP (SYN, ACK, RST и прочие).[S]в данном случае –SYN.seq 2195959688– порядковый номер.win 64240– размер окна в байтах.options [mss 1300,nop,wscale 8,nop,nop,sackOK]– дополнительные опции.length 0– размер данных.
Содержание строки может изменяться в зависимости от установленных флагов. Подробнее о структуре пакетов TCP вы можете прочитать тут.
Фильтрация пакетов в tcpdump
Одна из наиболее удобных функций tcpdump – способность фильтровать интересующий нас трафик, будь то по интерфейсу (как обсуждалось ранее), номеру порта, протоколу или хосту. Без этих фильтров было бы крайне затруднительно найти нужную информацию в огромном количестве информации.
Несмотря на его название, tcpdump позволяет анализировать не только TCP-трафик. К примеру, данная команда позволяет нам увидеть UDP-трафик:
tcpdump -u udp
А в этом примере – ICMP:
tcpdump -u icmp
Помимо названия протокола, можно также использовать его номер – например, для ICMP это 1:
tcpdump -u proto 1
Полный список протоколов и соответствующих им номеров вы можете узнать, например, в этой статье на Wikipedia.
Для фильтрации трафика по определенному IP-адресу можно использовать фильтр host в комбинации с ключом -n. К примеру, чтобы отфильтровать трафик, относящийся к хосту 1.1.1.1:
tcpdump -n host 1.1.1.1Если же нужно просмотреть трафик для определенной сети, а не просто для одного адреса, вы можете использовать фильтр net. Например, следующая команда покажет трафик, относящийся к сети 10.0.0.0/24:
tcpdump -n net 10.0.0Фильтры port и portrange дают возможность отсеять пакеты по порту или их диапазону соответственно. К примеру, эта команда покажет трафик, относящийся к порту 443:
tcpdump -n port 443
Для трафика на портах 20–22 команда будет выглядеть так:
tcpdump -n portrange 20-22
tcpdump также позволяет применить фильтр к источнику или конечной цели трафика с помощью src, dst и src and dst. Например, для вывода пакетов, отправленных к адресу 8.8.8.8:
tcpdump -n dst host 8.8.8.8Комбинирование фильтров
Описанные выше фильтры можно также использовать с логическими выражениями – “и” (and/&&), “или” (or/||) и “не” (not,!). Таким образом можно точечно фильтровать нужный нам трафик.
Например, чтобы вывести информацию о пакетах, отправленных к серверу 9.9.9.9 на udp-порт 53, можно использовать следующую команду:
tcpdump -n dst host 9.9.9.9 and udp port 53
Пример вывода:
sudo tcpdump -n dst host 9.9.9.9 and udp port 53
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wlp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
23:44:49.863675 IP 10.0.10.15.39214 > 9.9.9.9.domain: 25591+ [1au] A? google.com. (51)
^C
1 packet captured
1 packet received by filter
0 packets dropped by kernelЗаключение
Утилиту tcpdump часто используют, когда стандартные инструменты диагностики бессильны и логи молчат – она подходит для фильтрации трафика с различными фильтрами, позволяющими сделать выборку пакетов более интеллектуальной.
В данной статье мы кратко рассказали о tcpdump и ее основных параметрах. Умение использовать эту утилиту может значительно упростить диагностику сетевых проблем.
Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем сообществе в Telegram.