tcpdump и tshark: захват и анализ пакетов в CLI
При отладке сетевых проблем в Linux-инфраструктуре недостаточно ping и curl. Иногда нужно посмотреть, что реально ходит по проводу. tcpdump — стандартный инструмент для захвата пакетов из CLI. tshark — его побратим из набора Wireshark, удобный для скриптов.
Быстрый старт с tcpdump
Проверим, что пакеты идут до хоста:
Утилита поднимает интерфейс в promiscuous mode и печатает каждую строку при прохождении пакета. По умолчанию работает с первым интерфейсом, который найдёт, но лучше указывать явно.
Для быстрого теста без DNS-резолва (чтобы не ждать timeout при отсутствии сети):
-nn запрещает резолвить и хостнеймы, и порты.
Ключевые флаги
| Флаг | Назначение |
|---|---|
-i iface | Интерфейс |
-c N | Захватить N пакетов и выйти |
-n | Не резолвить хостнеймы |
-nn | Не резолвить хостнеймы и порты |
-v, -vv, -vvv | Увеличивать детализацию вывода |
-w file | Записать сырой дамп в файл (pcap) |
-r file | Прочитать дамп из файла |
-X | Показать hex + ASCII тело пакета |
-s N | Срезать каждый пакет до N байт (0 = полный) |
-C | Ротировать выходной файл при достижении N MB |
Флаги -v полезны для отладки: первый уровень показывает TTL и ID, второй — флаги и window size, третий добавляет ACK и отображает полный IP-header.
BPF-фильтры
tcpdump использует Berkeley Packet Filter. Синтаксис читается слева направо.
Фильтры комбинируются через and, or, not. Кавычки нужны, когда в выражении есть пробелы или спецсимволы.
Не пишите в проде tcpdump -i any без ограничения по хосту или порту. Получите лавину трафика и потратите диск на ровном месте.
Запись в файл и чтение
Захват в файл — обязательная практика. Сниффер наживо выдаёт данные десятками строк в секунду; анализировать в терминале невозможно.
Формат pcap — бинарный. Опция -C ограничивает размер файла:
Создаст файлы /tmp/capture-0, /tmp/capture-1 … до 5 штук, каждый до 10 MB. -W — количество файлов.
tshark как tty-free альтернатива
tshark — консольная часть Wireshark. Выдаёт структурированный вывод, удобный для парсинга в скриптах:
-T fields -e позволяет вытащить конкретные поля из каждого пакета:
Для чтения pcap-файла с tshark удобнее, чем с tcpdump:
tshark не умеет в-C ротацию как tcpdump, но умеет в live-фильтры лучше (полноценный dissector Wireshark).
Чтение дампа в Wireshark
Созданный tcpdump pcap открывается в Wireshark без конвертации:
В WiresharkApply as display filter вводите тот же BPF-синтаксис: tcp.port == 443 && ip.src == 10.0.0.1.
Если файл большой (>100 MB), не открывайте его целиком. Используйте tcpdump -r с предварительным фильтром, чтобы вытащить нужный срез: tcpdump -r big.pcap -nn 'host 10.0.0.5' -w small.pcap.
Типичные ошибки
- Забыли
-c— процесс висит, захватывая трафик бесконечно. Добавьте ограничение сразу. - Нет прав — нужен root или
sudo tcpdump. В современных дистрибутивах можно выдать capabilities:setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump. -wне работает с-l(line-buffering) одновременно. Если нужен прогресс — пишите в файл и читайте параллельно черезtail -f.- Файл записался, а читается пустым — возможно, не было трафика, подходящего под фильтр. Проверьте
tcpdump -i eth0 -nnбез фильтра.