Утилита tcpdump - это очень мощный и популярный инструмент для перехвата и анализа сетевых пакетов. Она позволяет просматривать все входящие и исходящие из определенного интерфейса пакеты и работает в командной строке. Конечно, вы могли бы пользоваться Wirshark для анализа сетевых пакетов, это графическая утилита, но иногда бывают ситуации когда нужно работать только в терминале.
Tcpdump ничем не хуже Wireshark, и имеет все необходимые возможности для анализа пакетов, к тому же вы можете сохранить все перехваченные пакеты в файл, чтобы анализировать их потом с помощью того же самого Wireshark. В этой статье мы рассмотрим как пользоваться tcpdump для перехвата сетевых пакетов.
Установка tcpdump
Во многих дистрибутивах команда tcpdump поставляется по умолчанию, но если в вашем дистрибутиве ее нет, то вы можете очень просто ее установить из официальных репозиториев. Например, в Ubuntu/Debian:
Код:
sudo apt install tcpdump
В Fedora/Red Hat/CentOS:
Код:
sudo dnf install tcpdump
Когда установка завершится, вы можете переходить к работе.
Команда tcpdump
Перед тем как перейти к примерам работы с утилитой, давайте рассмотрим ее синтаксис и основные опции. Команда имеет такой синтаксис:
Начнем рассматривать примеры tcpdump с захвата трафика на интерфейсе eth0, у меня это основной интерфейс, который подключен к интернету. Для работы программе необходимы права суперпользователя, поэтому не забудьте указать sudo:
Код:
sudo tcpdump -i eth0
Чтобы остановить работу команды нажмите Ctrl+C. В выводе вы сразу же увидите все перехваченные пакеты. Формат записи для каждого пакета будет выглядеть следующим образом:
Цитата: 13:03:41.795599 IP udp032919uds.hawaiiantel.net.6881 > 192.168.1.2.52055: Flags [.], seq 640160396:640161844, ack 436677393, win 2050, options [nop,nop,TS val 3805626438 ecr 4677385], length 1448
Такой формат характерен для пакетов данных, в зависимости от протокола выделенный черным текст будет отличаться. Сначала идет временная метка, затем протокол, далее зеленым отмечен ip адрес отправителя, а синим адрес адресата, в данном случае, нашего компьютера. Дальше идут дополнительные параметры tcp и в конце размер пакета в байтах. Подробность вывода информации можно контролировать с помощью опций -v, Например:
Код:
sudo tcpdump -v -i eth0
Здесь уже появляется информация о протоколе IP:
Цитата: IP (tos 0x0, ttl 64, id 50309, offset 0, flags [DF], proto TCP (6), length 64)
Мы можем узнать информацию о времени жизни пакета ttl, версию протокола TCP и длину поля заголовка. Опция -vv будет выводить проверку контрольных сумм пакета и содержимое в некоторых случаях.
После опций вы можете указывать фильтры для пакетов. Вот основные параметры, по которым можно отсеивать пакеты:
host - имя хоста;
ip - ip адрес;
proto - протокол;
net - адрес сети или подсети;
port - адрес порта;
src - параметр, касающийся отправителя;
dst - параметр, касающейся получателя;
Доступны такие протоколы: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp.
Вы можете все это комбинировать между собой, чтобы получить желаемый результат. Рассмотрим более детально на примерах. Отсеем только пакеты, адресованные нашему компьютеру:
Код:
sudo tcpdump -i eth0 ip dst 192.168.1.2
Также мы можем отобрать пакеты, отправляемые на определенный узел:
Код:
sudo tcpdump -i eth0 dst host google-public-dns-a.google.com
Как видите, это DNS пакеты и здесь вместо флагов TCP содержится полезная информация, запрос ip адреса хоста. Также вы можете выбрать ответные пакеты от определенного хоста:
Код:
sudo tcpdump -i eth0 src host google-public-dns-a.google.com
Здесь нет полного содержимого пакета, если вы хотите его получить нужно использовать опцию -v или -vv:
Код:
sudo tcpdump -vv -i eth0 host dst google-public-dns-a.google.com
С помощью оператора and вы можете объединить несколько фильтров в один:
Код:
sudo tcpdump -i eth0 dst host google-public-dns-a.google.com and src host google-public-dns-a.google.com
Из операций объедения доступны and и or, также можно применять скобки для обозначения приоритета. Вам необязательно указывать host, во многих случаях достаточно src или dst, утилита сама поймет что имелось в виду. Точно такую же конструкцию можно использовать для портов. Например, мы можем отсеять все запросы или ответы к DNS (на порт 53):
Код:
sudo tcpdump -vv -i eth0 port 53
Точно такое же можно провернуть для http (порт 80):
Код:
sudo tcpdump -vv -i eth0 port 80
Естественно, тут тоже можно применять dst и src для более конкретных результатов. Вы можете фильтровать не один порт, а целый диапазон портов:
Код:
sudo tcpdump portrange 21-23
Если указать один из протоколов, вы отфильтруете только пакеты этого протокола, например tcp, udp или arp:
Код:
sudo tcpdump -vv arp
Точно также можно выбрать все udp пакеты:
Код:
sudo tcpdump -vv udp
Также доступен фильтр по обозначению сети:
Код:
sudo tcpdump net 129.168.1.1/24
Кроме того, вы можете фильтровать пакеты по их размеру, например, меньше 32 байт:
Код:
sudo tcpdump less 32
Или больше 128:
Иногда бывает необходимо сохранить захваченный трафик в файл, для этого используется опция -w:
Код:
sudo tcpdump -i eth0 -w file.pcap
Этот файл можно открыть с помощью любой программы для чтения таких файлов, например, Wireshark. Чтобы открыть сохраненные в файл пакеты используйте опцию -r:
Код:
sudo tcpdump -r file.pcap
Остался еще один момент, на который стоит обратить внимание. Это формат отображения содержимого пакетов. Вы можете вывести содержимое пакета в формате ASCII используйте опцию -A:
Код:
sudo tcpdump -A -i eth0
Также вы можете отобразить содержимое в формате HEX и ASCII для этого используйте -XX:
Код:
sudo tcpdump -XX -i eth0
Выводы
В этой статье мы рассмотрели как пользоваться tcpdump. Это очень мощный сетевой анализатор, который работает только через командную строку. Надеюсь, эта информация была полезной для вас и теперь использование tcpdump будет намного проще, если у вас остались вопросы, спрашивайте.