Консольная утилита tcpdump предназначена для исследования сетевого трафика на linux серверах. Как работать с tcpdump на Linux? Рассмотрим в этой статье.
Об утилите
tcpdump — это консольная утилита для захвата и анализа сетевого трафика. Она позволяет просматривать пакеты, проходящие через сетевой интерфейс, и фильтровать их по различным критериям (IP-адрес, порт, протокол и др.). Используется для диагностики сетевых проблем, мониторинга и отладки сетевых приложений.
Установка и начало использования
Установить эту утилиту в debian или ubuntu можно из стандартных репозиториев, например так:
$ sudo apt install tcpdump
Кстати, для работы с этой утилитой требуются админские права.
Первым делом можем посмотреть список доступных интерфейсов используя опцию -D:
$ sudo tcpdump -D 1.ens18 [Up, Running, Connected] 2.any (Pseudo-device that captures on all interfaces) [Up, Running] 3.lo [Up, Running, Loopback] 4.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless] 5.nflog (Linux netfilter log (NFLOG) interface) [none] 6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none] 7.dbus-system (D-Bus system bus) [none] 8.dbus-session (D-Bus session bus) [none]
Из этого списка только ens18 является реальным сетевым интерфейсом, остальные либо не реальные, либо не сетевые.
Захват пакетов и вывод информации
Чтобы посмотреть все проходящие пакеты через выбранный интерфейс можно воспользоваться опцией -i <интерфейс>. Но так как пакетов будет много, дополнительно укажем опцию -c <количество>, чтобы захватить только определённое количество пакетов:
$ sudo tcpdump -i ens18 -c 10 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes 17:36:12.795282 IP 192.168.0.17.ssh > 192.168.0.9.56808: Flags [P.], seq 3494033462:3494033650, ack 863923440, win 501, length 188 17:36:12.795558 IP 192.168.0.9.56808 > 192.168.0.17.ssh: Flags [.], ack 188, win 8211, length 0 17:36:12.879138 ARP, Request who-has 192.168.0.10 tell 192.168.0.17, length 28 17:36:12.879377 ARP, Reply 192.168.0.10 is-at 9e:37:a4:b8:31:04 (oui Unknown), length 28 17:36:12.879381 IP 192.168.0.17.51020 > 192.168.0.10.domain: 35560+ PTR? 9.81.28.172.in-addr.arpa. (42) 17:36:12.880215 IP 192.168.0.10.domain > 192.168.0.17.51020: 35560 NXDomain 0/0/0 (42) 17:36:12.880286 IP 192.168.0.17.56631 > 192.168.0.10.domain: 41022+ PTR? 17.90.28.172.in-addr.arpa. (43) 17:36:12.880840 IP 192.168.0.10.domain > 192.168.0.17.56631: 41022 NXDomain 0/0/0 (43) 17:36:12.881008 IP 192.168.0.17.ssh > 192.168.0.9.56808: Flags [P.], seq 188:456, ack 1, win 501, length 268 17:36:12.922075 IP 192.168.0.9.56808 > 192.168.0.17.ssh: Flags [.], ack 456, win 8210, length 0 10 packets captured 12 packets received by filter 0 packets dropped by kernel
Теперь рассмотрим полученную информацию, которая состоит из заголовков каждого пакета выводимые построчно. Строка состоит из следующих полей:
17:36:12.795282 IP 192.168.0.17.ssh > 192.168.0.9.56808: Flags [P.], seq 3494033462:3494033650, ack 863923440, win 501, length 188
- 17:36:12.795282 — метка времени, когда пакет был захвачен.
- IP — протокол IPv4.
- 192.168.0.17.ssh — отправитель пакета: IP-адрес
192.168.0.17, портssh(обычно это порт 22). - 192.168.0.9.56808 — получатель пакета: IP
192.168.0.9, порт56808(временный клиентский порт). - Flags [P.] — флаги TCP:
- P — Push (отправка данных немедленно),
- . — ACK (подтверждение получения данных).
- seq 3494033462:3494033650 — последовательность байт в этом пакете: от
3494033462до3494033649включительно (всего 188 байт). - ack 863923440 — подтверждение получения данных до байта
863923439от получателя. - win 501 — размер окна получателя (в байтах), то есть сколько байт он готов принять.
- length 188 — размер полезной нагрузки TCP-пакета (данных) в байтах.
Эта утилита может показывать не только заголовки, но и содержимое пакетов, но об этом позже.
Фильтры
Чтобы не захватывать все пакеты, нужно использовать фильтры. Например можно захватить пакеты только от определённого ip адреса, номера порта или протокола. Вот список самых распространённых фильтров:
- port — порт назначения или источника;
- host — ip адрес назначения или источника;
- src — ip адрес источника;
- dst — ip адрес назначения;
- net — подсеть;
- tcp — пакеты tcp;
- udp — пакеты udp;
- ip — ip;
- ip6 — ip версии 6;
- icmp — icmp.
Например захватим 10 пакетов связанных с sysadminium.ru.
$ sudo tcpdump -i ens18 -c 10 host sysadminium.ru
Совмещение различных фильтров
Фильтры можно совмещать, например захватим только icmp пакеты связанные с ip адресом 192.168.0.7:
$ sudo tcpdump -i ens18 -c 5 host 192.168.0.7 and icmp
Совмещать фильтры можно с помощью следующих операторов:
- and — для захвата пакета должны сработать оба фильтра;
- or — для захвата пакета должен сработать любой из фильтров;
- not — исключить из захвата эти пакеты.
В примере выше мы использовали — and.
Опции отвечающие за формат и количество выводимой информации
Теперь разберёмся с наиболее используемыми опциями, которые отвечают за формат вывода:
- -i <интерфейс> — прослушивать конкретный интерфейс;
- -n — отображать ip адреса вместо имен;
- -nn — отображать ip адреса и номера портов вместо имени и названия протоколов;
- -q — минимальное количество информации о пакете;
- -t — не отображать метку времени в каждой строке;
- -tttt — задает вывод временных меток в такой форме: 2021-03-03 16:07:29.578942;
- -X — показывать содержимое пакета в шестнадцатеричной кодировке и в ASCII;
- -XX — то же, что и -X, но также показывает ethernet заголовки;
- -v, -vv, -vvv — увеличить количество получаемой информации;
- -c <число> — получить определённое число пакетов и завершить работу.
Примеры команд
Смотрим все пакеты на всех интерфейсах или на каком-то одном:
# tcpdump -i any # tcpdump -i ens18
Ловим пакеты у которых адрес:
- источника или назначения равен 192.168.0.100;
- источника равен 192.168.0.100;
- назначения равен 192.168.0.100;
- источника или назначения входит в подсеть 192.168.0.0/24
# tcpdump host 192.168.0.100 # tcpdump src 192.168.0.100 # tcpdump dst 192.168.0.100 # tcpdump net 192.168.0.0/24
Ловим пакеты у которых порт:
- источника или назначения равен 8000;
- источника равен 8000;
- назначения равен 8000;
- входит в диапазон портов 8000-9000;
# tcpdump port 8000 # tcpdump src port 8080 # tcpdump dst port 8080 # tcpdump portrange 8000-9000
Пакеты определенного протокола:
# tcpdump icmp # tcpdump ip # tcpdump ip6 # tcpdump tcp # tcpdump udp
Ловим tcp пакеты у которых порт входит в группу портов:
tcpdump tcp and portrange 0-1000
Тоже самое, но смотрим содержимое пакетов:
# tcpdump -X tcp and portrange 0-1000
Пишем результат в файл и считываем из файла:
# tcpdump port 8000 -w capture_file # tcpdump -r capture_file
Опции, фильтры и комбинации фильтров утилиты tcpdump позволяют исследовать работу сети. Это может пригодиться при поиске проблемы, при анализе безопасности сети, а также если вы изучаете какой-нибудь протокол и хотите на практике понаблюдать за его работой.
Если понравилась статья, подпишись на мой канал в VK или Telegram.