tcpdump: смотрим, какие пакеты реально приходят на сервер
Установка tcpdump, фильтры по порту, адресу и флагам TCP, просмотр содержимого HTTP и DNS, запись в pcap для Wireshark. Ubuntu, Debian, AlmaLinux.

Приложение не достукивается до базы, письма не уходят, клиент уверяет, что запросы до сервера не доходят — а в логах пусто, потому что программа соединения даже не видела. В такой ситуации нужен tcpdump: он показывает пакеты, которые на самом деле приходят на интерфейс и уходят с него, и отвечает на вопрос «дошло или нет» без догадок.
Если нужен сервер, с которого удобно смотреть сеть «со стороны», подойдёт любой VPS на tanaka.host: Ubuntu или Debian ставятся при заказе, оплата по дням.
Как tcpdump видит трафик
Обычная программа получает от ядра уже разобранные данные своих соединений. tcpdump просит ядро отдавать ему копию каждого пакета на выбранном интерфейсе — вместе со всеми заголовками. Поэтому он видит и те пакеты, которые потом отбросит брандмауэр, и те, что адресованы порту, где никто не слушает. Отсюда главное правило диагностики: если пакет есть в tcpdump — он дошёл до сервера; если нет — проблема раньше, в сети или у отправителя.
Копировать каждый пакет накладно, на нагруженном сервере их тысячи в секунду. Поэтому tcpdump почти всегда запускают с фильтром (port 53, host 1.1.1.1 and tcp). Фильтр компилируется в BPF и выполняется прямо в ядре: ненужные пакеты даже не копируются. Благодаря этому tcpdump можно безопасно запускать на рабочем сервере.
Ограничение: tcpdump показывает пакеты как они идут по сети. Для HTTPS и SSH вы увидите адреса, порты, размеры и время, но не содержимое. Открытым текстом читаются только незашифрованные протоколы — обычный HTTP, DNS, SMTP без TLS.
1. Установка и выбор интерфейса
sudo apt install -y tcpdump
# RHEL: sudo dnf install -y tcpdump
Имя сетевого интерфейса понадобится в каждой команде:
ip -br link
Основной интерфейс на VPS обычно называется ens3, eth0 или enp1s0. lo, docker0 и br-… — локальные и Docker. Если не уверены — -i any слушает все сразу.
2. Пакеты по порту
Начнём с DNS. Фильтр по порту 53 и ключ -c, который завершит перехват после нужного числа пакетов. В соседнем окне выполните dig example.com.
sudo tcpdump -n -i ens3 port 53 -c 2
Каждая строка — один пакет: время до микросекунд, адрес.порт > адрес.порт, краткое содержимое. Для DNS это сам вопрос A? example.com. и ответ с адресами.
Ключ -n запрещает превращать адреса в имена. Без него tcpdump сам делает DNS-запросы, засоряет вывод и тормозит.
3. Фильтры
Условия комбинируются через and, or, not. Если в фильтре есть скобки — берите его в кавычки.
# Весь трафик с конкретным адресом
sudo tcpdump -n -i ens3 host 203.0.113.10
# Только входящее на порт 443
sudo tcpdump -n -i ens3 dst port 443
# Трафик к MySQL, исключая свой SSH
sudo tcpdump -n -i ens3 port 3306 and not port 22
# Только UDP или только ICMP (ping)
sudo tcpdump -n -i ens3 udp
sudo tcpdump -n -i ens3 icmp
# Новые попытки подключения к SSH — пакеты SYN
sudo tcpdump -n -i ens3 "tcp[tcpflags] == tcp-syn and dst port 22"
Последний фильтр показывает, кто стучится на сервер. За несколько минут на любом публичном IP он поймает боты, перебирающие пароли — хороший повод настроить fail2ban.
Исключайте собственный SSH. Если вы подключены по SSH и запускаете tcpdump без фильтра, он покажет и пакеты вашей сессии, а каждая выведенная строка породит новые пакеты — вывод зацикливается. Добавляйте
and not port 22(или ваш порт SSH).
4. Содержимое пакетов
Ключ -A выводит содержимое как текст — удобно для открытых протоколов:
# Исходящие пакеты на порт 80 с содержимым
sudo tcpdump -n -A -i ens3 "tcp dst port 80" -c 5
# Только пакеты с запросом GET
sudo tcpdump -n -A -i ens3 'tcp dst port 80 and tcp[((tcp[12]&0xf0)>>2):4] = 0x47455420' -c 1
По HTTP виден весь запрос: путь, Host, User-Agent. Для зашифрованных протоколов -A покажет мусор — это нормально. Для двоичных протоколов удобнее -X: шестнадцатеричный дамп рядом с текстовым.
5. Запись в файл
Длинный перехват удобнее записать в pcap и разобрать потом в Wireshark на своём компьютере:
# Пишем в файл, остановка по Ctrl+C
sudo tcpdump -n -i ens3 port 53 -w /tmp/dns.pcap
# Читаем на сервере
sudo tcpdump -n -r /tmp/dns.pcap
Ограничить размер записи: -c 1000 по числу пакетов или -G 60 -W 1 — ровно минута. Файл скачивается через scp или SFTP и открывается в Wireshark двойным щелчком.
Удалите pcap после разбора. В перехвате могут оказаться пароли из незашифрованных протоколов, cookies и другие секреты.
Полезные ключи
| Ключ | Что делает |
|---|---|
-n |
Не резолвить адреса в имена |
-i any |
Все интерфейсы |
-c N |
Остановиться после N пакетов |
-A / -X |
Содержимое текстом / hex+текст |
-w файл / -r файл |
Записать / прочитать pcap |
-s 0 |
Захватывать пакет целиком (по умолчанию в новых версиях) |
-v, -vv |
Подробнее про заголовки |
-Q in / -Q out |
Только входящие / только исходящие |
Частые ошибки
eth0: No such device exists — на сервере нет интерфейса с таким именем, старые инструкции везде пишут eth0. Посмотрите ip -br link или используйте -i any.
You don't have permission to perform this capture — перехват только от root. Запускайте через sudo.
tcpdump ничего не показывает:
- Проверьте интерфейс. Трафик Docker-контейнеров идёт через
docker0иbr-…. - Ослабьте фильтр: начните с одного условия (
port 80), добавляйте по одному. - Если пусто даже с простым фильтром — пакеты не доходят до сервера. Смотрите трассировку и брандмауэр на стороне отправителя.
Чтобы быстро проверить, открыт ли порт, не разбирая дампы, хватит netcat.