Тариф успешно добавлен в корзину
В корзину
url image

Примеры использования tcpdump в Linux

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

Утилита tcpdump — один из популярных инструментов командной строки для мониторинга сети в Linux. Он помогает отладить сетевой трафик и провести его аудит. Как следует из названия, tcpdump перехватывает пакеты TCP (Transmission Control Protocol, протокол управления передачей) и выводит на экран или сохраняет в файл пригодный для анализа набор данных — дамп (dump, свалка). Такие анализаторы сетевого трафика называют снифферами.

Несмотря на относительную простоту и нетребовательность, эта программа обладает широким набором возможностей. Tcpdump может помочь распознать вредоносный трафик, обнаружить попытку несанкционированного входа, определить вероятную утечку данных или запуск DDoS-атаки и многое другое. Отдельно отметим, что tcpdump можно запускать на удалённых серверах, где графическая оболочка отсутствует.

Установка tcpdump

Программа tcpdump входит в состав всех основных дистрибутивов Linux, что максимально облегчает процесс установки.

В семействе Debian/Ubuntu достаточно выполнить команду в терминале:

$ sudo apt install tcpdump

В CentOS/Fedora команда установки выглядит так:

$ sudo dnf install tcpdump

Синтаксис tcpdump

Общий синтаксис команды tcpdump выглядит так:

# tcpdump [-i название_сетевого_интерфейса] [параметры] [фильтры]

В простейшем случае перехватить весь сетевой трафик можно, выполнив от имени суперпользователя команду tcpdump без параметров. Но если мы хотим проанализировать пакеты, проходящие через определённый сетевой интерфейс (адаптер), можно воспользоваться параметром -i. Название доступных интерфейсов можно узнать командой «tcpdump -D»:

Вывод доступных интерфейсов

Если опустить необязательный параметр -i, будет использован интерфейс по умолчанию (как правило, это первый адаптер в списке). Поэтому интерфейс лучше всегда указывать явно, например, «tcpdump -i ens3». В результате выполнения этой команды мы получим список заголовков пакетов примерно в таком виде:

Вывод списка заголовков пакетов

Если вам нужен более подробный вывод, к команде можно добавить параметр -v, -vv или -vvv. Это позволит получить, например, время жизни, идентификатор, общую длину и другие параметры пакета.

Другие полезные параметры:

  • -q — выводить минимум информации.
  • -n — не использовать имена хостов и служб. По умолчанию tcpdump пытается преобразовать (resolve) IP-адреса в имена доменов, а номера портов — в имена служб. Параметр -nn отключит также преобразование портов. Эту возможность можно использовать, чтобы снизить сетевой трафик при отладке сети за счёт исключения дополнительных обращений к системе доменных имён (DNS).
  • -a — преобразовать широковещательные адреса в доменные имена.
  • -tttt — использовать вывод временных меток с датой (по умолчанию выводится только метка времени Unix).
  • -t — не отображать метку времени в каждой строке.
  • -c <число строк> — ограничить набор строк в дампе указанным количеством.
  • -w — записать вывод в файл. Эту возможность мы подробно разберём позже.
  • -Z — пользователь, от имени которого записывается файл (по умолчанию сохранение происходит от имени пользователя tcpdump).

Подробнее обо всех параметрах можно узнать на странице tcpdump в официальной документации или вызвав справочную страницу командой «man tcpdump».

Захват пакетов с tcpdump

Перехват пакетов с tcpdump

На этом снимке экрана мы видим, что tcpdump перехватил 5 пакетов TCP/IP, проходящие через сетевой интерфейс ens3, и вывел каждый в отдельную строчку. Обратите внимание, что захват будет продолжаться до тех пор, пока мы не нажмём сочетание клавиш  Ctrl+C или не будет достигнуто число строк, указанное в параметре -c.

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

Понимание вывода tcpdump

Давайте для примера рассмотрим одну из строк вывода tcpdump:

