linux-labs

Вики / Сеть

tcpdump (захват трафика)

Снифферинг пакетов для диагностики — фильтры по хосту, порту, интерфейсу.

tcpdump захватывает сетевые пакеты — последнее средство, когда непонятно, «доходит ли вообще трафик». Нужен root.

sudo tcpdump -i any -n            # весь трафик, без резолва имён (-n)
sudo tcpdump -i eth0 -nn port 80  # на eth0, порт 80, без резолва имён/портов

-n не резолвить IP, -nn ещё и порты; без них tcpdump тормозит на DNS.

Ключ Значение
-i IFACE интерфейс (any — все)
-n / -nn не резолвить имена / имена и порты
-c N остановиться после N пакетов
-w FILE писать сырой дамп в .pcap (для Wireshark)
-r FILE читать из .pcap
-v / -vv подробнее (TTL, флаги, опции)
-A / -X показать payload как ASCII / hex+ASCII
-s 0 захватывать пакет целиком (по умолчанию обрезается)
-e показать L2 (MAC-адреса)
-Q in/out только входящий/исходящий

Синтаксис BPF: host, net, port, portrange, src/dst, tcp/udp/icmp, объединяй and/or/not:

sudo tcpdump -ni any host 10.0.0.5            # трафик к/от хоста
sudo tcpdump -ni any net 10.0.0.0/24          # к/от подсети
sudo tcpdump -ni any port 443                 # по порту
sudo tcpdump -ni any portrange 8000-8100      # диапазон портов
sudo tcpdump -ni any src 10.0.0.5 and port 22 # комбинация
sudo tcpdump -ni any 'tcp and not port 22'    # весь TCP, кроме своей ssh-сессии
sudo tcpdump -ni any icmp                      # пинги
sudo tcpdump -ni any 'tcp[tcpflags] & tcp-syn != 0'   # только SYN (попытки коннекта)
sudo tcpdump -ni any -c 20                     # 20 пакетов и стоп
sudo tcpdump -ni any -A port 80               # увидеть HTTP-текст (payload)
sudo tcpdump -ni any port 80 -w cap.pcap       # писать в файл
sudo tcpdump -r cap.pcap 'host 10.0.0.5'       # читать из файла с фильтром

Полезно при ssh-сессии исключать свой же трафик: and not port 22 — иначе видишь в основном собственные пакеты.

«Доходит ли запрос до сервера?»

На сервере sudo tcpdump -ni any port 80, сделай запрос с клиента. Видишь пакеты — трафик доходит (проблема в приложении/локальном файрволе); тишина — не доходит (маршрут/файрвол/не та сеть/не тот интерфейс).

Видно SYN, но нет SYN-ACK

Пакеты приходят, но сервер не отвечает: служба не слушает (ss -tlnp) или локальный файрвол дропает (см. firewall).

Виден SYN-ACK, но соединение не встаёт

Асимметричный маршрут или файрвол на обратном пути/у клиента. Снимай дамп с обеих сторон одновременно.

Слишком много вывода

Сузь фильтром (host/port), ограничь -c N, исключи свою сессию (not port 22), пиши в .pcap и разбирай в Wireshark.

Нет прав / нет интерфейса

tcpdump требует root (доступ к сырым сокетам). Список интерфейсов — sudo tcpdump -D или ip -br a.

sudo tcpdump -ni any port 80      # порт 80, без резолва
sudo tcpdump -ni any host IP      # по хосту
sudo tcpdump -ni any 'tcp and not port 22'   # TCP без своей ssh
sudo tcpdump -ni any -c 20        # 20 пакетов и стоп
sudo tcpdump -ni any -A port 80   # payload (HTTP-текст)
sudo tcpdump -ni any port 80 -w cap.pcap   # в файл → Wireshark