tcpdump — консольная утилита для захвата и просмотра сетевого трафика. Она есть почти в любом дистрибутиве Linux и выручает, когда нужно понять, доходят ли пакеты до сервера, отвечает ли служба и что именно уходит в сеть. Ниже команды, которыми я пользуюсь чаще всего.
Основные ключи
-i any— слушать все интерфейсы,-i eth0— только указанный.-n— не преобразовывать IP-адреса в имена. Вывод быстрее и не создаёт лишних DNS-запросов.-nnещё и не заменяет номера портов названиями.-c 100— остановиться после 100 пакетов.-w файл.pcap— записать трафик в файл,-r файл.pcap— прочитать его.
tcpdump запускается от root или через sudo.
Фильтры: хост, порт, направление
Фильтр пишется после ключей. Условия объединяются словами and, or, not:
tcpdump -i any -n host 10.0.0.5 # весь трафик с этим адресом
tcpdump -i any -n port 443 # только порт 443
tcpdump -i any -n src 10.0.0.5 and dst port 22 # с адреса 10.0.0.5 на порт 22
Как посмотреть DNS-запросы
DNS работает в основном по UDP на порту 53. Все DNS-запросы и ответы на всех интерфейсах:
tcpdump -i any udp and port 53 -n
Только запросы, которые уходят к DNS-серверам:
tcpdump 'dst port 53' -n
Так удобно проверять, к какому DNS-серверу обращается система и получает ли она ответ.
Запись в файл для Wireshark
Если трафика много, проще записать его в файл и разобрать в графическом анализаторе Wireshark на своём компьютере:
tcpdump -i any -n -w capture.pcap port 443
tcpdump -n -r capture.pcap | head # быстро посмотреть записанное
Флаги TCP
Каждый TCP-пакет несёт набор флагов, по которым видно, на каком этапе соединение. В выводе tcpdump они показаны в квадратных скобках: [S], [S.], [P.], [F.], [R]. Точка означает флаг ACK.
- SYN
[S]— запрос на открытие соединения, первый шаг «тройного рукопожатия». - SYN-ACK
[S.]— ответ сервера: запрос принят. Третий шаг — ACK от клиента. - ACK
[.]— подтверждение получения данных. - PSH
[P]— передать данные приложению сразу, не накапливая в буфере. - FIN
[F]— отправитель закончил передачу, штатное закрытие соединения. - RST
[R]— сброс соединения. Часто означает, что на порту никто не слушает или соединение отклонено. - URG — срочные данные, на практике встречается редко.
- ECE и CWR — уведомление о перегрузке сети (ECN, RFC 3168).
Если на SYN клиента сервер отвечает RST, служба на этом порту не запущена или порт закрыт. Если ответа нет совсем, пакеты, скорее всего, отбрасывает межсетевой экран.
Отфильтровать пакеты по флагам:
tcpdump -n 'tcp[tcpflags] & (tcp-syn) != 0' # пакеты с флагом SYN
tcpdump -n 'tcp[tcpflags] & (tcp-rst) != 0' # сбросы соединений