09:10:56.157002 IP debian.48464 > firstvds.ru.http: Flags [S], seq 4254890747, win 64240, options [mss 1460,sackOK,TS val 1993676504 ecr 0,nop,wscale 7], length 0

В этой строке мы видим:

  • Метку времени Unix — 09:10:56.157002 (точное время, когда был захвачен пакет). Обратите внимание, что при использовании параметра -tttt будет также выведена дата захвата.
  • Протокол — IP. В этой строке выполнялся http-запрос к веб-странице. Утилита может выводить также пакеты, переданные, например, по протоколам udp, icmp, ip6 и так далее.
  • IP-адрес или имя хоста и номер порта отправителя пакета — debian.48464 (здесь tcpdump преобразовал локальный IP-адрес 10.0.2.15 в имя «debian»).
  • Имя хоста или IP-адрес и номер порта получателя пакета — firstvds.ru.http (http в данном случае означает запрос на порт 80).
  • Флаг TCP — Flags [S] (S — это сокращение от SYN, что означает начало соединения). Флагов может быть несколько, например [F.] означает закрытие соединения (FIN) и подтверждение полученного пакета (точка).
  • Абсолютный порядковый номер данных в пакете — seq 4254890747.
  • Размер окна — win 64240 (это просто количество байтов в приёмном буфере).
  • Параметры TCP — options [...].
  • Длина полезной нагрузки — length 0. Полезной нагрузкой считаются данные, переданные в пакете. Поскольку в данном случае выполняется запрос на начало соединения (SYN), данных в пакете нет.

Наш пример показывает успешное обращение к веб-странице, проблем с передачей пакетов нет.

Фильтрация пакетов

В примерах выше мы не использовали фильтры, поэтому tcpdump отобразил заголовки всех пакетов, прошедших через выбранный сетевой интерфейс. Это действительно похоже на свалку (dump). Но если мы знаем, какую конкретно информацию хотим получить, с помощью дополнительных параметров можно легко очистить вывод от лишнего мусора. Для этого утилита предоставляет удобные инструменты фильтрации:

  • По протоколу. Можно отдельно отслеживать пакеты tcpudpicmpipip6arp и другие, указав название протокола в команде. Например, «tcpdump -i ens3 tcp» выведет только TCP-пакеты: 
Фильтр tcpdump по протоколу
  • По IP-адресу, имени хоста или физическому (MAC) адресу. Для вывода информации только об одном хосте нужно указать его IP-адрес или имя после ключевого слова «host», например «tcpdump -i ens3 host firstvds.ru»:  
Фильтр tcpdump по хосту
  • По порту (port) или диапазону портов (portrange). Например, для перехвата пакетов, поступающих только на порт 80 (http), нужно добавить параметр «port 80»:
Фильтр tcpdump по порту
  • По отправителю (src) или получателю (dst). Например, «tcpdump -i ens3 dst firstvds.ru»:
Фильтр tcpdump по получателю пакетов

Конечно, если нам понадобится более точная изоляция пакетов, фильтры можно комбинировать. Для этого используются логические операторы AND (&&), OR (||) и NOT (!)

Например, «tcpdump -i ens3 src 10.0.2.15 and dst port 80» выведет только обращения с локального IP-адреса к любому хосту на порт 80:

Комбинированные фильтры tcpdump

Для исключения лишних протоколов, например, ICMP, можно добавить параметр «not icmp»:

# tcpdump -i ens3 not icmp

Если вам нужны более сложные правила фильтрации, для расстановки приоритетов можно использовать круглые скобки. Также можно воспользоваться дополнительными фильтрами: 

  • net для фильтрации по подсети, 

  • less или greater для ограничения размера пакетов и так далее.

При составлении сложных фильтров получившееся выражение рекомендуется заключить в кавычки, например:

# tcpdump -i ens3 "port 80 and (dst 10.0.2.3 or dst 10.0.2.15)"

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

Проверка содержимого пакета

