Консольная утилита tcpdump предназначена для исследования сетевого трафика на linux серверах. Как работать с tcpdump на Linux? Рассмотрим в этой статье.

Установка и начало использования

Установить эту утилиту в debian или ubuntu можно так:

$ sudo apt install tcpdump

Использовать данное приложение может только администратор. Поэтому для работы используем sudo или работаем под пользователем root.

Первым делом можем посмотреть список доступных интерфейсов используя опцию -D:

$ sudo tcpdump -D
1.ens18 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)

Рассмотрим эти интерфейсы:

  • ens18 — обычный сетевой интерфейс;
  • lo — локальный сетевой интерфейс;
  • any — псевдоинтерфейс обозначающий все интерфейсы;
  • docker0 — у меня установлен в системе docker и этот интерфейс относится к нему;
  • nflog, nfqueue, usbmon1 — не относятся к сети, и в этой статье рассматриваться не будут.

Захват пакетов и вывод информации

Чтобы посмотреть все проходящие пакеты через выбранный интерфейс можно воспользоваться опцией -i <интерфейс>. Но так как пакетов будет много, дополнительно укажем опцию -c <количество>, чтобы захватить только определённое количество пакетов:

$ sudo tcpdump -i ens18 -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
17:34:28.863132 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 1492170785:1492170901, ack 2057276671, win 501, length 116
17:34:28.863171 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 116:152, ack 1, win 501, length 36
17:34:28.863206 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 152:268, ack 1, win 501, length 116
17:34:28.863233 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 268:304, ack 1, win 501, length 36
17:34:28.863294 IP 172.30.81.7.57376 > 172.30.95.116.ssh: Flags [.], ack 152, win 49179, length 0
17:34:28.863306 IP 172.30.81.7.57376 > 172.30.95.116.ssh: Flags [.], ack 268, win 49179, length 0
17:34:28.865617 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 520:668, ack 1, win 501, length 148
17:34:28.865696 IP 172.30.81.7.57376 > 172.30.95.116.ssh: Flags [.], ack 668, win 49183, length 0
17:34:28.865792 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 888:1036, ack 1, win 501, length 148
17:34:28.865888 IP 172.30.95.116.ssh > 172.30.81.7.57376: Flags [P.], seq 1072:1204, ack 1, win 501, length 132
10 packets captured
42 packets received by filter
28 packets dropped by kernel

Теперь рассмотрим полученную информацию, которая состоит из заголовков каждого пакета выводимые построчно. Строка состоит из следующих полей:

  • время;
  • протокол;
  • ip источника и его порт;
  • ip назначения и его порт;
  • флаги;
  • seq — номер первого байта сегмента. Данные, передающиеся по TCP делятся на сегменты, а в заголовке указывается порядковый номер первого байта в этом сегменте;
  • ack — номер подтверждения, если присутствует. Получатель после приёма сегмента или нескольких сегментов посылает номер подтверждения;
  • win — размер окна приема. Получатель указывает размер окна, больше которого отправитель не может отправить сегмент;
  • options — опции, если присутствуют;
  • length — длина полезной нагрузки данных.

Эта утилита может показывать не только заголовки, но и содержимое пакетов, но об этом позже.

Фильтры

Чтобы не захватывать все пакеты, нужно использовать фильтры. Например можно захватить пакеты только от определённого ip адреса, номера порта или протокола. Вот список самых распространённых фильтров:

  • port — порт назначения или источника;
  • host — ip адрес назначения или источника;
  • src — ip адрес источника;
  • dst — ip адрес назначения;
  • net — подсеть;
  • tcp — пакеты tcp;
  • udp — пакеты udp;
  • ip — ip;
  • ip6 — ip версии 6;
  • icmp — icmp.

Например захватим 10 пакетов связанных с www.incentivespro.com.

$ sudo tcpdump -i ens18 -c 10 host yandex.ru

Совмещение различных фильтров

Фильтры можно совмещать, например захватим только icmp пакеты связанные с ip адресом 172.30.81.7:

$ sudo tcpdump -i ens18 -c 5 host 172.30.81.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 eth0

Ловим пакеты у которых адрес:

  • источника или назначения равен 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 позволяют исследовать работу сети. Это может пригодиться при поиске проблемы, при анализе безопасности сети, а также если вы изучаете какой-нибудь протокол и хотите на практике понаблюдать за его работой.

Сводка
Утилита tcpdump для анализа сети
Имя статьи
Утилита tcpdump для анализа сети
Описание
Консольная утилита tcpdump предназначена для исследования сетевого трафика на linux серверах. Как работать с tcpdump на Linux? Рассмотрим в этой статье

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *