tcpdump: захват и анализ сетевого трафика в Linux

Linux поставляется с множеством сетевых утилит, и tcpdump — одна из ключевых. Он умеет захватывать и фильтровать трафик на уровне пакетов и часто используется при расследовании проблем сети, проверке приложений и анализе инцидентов.
В этой статье подробно разберём установку, базовые и продвинутые приёмы работы с tcpdump, практические шаблоны фильтров, рекомендации по безопасности и этапы расследования сетевых проблем.
Что такое tcpdump (одно предложение)
tcpdump — консольный инструмент для захвата сетевых пакетов с поддержкой выражений BPF (Berkeley Packet Filter) и сохранением в формат pcap для дальнейшего анализа.
Установка tcpdump в Linux
На большинстве популярных дистрибутивов tcpdump уже установлен. Если система выдаёт “tcpdump: command not found”, установите пакет из официального репозитория.
Debian/Ubuntu:
sudo apt-get update
sudo apt-get install tcpdumpArch Linux:
sudo pacman -Syu
sudo pacman -S tcpdumpFedora / CentOS / RHEL (dnf):
sudo dnf install tcpdumpПримечание: при установке может потребоваться библиотека libcap. Если установщик предлагает её установить — подтвердите. Без привилегий или соответствующих capability tcpdump не сможет захватывать пакеты.
Важное: для запуска tcpdump требуются привилегии root или capability CAP_NET_RAW/CAP_NET_ADMIN. Лучше выдавать только необходимые права через setcap, а не запускать всё как root.
Быстрый старт: базовый захват
Запустите tcpdump без аргументов, чтобы увидеть трафик на всех интерфейсах:
sudo tcpdumpОстановите захват сочетанием Ctrl+C. Для ограничения числа пакетов используйте -c:
sudo tcpdump -c 5Флаги, которые стоит знать сразу:
- -c <число> — захватить указанное число пакетов и выйти
- -i <интерфейс> — слушать конкретный интерфейс
- -w <файл.pcap> — записать захват в файл
- -r <файл.pcap> — прочитать pcap-файл
- -v, -vv, -vvv — уровень подробности вывода
- -s
— длина фрагмента пакета для записи (по умолчанию 262144 на современных версиях)
Просмотр доступных интерфейсов
Список интерфейсов, которые может слушать tcpdump:
sudo tcpdump -DАльтернативно:
sudo tcpdump --list-interfacesВыберите интерфейс явно:
sudo tcpdump -i eth0
# или
sudo tcpdump --interface eth0Если не указывать -i, tcpdump слушает первый доступный интерфейс или все доступные в зависимости от платформы.
Фильтры tcpdump: как не утонуть в пакетах
tcpdump использует выражения BPF — это компактный язык фильтрации. Выражение обычно состоит из ключевого слова (host, port, src, dst, net, proto) и значения, а логические операторы and, or, not и скобки позволяют комбинировать условия.
Общие формы:
- host 192.168.1.10 — пакеты от или к хосту
- src host 192.168.1.10 — пакеты исходящие от хоста
- dst host 192.168.1.10 — пакеты, направленные на хост
- port 80 — любые пакеты с портом 80 (src или dst)
- src port 12345 или dst port 443
- net 10.0.0.0/8 — сеть по маске
- tcp, udp, icmp — по протоколу
- portrange 8000-8100 — диапазон портов
Примеры:
Захват ICMP (ping):
sudo tcpdump -c 5 icmpПакеты, связанные с конкретным хостом:
sudo tcpdump -c 10 host 192.168.2.1Трафик на порт 80 (HTTP):
sudo tcpdump -c 20 'port 80'Комбинация условий (хост и порт):
sudo tcpdump -c 50 'host 192.168.2.1 and port 443'Используйте кавычки в оболочке, чтобы гарантировать корректную интерпретацию выражения.
Более сложные выражения BPF
- Исключить адрес: not host 10.0.0.5
- Источник — сеть: src net 192.168.0.0/24
- Только TCP-пакеты с портом назначения 22:
sudo tcpdump 'tcp and dst port 22'- HTTP трафик от конкретного клиента к конкретному серверу:
sudo tcpdump 'tcp and src host 10.0.0.23 and dst host 93.184.216.34 and dst port 80'Советы:
- Группируйте условия в скобки при комбинировании and/or
- Сначала протестируйте выражение с -c 5
- Используйте короткие и специфичные фильтры, чтобы снизить объём записей
Просмотр содержимого пакетов
По умолчанию tcpdump показывает заголовки пакетов. Для детального анализа можно вывести полезную нагрузку в hex и ASCII.
Hex dump (-x):
sudo tcpdump -c 5 -xASCII (-A):
sudo tcpdump -A -c 10Hex + link-level (-X):
sudo tcpdump -X -c 5Флаг -s определяет, сколько байт каждого пакета сохранять/показывать; для полного пакета используйте -s 0:
sudo tcpdump -s 0 -A -c 5Сохранение захвата в файл и ротация файлов
Запись в pcap-файл:
sudo tcpdump -i eth0 -w capture.pcapЧтение pcap-файла:
sudo tcpdump -r capture.pcapРотация по размеру (-C) и ограничение числа файлов (-W):
# ротация: каждый файл до 100 МБ, максимум 10 файлов
sudo tcpdump -i eth0 -w capture-%Y%m%d%H%M%S.pcap -C 100 -W 10Примечание: формат строки в имени файла поддерживает shell-розширения; для гарантии используйте скрипт-обёртку, который добавит timestamp.
Совместимость: Файлы .pcap можно открыть в Wireshark, tshark, и других анализаторах.
Совместная работа с Wireshark
Часто удобнее делать фильтрацию на месте небольшими выражениями, а затем анализировать крупные захваты в Wireshark.
Пример: собрать трафик по проблемному IP и открыть в Wireshark:
sudo tcpdump -i eth0 'host 192.168.2.10' -w /tmp/problem.pcap
# затем на рабочей станции
wireshark /tmp/problem.pcapИли передать через stdout в tshark для быстрой фильтрации и подсчётов:
sudo tcpdump -i eth0 -w - 'port 443' | tshark -r - -Y 'tls.handshake'Уровни подробности и таймштампы
- -v, -vv, -vvv — увеличивают подробность вывода (информация о TCP options, HTTP, рекордные подробности)
- -ttt, -tttt — форматы временных отметок, полезно для визуализации задержек
- -n — не разрешать имена хостов (IP-адреса ускоряют вывод)
- -nn — не разрешать имён и не переводить номера портов в сервисы
Пример с таймштампами и без DNS:
sudo tcpdump -i eth0 -nn -tttt 'tcp and port 5683' -c 100Частые ошибки и способы их обхода
- “tcpdump: command not found” — установите пакет tcpdump
- “permission denied” — нужен root или capability; выдайте setcap или запускать через sudo
Установка capability вместо запуска от root:
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
# затем запуск без sudo
tcpdump -D- Неполные пакеты (snaplen слишком мал): используйте -s 0
- Большие файлы pcap — применяйте ротацию и сжатие (gzip) или фильтруйте до записи
Безопасность и приватность при захвате трафика
Important: захват трафика может содержать конфиденциальные данные (пароли, токены, персональные данные). Перед записью/передачей pcap-файлов:
- Оцените необходимость: не захватывайте больше, чем нужно
- Используйте фильтры, чтобы ограничить объём и чувствительные поля
- Храните pcap в защищённом месте и удаляйте по окончании расследования
- При передаче используйте шифрование (scp/sftp) или безопасные репозитории
- Удалите или анонимизируйте данные до публикации (обрезка payload, замена IP)
Юридическая заметка: захват трафика в чужих сетях без разрешения может нарушать политику компании или закон.
Режимы использования по ролям (чек-листы)
Администратор сети:
- Проверить доступность интерфейсов: sudo tcpdump -D
- Уточнить IP/порт проблемного сервиса
- Запустить ограниченный захват: sudo tcpdump -i eth0 ‘host X and port Y’ -w /tmp/issue.pcap -c 100
- Проанализировать в Wireshark, собрать метрики
Разработчик приложения:
- Повторить шаги воспроизведения ошибки
- Собирать трафик только между клиентом и тестовым сервером
- Использовать -A для чтения текста и отладки HTTP/JSON
Инцидентный ответ/безопасность:
- Захватать трафик на подозреваемой машине в защищённую область
- Использовать ротацию и немедленную загрузку на защищённый сервер
- Не публиковать pcap без маскировки
Шаблон простого SOP при расследовании сетевой проблемы
- Зафиксировать время и контекст (время UTC, hostname, процесс-воспроизведение).
- Снять краткий захват для проверки гипотезы:
sudo tcpdump -i eth0 -nn -c 200 'host 192.168.2.10 and port 443' -w /tmp/quick-check.pcap- Если подтверждено — собрать расширенный захват с ротацией:
sudo tcpdump -i eth0 -nn 'host 192.168.2.10' -w /var/log/tcpdump/incident-%s.pcap -C 200 -W 5- Зашифровать и передать pcap-инженерам для анализа.
- По завершении удалить захваты с промежуточных хостов.
Критерии приёмки:
- pcap содержит пакеты в период воспроизведения
- в журнале зафиксирован соответствующий timestamp
- используются минимально необходимые фильтры
Альтернативы и комплементарные инструменты
- Wireshark / tshark — GUI и CLI анализ .pcap с мощными декодерами
- ngrep — удобен для «grep по сети», простые текстовые шаблоны
- ss / netstat — проверка открытых сокетов на хосте (без захвата пакетов)
- iperf — тест пропускной способности
- iptraf — интерактивный мониторинг трафика
Когда tcpdump не подойдёт:
- Нужен визуальный декодер с удобной расшифровкой протоколов — Wireshark
- Нужна постоянная агрегация и метрики — использовать мониторинг (Prometheus/OpenTelemetry)
Отладочные примеры и полезные сниппеты
Показывать только первые 100 байт полезной нагрузки и записывать в файл:
sudo tcpdump -i eth0 -s 100 -w short-snap.pcapЗаписать только HTTP-запросы и посмотреть в ASCII на лету (требуется фильтр, чтобы не сливаться):
sudo tcpdump -i eth0 -s 0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'Подсчитать число пакетов от каждого IP (используя awk):
sudo tcpdump -n -l | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rnОграничение по времени (захват N секунд) используя timeout:
sudo timeout 30 tcpdump -i eth0 -w /tmp/30s.pcapПроверки и тесты приёмки (кратко)
- Запустите захват и воспроизведите проблему — в pcap должны быть пакеты с ожидаемыми src/dst/port
- Убедитесь, что snaplen достаточен (используйте -s 0 при неуверенности)
- Проверьте, что файлы pcap корректно открываются в Wireshark
Руководство по безопасности и жёсткой настройке
- Не давайте sudo всем пользователям; выдавайте setcap только тем утилитам, которые действительно требуют сетевого захвата
- Логируйте запуски tcpdump и кто и когда выполнял запись
- Ограничьте доступ к директориям с pcap-файлами
Совместимость и миграция
tcpdump зависит от libpcap. При переносе между системами проверяйте версию libpcap, так как старые версии могут неправильно декодировать новые протоколы. Обычно pcap-файлы совместимы между tcpdump и Wireshark, но поведение при специфичных link-layer типах может отличаться.
Примеры реальных сценариев (когда tcpdump помогает)
- Диагностика проблем с TLS: увидеть TCP handshake и SNI (если не зашифровано)
- Поиск дублирующих пакетов и retransmits с помощью -vvv
- Проверка DNS: быстрые запросы/ответы и временные метрики
Частые ошибки при анализе и как их избегать
- Считать, что всё видно по заголовкам — иногда полезная нагрузка шифруется
- Захватывать на неправильном интерфейсе — всегда проверяйте
-D - Переоценивать объём данных — используйте фильтры и ротацию
FAQ
Q: Нужно ли всегда запускать tcpdump от root?
A: Нет. Можно дать бинарю tcpdump capability (cap_net_raw,cap_net_admin) через setcap, чтобы запускать его не от root.
Q: Что лучше для длительного мониторинга — tcpdump или специализированный пакетный коллектор?
A: Для длительного мониторинга лучше специализированные системы (flow collectors, IDS/IPS), tcpdump полезен для точечных расследований.
Q: Можно ли читать pcap прямо на сервере без скачивания?
A: Да, с помощью tshark или tcpdump -r; но безопаснее перенести зашифрованно на аналитический узел.
Заключение
tcpdump остаётся универсальным инструментом для администраторов и инженеров: он лёгкий, гибкий и совместим с экосистемой анализа трафика. Ключевые практики — использовать точные фильтры, сохранять захваты в pcap для последующего анализа, минимизировать сбор избыточных данных и соблюдать правила безопасности при работе с конфиденциальной информацией.
Ключевые шаги на практике:
- Установите tcpdump и при необходимости выдайте capability через setcap
- Определите интерфейс и сформулируйте точный BPF-фильтр
- Сначала делайте короткие тестовые захваты (-c), затем собирайте большие pcap с ротацией
- Анализируйте pcap в Wireshark/tshark и убирайте чувствительные данные перед распространением
Дополнительные ресурсы: man tcpdump, документация libpcap и статьи по BPF-выражениям.
Похожие материалы
CSS vertical-align — полное руководство
Слайдер в стиле Netflix — CSS и JS
Исправление System.Xml.ni.dll в Windows
AquaSnap — расширенное управление окнами в Windows
Как проверить, взломаны ли ваши аккаунты