Что делает tcpdump и что важно помнить
tcpdump — консольный анализатор сетевых пакетов для Linux и macOS. Он подключается к сетевому интерфейсу, получает копии проходящих пакетов и выводит их заголовки строками или сохраняет в файл. Это основной инструмент, когда нужно понять, доходит ли запрос до сервера, приходит ли ответ и что происходит в рукопожатии.
Предупреждение об этике и законе обязательно. Захватывайте трафик только на собственном устройстве, в своей домашней сети или в сети, где вам это явно разрешили. Перехват чужих данных без согласия недопустим и наказуем. Кроме того, в файлах захвата могут оказаться пароли и личные сведения от нешифрованных протоколов, поэтому храните их аккуратно и удаляйте после анализа.
Шифрованное содержимое, например страницы по HTTPS, вы не прочитаете: видны адреса, порты, размеры, время и служебные поля рукопожатия, но не сами данные. Для диагностики соединения этого обычно достаточно.
Запуск, интерфейс и базовые ключи
Права администратора нужны: sudo tcpdump. Сначала узнайте список интерфейсов командой tcpdump -D или ip addr в Linux и ifconfig в macOS. В Linux слово any означает все интерфейсы сразу; в macOS нужно указывать конкретный, чаще всего en0.
| Ключ | Что делает |
|---|---|
| -i интерфейс | Выбор интерфейса, например eth0, en0, any |
| -n | Не разрешать адреса в имена |
| -nn | Не разрешать ни адреса, ни имена портов |
| -c N | Остановиться после N пакетов |
| -w файл | Записать захват в файл формата pcap |
| -r файл | Прочитать ранее сохранённый файл |
| -v, -vv | Больше подробностей |
| -A | Вывод содержимого в ASCII |
| -X | Вывод содержимого в шестнадцатеричном виде и ASCII |
| -e | Показать заголовки канального уровня, включая MAC |
| -q | Краткий вывод |
Практический минимум: sudo tcpdump -i eth0 -nn -c 20. Ключи -nn ускоряют вывод и делают его однозначным, потому что обратное разрешение имён отнимает время и создаёт собственные DNS-запросы, которые попадут в захват. Ограничение -c спасёт терминал от бесконечной ленты.
Чтобы окончить захват без -c, нажмите Ctrl и C. Утилита выведет число захваченных пакетов и число отброшенных ядром. Если отброшенных много, компьютер не успевает обрабатывать поток: сузьте фильтр.
Язык фильтров: примеры, которые пригодятся
Фильтр записывается в конце команды и использует синтаксис BPF. Условия можно связывать словами and, or, not и группировать скобками; скобки и одиночные символы лучше заключать в одинарные кавычки, чтобы оболочка не пыталась их разобрать.
- host 192.168.1.20 — пакеты, где этот адрес либо отправитель, либо получатель.
- src host 192.168.1.20 и dst host 192.168.1.20 — только исходящие или только входящие.
- net 192.168.1.0/24 — весь диапазон подсети.
- port 53 — трафик на порт 53 или с него; tcp port 443 ограничит протоколом TCP.
- portrange 8000-8100 — диапазон портов.
- udp, tcp, icmp, arp — фильтрация по протоколу.
- not port 22 — исключить SSH; это очень полезно, когда вы подключены к серверу по SSH и не хотите видеть собственный сеанс в захвате.
- 'tcp[tcpflags] & tcp-rst != 0' — только пакеты со сбросом соединения.
- 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' — только начальные SYN-пакеты без подтверждения.
Пример комбинации: sudo tcpdump -i eth0 -nn 'host 192.168.1.20 and (tcp port 80 or tcp port 443)'. Пример вывода (пример): строка вида «время IP 192.168.1.20.51234 > 203.0.113.10.443: Flags [S], seq ..., length 0». Флаги: S — SYN, S с точкой — SYN и ACK, точка — ACK, P — PSH, F — FIN, R — сброс.
Пошаговые сценарии диагностики
Сценарий первый: проверить DNS. Выполните sudo tcpdump -i any -nn port 53, в другом окне запустите nslookup example.com. Вы увидите запрос и ответ; если ответ не приходит, виновата связь с DNS-сервером. Сценарий второй: убедиться, что пакеты от устройства вообще доходят до компьютера. Запустите захват по адресу устройства и включите на нём нужную функцию.
Сценарий третий: узнать, кто «шумит» в сети. Захват на интерфейсе без фильтра с ограничением -c 200 покажет, какие адреса чаще всего встречаются. Сценарий четвёртый: проверить ICMP: tcpdump icmp вместе с ping на другом устройстве покажет запросы и ответы.
- Определите интерфейс и адрес, которые проверяете.
- Запустите захват с узким фильтром и ключом -nn.
- Воспроизведите проблему в другом окне или на другом устройстве.
- Остановите захват и изучите последовательность: есть ли SYN, приходит ли SYN и ACK в ответ, есть ли сбросы R.
- Для сложных случаев сохраните файл ключом -w и откройте в Wireshark.
Один SYN без ответа указывает на фильтр или недоступность узла. Ответ, состоящий из сброса, означает закрытый порт. Многократные повторы одних и тех же сегментов говорят о потерях на пути.
Запись в файл и отличия систем
Сохранение: sudo tcpdump -i eth0 -nn -w capture.pcap 'host 192.168.1.20'. Файл в формате pcap открывается в Wireshark или читается обратно командой tcpdump -nn -r capture.pcap. На загруженном канале ограничивайте размер: ключ -C задаёт размер файла в миллионах байт, а -G время ротации в секундах, иначе диск быстро заполнится.
В macOS утилита есть в системе, интерфейс обычно en0, псевдоинтерфейса any нет. В Linux она ставится из пакета tcpdump. В Windows её нет: используйте Wireshark, консольную утилиту tshark или встроенное средство pktmon. Для домашнего пользователя удобнее графическая программа, а tcpdump хорош на серверах без графики, где вы подключены по SSH.
Помните о собственной нагрузке: без фильтра на быстром канале захват потребляет процессор и память. Фильтруйте на уровне захвата, а не после, и работайте короткими сессиями.