До сих пор на приведённых снимках экрана мы видели только заголовки пакетов. Чтобы отобразить их содержимое, нужно добавить к команде параметр -X (вывод в шестнадцатеричном формате) или -A (в формате ASCII), например, «tcpdump -i ens3 -A src firstvds.ru and port 80»:

Вывод содержимого пакета tcpdump

Обратите внимание, что проанализировать таким способом содержимое пакета защищённого соединения (https) не получится. В этом примере на небезопасный запрос к порту 80 хост отвечает переадресацией (301 Moved Permanently) на защищённый адрес (Location: https://firstvds.ru/).

Подробнее о безопасном протоколе https можно прочесть в статье В чем разница между протоколами HTTP и HTTPS?.

Сохранение в файл

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

# tcpdump -i <интерфейс> -c <количество строк> -w <путь к файлу .pcap>

Это может быть удобно, например, для записи информации по расписанию, ночью или когда терминал недоступен.

Пример использования

Давайте проведём небольшой аудит безопасности и узнаем, к каким сетевым ресурсам обращается сервер под управлением Linux сразу после включения, когда терминал ещё недоступен. Конечно, можно было бы посмотреть сетевой трафик с помощью сниффера, установленного на отдельном узле в локальной сети. Но для этого нужно, во-первых, иметь такой узел, а во-вторых — настроить перенаправление соединений (проксирование). Сделать это подручными средствами не всегда легко, tcpdump позволяет решить задачу гораздо проще.

Для исследования возьмём несколько популярных дистрибутивов Linux: Debian/Ubuntu, CentOS/Fedora и AlmaLinux. В каждой операционной системе выполним минимальную установку и отключим все лишние службы и автообновления.

Для автоматического запуска команды tcpdump после включения сетевого интерфейса создадим файл службы /etc/systemd/system/tcp-dump.service (юнит) примерно такого содержания:

[Unit]
Description=TCP dump
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/tcpdump -i ens3 -c 1000 -w /tmp/tcpdump.pcap
[Install]
WantedBy=multi-user.target

 Обратите внимание, что работа с файлами служб требует прав суперпользователя (root).

Также стоит учесть, что путь к иcполняемому файлу tcpdump может быть другим, этот момент лучше проверить командой «which tcpdump»:

Вывод пути к иcполняемому файлу

После сохранения файла активируем службу командой systemctl enable tcp-dump.service и перезагрузим систему. Теперь можно расшифровать полученный файл tcpdump.pcap с помощью того же tcpdump с параметром -r или в сниффере с графическим интерфейсом Wireshark. Давайте взглянем на результаты (для краткости повторяющиеся адреса исключены из вывода).

1. Debian

Вывод команды tcpdump во время начальной загрузки Debian

Здесь мы видим технические обращения к узлам сети по протоколам IGMP (Internet Group Management Protocol, протокол управления группами интернета), mDNS (Multicast DNS, многоадресный протокол DNS), UDP (User Datagram Protocol, протокол пользовательских датаграмм) и внешний запрос NTP (Network Time Protocol, протокол сетевого времени).

2. Fedora

Вывод команды tcpdump во время начальной загрузки Fedora

В целом набор служб примерно тот же, но обратите внимание, что система дополнительно выполняет определение местоположения (запросом к службе геолокации beacondb.net), а также совершает больше запросов к серверам NTP, расположенным в разных странах.

3. AlmaLinux

Вывод команды tcpdump во время начальной загрузки AlmaLinux

AlmaLinux — дистрибутив, созданный на основе Red Hat Enterprise Linux (RHEL) как ответ на прекращение поддержки дистрибутива CentOS компанией Red Hat. Как видите, эта операционная система ведёт себя гораздо скромнее и выполняет внешние запросы только к региональным сетевым ресурсам.

С точки зрения конфиденциальности данных стоит отметить, что обращение серверов или рабочих станций к иностранным сетевым службам —  один из поводов для проведения аудита трафика и проверки настроек оборудования.

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

 

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

Этот материал был полезен?

Скидка новым клиентам
Закажите сервер сегодня и получите скидку на первый месяц аренды!