немного о tcpdump


В статье пойдет речь об одной из самых популярных утилит для перехвата и анализирования трафика: tcpdump.

Частенько в своей работе программистам или администраторам приходится сталкиваться с проблемами коммуникации приложений или сети. Иногда достаточно взглянуть на логи приложения, чтобы понять, что пошло не так, но бывает и так, что приходится анализировать трафик и сетевую активность на наличие каких-либо паттернов, аномалий или наоборот закономерностей. В этом нам поможет tcpdump.

Изучить новый инструмент легче всего на каких-либо примерах. К слову, все примеры приведены для Debian версии tcpdump, в RedHat подобных дистрибутивах несколько отличается синтаксис. Для перехвата трафика необходимо обладать root привилегиями, поэтому будем считать, что все приведенные команды запущены из под рута.

Предположим, что нам надо отследить сессию клиента к веб серверу, на стороне клиента можно запустить вот такую команду:

tcpdump -l -i eth0 -w - tcp dst port 80 and dst host google.com | strings

Рассмотрим команду в подробностях.

Первая часть команды представляет собой набор опций, как то:

-lбуферизирует вывод строк, что полезно при записи пакетов в stdout ( - )

-i eth0 

-w -запись в stdout вместо файла

Дальше идет вторая часть команды, в которой описывается фильтр пакетов, в данном случае мы получаем все пакеты протокола tcp, у которых порт назначения 80 и хост назначения google.com

Фильтры могут быть сложными и включать много условий.

Поддерживаются логические операнды and (&&), or (||), not (!) и  операнды сравнения >, <, >=, <=, =, !=

Что касается примитив, то наиболее популярные это src, dst, host, port, net, tcp, udp, icmp, которые можно комбинировать с помощью логических операнд.

Рассмотрим еще один пример:

tcpdump -X -S -n -i eth0 -t tcp src port 1026 and greater 100

Здесь мы ловим пакеты с исходящего порта 1026, которые длиннее 100 байт.

** -X**печатает содержимое пакета и в hex и в ascii

** -S**показывает абсолютные номера TCP пакетов

** -n**не транслирует ip адреса в хостнэймы и номера портов в имена сервисов

-tне ставит временной штамп перед каждой строкой вывода

Вывод tcpdump специфичен для каждого протокола. Посмотрим на примере DNS

tcpdump -i eth0 -A port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:15:48.419830 IP laptop.local.47652 > secondary.dns.yandex.ru.domain: 55185+ A? alcoholic.com. (31)
E..;....@.K....&MX...$.5.'.`............    alcoholic.com.....
16:15:48.642439 IP secondary.dns.yandex.ru.domain > laptop.local.47652: 55185 1/0/0 A 176.74.176.179 (47)
E(.KH"..2.)1MX.....&.5.$.7d.............   alcoholic.com..............,...J..
16:15:48.951151 IP laptop.local.43550 > secondary.dns.yandex.ru.domain: 8582+ PTR? 1.8.88.77.in-addr.arpa. (40)
E..D..@.@......&MX.....5.0.i!............1.8.88.77.in-addr.arpa.....
16:15:48.955340 IP secondary.dns.yandex.ru.domain > laptop.local.43550: 8582 1/0/0 PTR secondary.dns.yandex.ru. (77)
E(.iA=..3...MX.....&.5...Uta!............1.8.88.77.in-addr.arpa..............J..    secondary.dns.yandex.ru.
16:15:48.955823 IP laptop.local.37718 > secondary.dns.yandex.ru.domain: 3536+ PTR? 38.1.168.192.in-addr.arpa. (43)
............38.1.168.192.in-addr.arpa.....
16:15:48.960426 IP secondary.dns.yandex.ru.domain > laptop.local.37718: 3536 NXDomain 0/1/0 (92)
............38.1.168.192.in-addr.arpa................%  localhost..root......   :...Q..$... :.

Как видно, я запросил адрес хоста alcoholic.com и получил ответ от DNS сервера.

Первое поле — время регистрации пакета,

второе — протокол (IP),

третье — hostname отправившего пакет,

третье — получившего пакет,

остальные поля характерны для используемого протокола. В примере четко видно, что запрашивались типы DNS записей A и PTR для домена.

Ну и на закуску сложный пример фильтрации. Показать только URGENT пакеты:

tcpdump 'tcp[13] & 32!=0'

Здесь выбирается только тринадцатый байт пакета и проверяется, если 32й бит не равен нулю, то пакет соответствует искомому.

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

comments powered by Disqus