Про строительство и ремонт. Электрика. Окна и двери. Кровля и крыша

Установка и использование tcpdump. Установка и использование tcpdump Как проходит обучение

Поэтому решил создать свою шпаргалку, чтобы было... Ибо без tcpdump не один админ - неадмин

Введение

Очень часто для поиска проблем в работе сети используются анализаторы сетевого трафика . tcpdump является одним из представителей данного класса программ, она позволяет прослушать (отобразить/сохранить) и проанализировать работу сети на уровне передаваемых сетевых пакетов, фреймов и др. единиц передачи сетевого трафика. В зависимости от конфигурации сети, tcpdump может прослушивать не только пакеты, предназначенные данному MAC-адресу, но и широковещательные пакеты. Прослушивание перехват сетевых пакетов основан на "беспорядочном" (promiscuous) режиме работы сетевого адаптера.

В зависимости от используемого сетевого оборудования для соединения компьютеров в сети Ethernet существуют следующие возможности прослушивания трафика :

  • В сети на основе концентраторов весь трафик с концентратора хаба доступен любому сетевому хосту.
  • В сетях на основе коммутаторов (свичей) сетевому хосту доступен только ее трафик, а также весь широковещательный трафик данного сегмента.
  • Некоторые управляемые коммутаторы имеют функцию копирования трафика данного порта на порт мониторинга ("зеркалирование",мониторинг порта).
  • При использовании специальных средств (ответвителей), включаемых в разрыв сетевого подключения и передающих трафик подключения на отдельный порт возможно прослушивание соответствующего порта.
  • "Трюк" с концентратором - порт коммутатора, трафик которого необходимо прослушать, включают через концентратор, подключив к концентратору также узел-монитор (при этом в большинстве случаев уменьшается производительность сетевого подключения).

Итак, утилита tcpdump входит в большинство дистрибутивов Unix и позволяет перехватывать и отображать/сохранять в файл сетевой трафик. Утилита использует библиотеку libpcap . Для Windows тоже существует порт . Для работы утилиты ее необходимо . Например, в Debian она устанавливается с помощью команды:

Debian:~# apt-get install tcpdump

Для работы утилиты необходимы (т.к. изменяются настройки сетевого интерфейса - переводится в "безпорядочный" режим). В общем случае формат команды tcpdump имеет следующий вид:

Debian:~# tcpdump <опции> <фильтр>

Опции утилиты tcpdump

-i интерфейс

Задает интерфейс, с которого необходимо анализировать трафик (без указания интерфейса - анализ "первого попавшегося").

Отключает преобразование IP в доменные имена. Если указано -nn, то запрещается преобразование номеров портов в название протокола.

Наиболее часто используемые фильтрующие параметры команды tcpdump:

dst хост

Проверяет, совпадает ли адрес получателя IP-пакета с указанным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

src хост

Проверяет, совпадает ли адрес отправителя IP пакета с указанным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

host хост

Проверяет, совпадает ли адрес отправителя или получателя с заданным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

net имя_сети

Проверяется, находится ли адрес отправителя/получателя в заданной сети. Возможно указание сети в формате CIDR (например 10.0.0.1/22), либо указание имени сети, заданной в .

ip | arp | rarp | tcp | udp | icmp [хост]

Проверяет, принадлежит ли пакет одному из указанных протоколов и при указании адреса хоста проверяет, совпадает ли адрес отправителя\получателя с заданным. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

dst port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт назначения заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

src port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт источника заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт назначения или источника заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

ip broadcast

Проверяется, является ли IP пакет широковещательным.

ether { src | dst | host } MAC_адрес

Проверяется, принадлежит ли сетевой пакет источнику, назначению, источнику или назначению имеющему заданный MAC_адрес.

ether broadcast

Проверяется, является ли ARP-пакет широковещательным.

Примеры использования команды tcpdump

Анализ трафика на сетевом уровне (ARP, ICMP) с помощью tcpdump

Предположим, у нас имеется 2 хоста. Хост 1 с интерфейсом eth0 и следующими параметрами:

Host1:~# ip addr show dev eth0 5: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff inet 192.168.56.1/24 brd 192.168.56.255 scope global eth0 inet6 fe80::800:27ff:fe00:0/64 scope link valid_lft forever preferred_lft forever

А так же хост2 с интерфейсом eth1

Host2:~# ip addr show dev eth1 3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff inet 192.168.56.33/24 scope global eth1 inet6 fe80::a00:27ff:fefd:e5aa/64 scope link valid_lft forever preferred_lft forever

Предположим, что до текущего момента сетевого обмена данными между хостами не происходило и если на хосте 2 запустить команду ip neigh show, то будет видно что в ARP-таблице нет записей. Проведем маленький эксперимент. Запустим на одном из виртуальных интерфейсов host1 утилиту tcpdump:

Host1:~# tcpdump -ne -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

Host1:~# ping -c 1 192.168.56.33 PING 192.168.56.33 (192.168.56.33) 56(84) bytes of data. 64 bytes from 192.168.56.33: icmp_req=1 ttl=64 time=1.06 ms --- 192.168.56.33 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.067/1.067/1.067/0.000 ms

После этого в ARP-таблице системы host1 появилась запись об IP-адресе машины host2:

Host1:~# ip neigh show dev eth0 192.168.56.33 lladdr 01:00:27:77:e5:00 HOST2

На виртуальной консоли tcpdump нам отобразил следующую информацию:

Host1:~# tcpdump -ne -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:16:29.465780 0a:00:27:00:00:00 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.56.33 tell 192.168.56.1, length 28 12:16:29.466786 01:00:27:77:e5:00 > 0a:00:27:00:00:00, ethertype ARP (0x0806), length 42: Reply 192.168.56.33 is-at 01:00:27:77:e5:00, length 28 12:16:29.466815 0a:00:27:00:00:00 > 01:00:27:77:e5:00, ethertype IPv4 (0x0800), length 98: 192.168.56.1 > 192.168.56.33: ICMP echo request, id 5284, seq 1, length 64 12:16:29.467934 01:00:27:77:e5:00 > 0a:00:27:00:00:00, ethertype IPv4 (0x0800), length 98: 192.168.56.33 > 192.168.56.1: ICMP echo reply, id 5284, seq 1, length 64 ^C 4 packets captured 4 packets received by filter 0 packets dropped by kernel

Каждая запись о сетевом пакете в таком формате содержит время перехвата пакета, MAC-адреса отправителя и получателя, тип протокола, длину пакета и сведения о содержимом пакета. Первая запись описывает широковещательный ARP-запрос с MAC-адреса интерфейса eth0 системы host1 ("У кого адрес 192.168.56.33, это говорит 192.168.56.1 "). Вторая запись - ответ с MAC-адреса машины host2 на MAC-адрес системы host1 ("192.168.56.33 имеет MAC-адрес 01:00:27:77:e5:00 "). Третья и четвертая записи (ICMP-запрос и ICMP-ответ ) являются результатом работы команды ping на системе host1. Далее работа tcpdump была прервана . Перед завершением работы tcpdump печатает статистику работы: количество перехваченных, полученных фильтром и отброшенных ядром пакетов

Таким образом, система host1 для того, чтобы отправить стандартный эхо-запрос машине host2, предварительно по протоколу ARP получила MAC-адреса машины host2 и внесла его с привязкой к IP-адресу в свою ARP-таблицу.

Анализ трафика на транспортном уровне (TCP, UDP) с помощью tcpdump

Предположим на системе host2 установлен некий WEB-сервер. Попробуем на машине host1 открыть страницу с этого web-сервера с помощью консольного браузера lynx:

Host1:~# lynx 192.168.56.33

На другой консоли предварительно запустим tcpdump с фильтрующими параметрами:

Host1:~# tcpdump -n -i eth0 host 192.168.56.33 and port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:44:37.837393 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [S], seq 1209026235, win 5840, options , length 0 15:44:37.838118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 370041518, ack 1209026236, win 5792, options , length 0 15:44:37.838157 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 1, win 46, options , length 0 15:44:37.839254 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 1:222, ack 1, win 46, options , length 221 15:44:37.839921 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 222, win 1716, options , length 0 15:44:37.848118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 1:446, ack 222, win 1716, options , length 445 15:44:37.848156 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 446, win 54, options , length 0 15:44:37.849738 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 446, ack 222, win 1716, options , length 0 15:44:37.850366 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 222, ack 447, win 54, options , length 0 15:44:37.851267 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 223, win 1716, options , length 0 …

В данном примере клиент (192.168.56.1) c TCP-порта 41533 устанавливает соединение с сервером (192.168.56.33), слушающим на порту 80, делает запрос, получает необходимые данные и соединение завершается.

Заголовок TCP-сегмента, помимо номеров портов получателя и отправителя содержит ряд параметров:

  • Номер последовательности (seq). Определяет порядок следования байт в отправляемом в сеть потоке (смещение первого байта в сегменте относительно начала потока данных).
  • Подтвержденный номер (ACK). Максимальный номер байта в полученном сегменте увеличенный на 1. Отправляемые отправителю подтверждения одновременно служат запросом новой порции данных.
  • Управляющие флаги (SYN - S, ACK, FIN -F , RST - R , PSH - P, URG)
  • Окно (win) - количество байтов данных, ожидаемых отправителем данного, начиная с байта номер которого указан в поле ack. Для оптимизации передачи отправитель не ждет подтверждения для каждого отправленного сегмента, а может отправить в сеть группу сегменту (но в байтах не больше размера окна). Если качество канала плохое (много запросов на повторную передачу, теряются подтверждения) окно уменьшается, если хорошее - окно увеличивается.
  • Опции . Используются для решения вспомогательных задач. Например, передается MSS (Maximum segment size) - максимальный размер сегмента.

Процесс установления двунаправленного соединения по протоколу TCP отражают первые три записи tcpdump:

  • Клиент отправляет серверу TCP-сегмент с установленным флагом SYN, начальным "случайным" номером (1209026235), с которого будут нумероваться байты в отправляемом им потоке, максимальный размер окна - объем, который разрешено передавать серверу без подтверждения от клиента (5840): 15:44:37.837393 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [S], seq 1209026235, win 5840, options , length
  • Сервер отправляет клиенту TCP-сегмент с установленными флагами SYN и ACK, начальным "случайным" номером (370041518), с которого будут нумероваться байты в отправляемом им потоке, и максимальный размер окна для клиента (5792). Данный сегмент также является подтверждением получения запроса на установление соединения от клиента: 15:44:37.838118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 370041518, ack 1209026236, win 5792, options , length
  • Клиент отправляет серверу TCP-сегмент с установленным флагом ACK, который является подтверждением получения сегмента от сервера (далее tcpdump отображает относительные значения seq и ask): 15:44:37.838157 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 1, win 46, options , length

После этого соединение считается установленным .

В следующей паре записей клиент передает в секции данных сегмента серверу запрос протокола прикладного уровня (221 байт) и получает от сервера подтверждение его получения:

15:44:37.839254 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 1:222, ack 1, win 46, options , length 221 15:44:37.839921 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 222, win 1716, options , length 0

При этом флаг PSH (P) используется для оповещения отправляющей стороны о том, что принимающая готова принимать данные. Далее сервер отправляет данные клиенту (445 байт) и получает от него подтверждение получения:

15:44:37.848118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 1:446, ack 222, win 1716, options , length 445 15:44:37.848156 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 446, win 54, options , length 0

Затем по инициативе сервера соединение завершается. Сервер шлет пакет с установленным флагом FIN:

15:44:37.849738 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 446, ack 222, win 1716, options , length 0

Клиент в ответ также отправляет пакет с установленным флагом FIN, данный пакет одновременно является подтверждением получения запроса на завершение соединения от сервера:

15:44:37.850366 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 222, ack 447, win 54, options , length 0

Серверу остается лишь подтвердить получение FIN-сегмента от клиента:

15:44:37.851267 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 223, win 1716, options , length 0

Реакция tcpdump на попытку подключения к закрытому порту 23/tcp:

21:56:14.381091 IP 192.168.56.1.54040 > 192.168.56.33.23: Flags [S], seq 2956835311, win 5840, options , length 0 21:56:14.381688 IP 192.168.56.33.23 > 192.168.56.1.54040: Flags , seq 0, ack 2956835312, win 0, length 0

В данном примере с системы 192.168.56.1 делается попытка подключится к несуществующему TCP-сервису на узле 192.168.56.33. Удаленная система реагирует отправкой сегмента с установленным флагом RST (сброса соединения).

Реакция tcpdump на отправку UDP-датаграммы на закрытый порт 53/udp:

21:55:16.925906 IP 192.168.56.1.41979 > 192.168.56.33.53: 6561+ A? www.tut.by. (28) 21:55:16.926615 IP 192.168.56.33 > 192.168.56.1: ICMP 192.168.56.33 udp port 53 unreachable, length 64

В данном примере сделана попытка отправить UDP-датаграмму на несуществующий порт удаленной системы. Протокол UDP обычно реагирует отправкой ICMP-сообщения исходному узлу о недостижимости порта.

Другие примеры использования команды tcpdump:

# tcpdump -n -i ppp0 ether src 11:20:b3:d8:d8:2c

Вывод сетевой статистики с интерфейса ppp0 (-i ppp0) без преобразования IP в DNS (-n) тех фреймов, у которых MAC-адресом источника равен 11:20:b3:d8:d8:2c.

# tcpdump -n -e -i vlan0 ether broadcast

Вывод широковещательного трафика с интерфейса vlan0.

# tcpdump -n -i eth0 src 192.168.66.1

Фильтруются сетевые пакеты, в заголовке которых в поле источник указан IP-адрес192.168.66.1.

# tcpdump -n -i eth0 host 192.168.66.1

Фильтруются пакеты, в которых данный IP-адрес указан как источник или как получатель пакета.

# tcpdump -n -i eth0 src net 10.0.0.0 mask 255.0.0.0

Фильтруются пакеты, в которых источником указаны узлы сети 10.0.0.0/8.

# tcpdump -n -i eth0 icmp

Вывод только ICMP-пакетов с интерфейса eth0.

На этом, пожалуй, закончу текущую статью. По мере появления новых примеров буду дополнять статью. Надеюсь, что материал будет полезен не только мне

В статье были использованы примеры и некоторые материалы лекций intuit .

С Уважением, Mc.Sim!

Для UNIX-систем есть множество самых разнообразных снифферов и анализаторов трафика с удобным графическим интерфейсом и богатым набором функций. Но ни один из них не может сравниться в гибкости, универсальности и распространенности со старым как мир tcpdump. Эта утилита входит в состав многих дистрибутивов Linux и всех BSD-систем из коробки и сможет выручить тебя, когда другие средства будут недоступны.

Введение

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

Tcpdump появился на свет почти 25 лет назад в университете Беркли, до сих пор активно развивается и продолжает оставаться эталоном среди подобных инструментов для операционной системы UNIX. Разработанная специально для него библиотека захвата пакетов libpcap сегодня используется чуть ли не каждым сниффером для UNIX-систем и многими аналогичными программами для Windows.

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

Наедине с консолью

Попробуем разобраться, как работает tcpdump и с какой стороны следует к нему подходить. Открой терминал и запусти программу с правами пользователя root (как и любой сниффер, tcpdump должен иметь полный доступ к сетевым интерфейсам), указав имя сетевого интерфейса и ограничив количество выводимых пакетов десятью:

# tcpdump -i wlan0 -c 10 -n

Ключ -n отключает преобразование IP-адресов в DNS-имена. Теперь попытаемся отследить обмен только с конкретным хостом, например с домашним роутером:

# tcpdump -i wlan0 -c 10 -n host 192.168.0.1 and port 53

Давай посмотрим, что же нам вывел tcpdump, на примере двух строк, представленных на скриншоте «DNS-запрос глазами tcpdump». Можно легко понять, что это DNS-запрос (порт 53) с хоста 192.168.0.101 хосту 192.168.0.1 и последующий за ним ответ. Но что значат все остальные цифры и знаки?


Цифры 16:22:41.340105 - это время отправки пакета, включая миллионные доли секунды (так называемый frac). Две буквы IP, как нетрудно догадаться, идентифицируют используемый протокол сетевого уровня, далее следуют адрес: порт отправки и адрес: порт назначения пакета. Все, что идет после двоеточия, напрямую зависит от используемого протокола транспортного или прикладного уровня. С некоторыми протоколами tcpdump знаком и умеет расшифровывать их до понятного человеку вида, другие он оставляет как есть и просто приводит содержимое пакета. В данном случае tcpdump расшифровал DNS-сообщения и вернул строку 49244+ A? ya.ru. (23) , что означает: был послан запрос (A?) адреса, ассоциированного с именем ya.ru., общая длина пакета за вычетом TCP/IP-заголовков составила 23 байт. Первая цифра - это идентификатор запроса.

В следующей строке мы видим ответ, формат представления которого практически аналогичен запросу, с той лишь разницей, что теперь после идентификатора запроса идет информация о количестве найденных записей (8/2/3) и сами записи (A 213.180.204.3, A 77.88.21.3, A 87.250.250.3...).

В арсенале tcpdump есть поддержка многих протоколов, благодаря чему он может представить в читаемом виде информацию о протоколах TCP, UDP и ICMP, SMB/CIFS, NFS, AFS, AppleTalk. Но что, если tcpdump ничего не знает об используемом протоколе прикладного уровня или не может определить его? В обычной ситуации он просто выведет информацию о пакете. Она может выглядеть примерно так:

Flags [.], seq 3666073194:3666074622, ack 3281095139, win 2000, options , length 1428

Это TCP-пакет, формат представления информации о котором в tcpdump следующий (поля разделяются запятыми):

  • flags - установленные флаги. Обозначаются символами S (SYN), F (FIN), P (PUSH) и R (RST), точка означает отсутствие установленных флагов;
  • data-seqno - описывает данные, содержащиеся в пакете, в таком формате: first:last, где first и last - номер последовательности первого и последнего байта передаваемых данных, nbytes;
  • ack - следующий номер последовательности (ISN + 1);
  • window - размер окна;
  • options - здесь могут указываться дополнительные сведения, например (максимальный размер сегмента);
  • length - длина пакета.

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

# tcpdump -i wlan0 -c 10 -n -X host 192.168.0.1 and port 80

Эту функцию очень удобно использовать для анализа протоколов, в которых передача данных идет открытым текстом, например HTTP. Для бинарных протоколов и протоколов с шифрованием она, конечно же, будет бесполезна.
Кроме того, для получения дополнительных сведений о пакете можно использовать флаг -v. Тогда после IP в скобках появится подробная информация об IP-пакете:

(tos 0x0, ttl 64, id 8339, offset 0, flags , proto UDP (17), length 51)

В общем-то, здесь все довольно прозаично. Вначале идет тип обслуживания (TOS), далее время жизни пакета (TTL), идентификатор пакета, смещение от начала первого пакета в цепочке, флаги, используемый прокол транспортного уровня (TCP, UDP, ICMP) и длина.


Продвинутые возможности

Мы уже рассмотрели большинство самых важных возможностей tcpdump, но его функциональность намного шире. Например, мы использовали операторы host и port для указания нужных нам адреса и порта для фильтрации вывода, но что, если нам надо увидеть только пакеты, идущие к указанному адресу, но не исходящие с него? Для этого можно использовать оператор src:

# tcpdump -i wlan0 -c 10 -n src 192.168.0.1

Есть и его обратный вариант dst, предназначенный для указания адреса назначения. Как было показано выше, все операторы можно комбинировать с помощью оператора and (мониторинг сетевого трафика, исключая SSH-сессии и DNS-запросы):

# tcpdump -i wlan0 port not 22 and port not 53

Также можно использовать or (или) и except (не). Кроме того, tcpdump понимает диапазоны портов:

# tcpdump -i wlan0 -c 10 -n portrange 21-23

Умеет отфильтровывать пакеты по их размеру:

# tcpdump -i wlan0 -c 10 -n > 32 and <= 128

И понимает маски подсетей:

# tcpdump -i wlan0 c 10 -n src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

Одна из самых интересных возможностей tcpdump - это умение фильтровать пакеты по содержанию конкретных битов или байтов в заголовках протоколов. Для этого используется такой формат: proto, где proto - протокол, expr - смещение в байтах от начала заголовка пакета, а size - необязательное поле, указывающее на длину рассматриваемых данных (по умолчанию 1 байт). Например, чтобы отфильтровать только пакеты с установленным флагом SYN (инициация TCP-рукопожатия), следует использовать такую запись:

# tcpdump "tcp==2"

Как это работает? Очень просто. 13 байт TCP-заголовка содержит флаги, ровно восемь штук, по биту на каждый. Под флаг SYN отведен второй бит. Приведенная запись просто проверяет факт установки этого бита. Кстати, более читаемый вид этой записи будет выглядеть так:

# tcpdump "tcp & tcp-syn != 0"

Практическое использование

Утилиту tcpdump принято использовать для двух целей: для отладки сети, сетевых приложений и новых протоколов и для обучения основам TCP/IP. Мы пойдем другим путем и воспользуемся возможностями tcpdump для выявления фактов сканирования хоста и проведения сетевых атак.

На рис. 1 показано, как выглядит классический TCP-скан портов, выполненный утилитой Nmap, в логах tcpdump. Хорошо видно, как Nmap с адреса 192.168.0.100 пытается установить TCP-соединение с разными портами, посылая SYN-пакет (S в поле флагов). Сначала идет проба порта 8888, в ответ приходит RST-пакет, а это значит, что порт не прослушивается ни одним сервисом, далее проба порта 587 с тем же результатом. Наконец, Nmap посылает SYN-пакет на 22-й порт (SSH) и получает ответ в виде пакета SYN-ACK:

192.168.0.100.43337 > 192.168.0.111.22: Flags [S], seq 2610024277, ... 192.168.0.111.22 > 192.168.0.100.43337: Flags , seq 3496707239, ack 2610024278, ... 192.168.0.100.43337 > 192.168.0.111.22: Flags [.], ack 1, ...

Порт открыт, и теперь Nmap может успешно закрыть соединение с помощью отправки RST-пакета и перейти к следующим портам. Однако он поступает умнее: посылает подтверждение приема ACK-пакета и сразу переходит к следующим портам. Такое поведение позволяет обойти некоторые системы обнаружения вторжений, но человека, вооруженного сниффером, так просто не проведешь.

Обрати внимание также на номера перебираемых портов, они не генерируются рандомно, а подбираются с учетом наибольшей распространенности. Это значит, что производится быстрое сканирование, а если точнее, Nmap, скорее всего, запущен вообще без каких-либо флагов.



Теперь рассмотрим другой метод обнаружения открытых портов - SYN-сканирование (nmap -sS). Такой вид скана принято называть скрытым, потому что во время его никогда не устанавливается полное TCP-соединение, а значит, информация о факте соединения не попадает в логи. Вывод tcpdump для такого вида скана представлен на рис. 2. Он очень похож на лог обычного TCP-сканирования, однако реакция сканера на открытые порты теперь другая:

192.168.0.100.48585 > 192.168.0.111.22: Flags [S], seq 1679394613, ... 192.168.0.111.22 > 192.168.0.100.48585: Flags , seq 625029896, ack 1679394614, ... 192.168.0.100.48585 > 192.168.0.111.22: Flags [R], seq 1679394614, ...

Видно, что после получения одобрительного пакета SYN-ACK сканер не завершает установку соединения, а сразу обрывает его, уходя от попадания в логи. На рис. 3 можно видеть результат UDP-сканирования. Здесь все очень просто, Nmap перебирает порты с возможными UDP-сервисами, посылая на каждый из них пакет нулевой длины. Если порт закрыт, ОС посылает в ответ сообщение ICMP unreachable:

16:41:48.798310 IP 192.168.0.100.61020 > 192.168.0.111.18869: UDP, length 0 16:41:48.798346 IP 192.168.0.111 > 192.168.0.100: ICMP 192.168.0.100 udp port 18869 unreachable, length 36

В противном случае порт считается открытым. Еще один метод сканирования: null-сканирование с помощью отправки пакетов, не содержащих ни одного установленного флага (nmap -sN). Реакция на такие пакеты может быть разной в зависимости от используемой ОС, но, как видно по следующему листингу, Linux отвечает на них посылкой RST-пакетов:

192.168.0.100.39132 > 192.168.0.111.256: Flags , win 3072, length 0 192.168.0.111.256 > 192.168.0.100.39132: Flags , ...

Также атакующий может применять Xmas-сканирование, при котором пакеты имеют установленные флаги FIN, URG и PUSH (пакет как бы светится флагами, как новогодняя елка):

192.168.0.100.35331 > 192.168.0.111.5544: Flags , seq 3998959601, win 4096, urg 0, length 0 192.168.0.111.5544 > 192.168.0.100.35331: Flags , seq 0, ack 3998959602

Как видно, реакция на такие пакеты идентичная. ACK-сканирование (-sA) будет выглядеть в логах tcpdump как отправка множества пакетов с установленным флагом ACK и ответ на них в виде посылки пакетов RST. Однако, если в системе установлен брандмауэр, ответных сообщений приходить не будет, и Nmap сможет понять, фильтруется ли порт.

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

16:43:06.008305 IP 192.168.0.100 > 192.168.0.111: ICMP type-#68, length 1032 16:43:06.008383 IP 192.168.0.100 > 192.168.0.111: ICMP type-#34, length 1032 16:43:06.008714 IP 192.168.0.100 > 192.168.0.111: ICMP type-#183, length 1032 16:43:06.008831 IP 192.168.0.100 > 192.168.0.111: ICMP type-#192, length 1032

Особую важность здесь имеет поле, содержащее время приема пакета. Ни одно нормальное приложение не будет слать множество ICMP-сообщений за промежуток времени, равный одной тысячной секунды. Другие виды флуда (например, SYN) определяются точно таким же образом.

Взаимодействие с другими программами

Одно из самых важных достоинств tcpdump заключается в том, что формат его отчетов за время существования программы фактически стал стандартом для всех снифферов и сегодня его понимают все более или менее серьезные инструменты анализа трафика. Например, tcpdump можно использовать для генерации дампа на удаленной машине, а затем отправить его на локальную и провести анализ с помощью wireshark:

$ ssh [email protected] tcpdump -w - "port !22" | wireshark -k -i -

Здесь мы использовали опцию -w - для записи дампа в стандартный вывод и перенаправили его wireshark, работающему на локальной машине. Таким же образом можно проанализировать трафик с помощью snort:

$ ssh [email protected] "tcpdump -nn -i eth1 -w -" | snort -c /etc/snort/snort.conf -r -

Перенаправив вывод программы на вход grep, можно найти различные проблемы в работе сети, например выявить пакеты с неправильной контрольной суммой, вывести информацию о которой можно с помощью флага -vv:

# tcpdump -nnvv -r dump.cap tcp | grep -v "tcp sum ok" | wc –l

Админские штучки

Возможность фильтрации пакетов по данным, содержащимся в заголовке, которую мы рассмотрели в начале первого раздела, очень удобно использовать для отладки различных протоколов и поиска сетевых проблем. Например, мы можем применить ее для отлова сетевых пакетов, передаваемых по протоколу Cisco Discovery Protocol, по которому маршрутизаторы Cisco обмениваются информацией о топологии и состоянии сети:

# tcpdump -nn -v -i eth0 -s 1500 -c 1 "ether == 0?2000"

Таким же образом можно отловить все пакеты, передаваемые по протоколу DHCP (DISCOVER, REQUEST, INFORM), чтобы выявить проблемы подключения клиентов:

# tcpdump -i eth0 -vvv -s 1500 "((port 67 or port 68) and (udp = 0x1))"

Или поймать пакеты, передаваемые в рамках POP3-аутентификации:

# tcpdump -i eth0 "tcp port pop3 and ip = 85 and ip = 83" -s 1500 -n

Сетевой grep

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

Например, чтобы найти параметры, передаваемые методами GET и POST в рамках HTTP-сессии, можно использовать следующую команду:

# ngrep -l -q -d eth0 "^GET |^POST " tcp and port 80

Выявляем бездельников:

# ngrep -i "game*|p0rn|adult" -W byline -d eth0 > slackers.txt

Анализируем SMTP-трафик на всех сетевых интерфейсах:

# ngrep -i "rcpt to|mail from" tcp port smtp

Опции tcpdump

Таблица наиболее интересных и полезных флагов tcpdump.

  • -i [интерфейс] - прослушиваемый сетевой интерфейс, для всех следует указать any.
  • -n - не преобразовывать IP-адреса в DNS-имена.
  • -nn - не преобразовывать IP-адреса и номера портов.
  • -X - показывать содержимое пакета в текстовом и шестнадцатеричном форматах.
  • -XX - то же самое плюс содержимое Ethernet-фрейма.
  • -v, -vv, -vvv - увеличить количество показываемой информации и пакетов (больше, еще больше, все).
  • -c [n] - показывать только первые n пакетов.
  • -s [n] - количество байтов, отображаемых для каждого пакета (можно уменьшить для удобства чтения или увеличить для получения большей информации).
  • -S - показывать абсолютные номера TCP-последовательности (TCP sequence numbers).
  • -e - показывать заголовки Ethernet-фреймов.
  • -q - показывать меньше информации (для удобства чтения).
  • -E - расшифровать IPsec-трафик с помощью указанного ключа.
  • -w - сохранить дамп программы в файл, аргумент - используется для указания stdout.

Выводы

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

Утилита tcpdump - это очень мощный и популярный инструмент для перехвата и анализа сетевых пакетов. Она позволяет просматривать все входящие и исходящие из определенного интерфейса пакеты и работает в командной строке. Конечно, вы могли бы пользоваться Wirshark для анализа сетевых пакетов, это графическая утилита, но иногда бывают ситуации когда нужно работать только в терминале.

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

Во многих дистрибутивах команда tcpdump поставляется по умолчанию, но если в вашем дистрибутиве ее нет, то вы можете очень просто ее установить из официальных репозиториев. Например, в Ubuntu/Debian:

sudo apt install tcpdum p

В Fedora/Red Hat/CentOS:

sudo yum install tcpdump

Когда установка завершится, вы можете переходить к работе.

Команда tcpdump

Перед тем как перейти к примерам работы с утилитой, давайте рассмотрим ее синтаксис и основные опции. Команда имеет такой синтаксис:

$ tcpdump опции -i интерфейс фильтры

При вызове обязательно нужно передать интерфейс, который будете отслеживать. Если интерфейс не указать, то будет использован первый в списке. Опции настраивают отображение и основные возможности утилиты, а фильтры позволяют отсеять ненужные пакеты. А теперь рассмотрим основные опции:

  • -A - выводить все пакеты в формате ASCII;
  • -c - закрыть программу после перехвата n-ого количества пакетов;
  • -C - при записи пакетов в файл, проверять размер файла, и если он больше заданного - создать новый файл;
  • -D - вывести список доступных сетевых интерфейсов;
  • -e - выводить информацию уровня соединения для каждого пакета, это может быть полезно, например, для отображения MAC адреса;
  • -f - выводить доменное имя для ip адресов;
  • -F - читать пакеты из файла, а не интерфейса;
  • -G - создавать новый файл лога через указанный промежуток времени;
  • -H - обнаруживать заголовки 802.11s;
  • -i - имя интерфейса для перехвата пакетов. Вы можете захватывать пакеты со всех интерфейсов, для этого укажите any;
  • -I - переключить интерфейс в режим монитора для захвата всех проходящих пакетов;
  • -j - установить формат Timestamp для записи пакетов;
  • -J - посмотреть доступные Timestamp;
  • -K - не проверять контрольные суммы пакетов;
  • -l - добавить поддержку прокрутки к выводу;
  • -L - вывести поддерживаемые протоколы подключения для интерфейса;
  • -n - не отображать доменные имена;
  • -r - прочитать пакеты из файла, созданного с помощью -w;
  • -v, -vv, -vvv - более подробный вывод;
  • -q - выводить минимум информации;
  • -w - записать вывод в файл;
  • -Z - пользователь, от имени которого будут создаваться файлы.

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

Как пользоваться tcpdump

Перед тем как перейти к использованию tcpdump нужно посмотреть какие сетевые интерфейсы вы можете использовать. Для этого запустите команду с опцией -D:

Начнем рассматривать примеры 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 , length 1448

Такой формат характерен для пакетов данных, в зависимости от протокола выделенный черным текст будет отличаться. Сначала идет временная метка, затем протокол, далее зеленым отмечен ip адрес отправителя, а синим адрес адресата, в данном случае, нашего компьютера. Дальше идут дополнительные параметры tcp и в конце размер пакета в байтах. Подробность вывода информации можно контролировать с помощью опций -v, Например:

sudo tcpdump -v -i eth0

Здесь уже появляется информация о протоколе IP:

IP (tos 0x0, ttl 64 , id 50309, offset 0, flags , 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:

tcpdump greater 128

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 будет намного проще, если у вас остались вопросы, спрашивайте в комментариях!

На завершение видео с лекцией о tcpdump:

Довольно часто в системном администрировании возникают ситуации, для которых необходимо видеть подробную «картину» того, что происходит с передачей данных по сети. Проследить за трафиком и выявить проблемы в таких случаях позволяют утилиты-анализаторы пакетов. Одной из таких (и самой распространённой) является tcpdump – стандартный анализатор пакетов для Linux-систем.

Кроме tcpdump существуют и другие инструменты для анализа сетевого трафика, например такие как Wireshark и Tshark, которые являются усовершенствованными версиями tcpdump, но стандартным и до сих пор эффективным остаётся утилита tcpdump. С её помощью можно перехватывать, фильтровать по определённому критерию, а также выводить пакеты. Нужно заметить, что для полноценного доступа к пакетам необходимо запускать tcpdump от имени суперпользователя, поскольку сами пакеты - это низкоуровневые объекты системы. Кроме этого существуют определённые условия, в зависимости от сетевого оборудования, которые позволяют (или не позволяют) перехватывать все или только определённые пакеты или предоставлять только определённую информацию о них. Сетевое оборудование (сетевая карта, маршрутизатор и т. д.) должны поддерживать/разрешать доступ к пакетам, т. е. иметь (или предоставлять) механизм для передачи сведений о пакетах на более высокий программный уровень и в этом случае tcpdump, как впрочем и другие анализаторы пакетов, оказываются максимально эффективными. Кстати, аппаратные интерфейсы, если они работают в режиме «promiscuous mode», т. е. в так называемом «беспорядочном» режиме, позволяют системному ядру «видеть» все пакеты, т. е. даже и те, что адресуются для других компьютеров и устройств.

Принцип работы tcpdump

Как уже отмечалось, tcpdump является стандартной утилитой для анализа сетевого трафика в дистрибутивах Linux. Автором утилиты является Ван Якобсон. За всё время своего применения tcpdump проявил себя как весьма эффективный и надёжный инструмент. Поэтому в настоящее время многие аналоги в качестве основного формата файлов для чтения/записи результатов трассировки трафика используют формат tcpdump – libcap.

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

tcpdump опции

Для задания нужного сетевого интерфейса следует использовать опцию -i. Если необходимо знать адреса устройств (компьютеров, оборудования), то нужно задавать опцию -n. Это также очень полезно при проблемах с DNS. Опция -r позволяет читать информацию о пакетах из файла. Когда необходимы более подробные сведения о пакетах - поможет опция -v. Также существует опция -w для фиксирования информации в файле. Следует отметить, что в случае использования опции -w в файл записывается информация только о заголовках пакетов. Опция -s со значением 1056 (хотя это значение зависит от размера MTU-пакета) позволяет (совместно с -w) писать в файл дополнительную информацию. Объёмы данных могут быть очень большими и сложными по своей структуре (несмотря на то, что это текст) и поэтому в дальнейшем для их обработки рекомендуется использовать соответствующие высокопроизводительные утилиты, например .

Формат команды tcpdump следующий:

tcpdump [-опции] [фильтры]

В официальной документации (команда man tcpdump) можно найти несколько примеров использования этой утилиты для разных случаев с применением довольно разнообразных и сложных фильтров.

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

Наиболее часто используемые ключи при запуске tcpdump приведены таблице

ключ

описание

Преобразовывает сетевые и широковещательные адреса в доменные имена.

Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров.

Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться.

Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию - eth0, для выбора всех интерфейсов - any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.

Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:

shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log

Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит ‘net’ вместо ‘net.library.org’

Отображает IP-адрес вместо имени хоста.

Отображает номер порта вместо используемого им протокола.

Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).

Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.

Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.

Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number - ISN) в относительные.

Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet).

Не отображает метку времени в каждой строке.

Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.

Отображает неформатированную метку времени в каждой строке.

Показывает время вместе с датой.

Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)

Вывод ещё более полной информации, в основном касается NFS и SMB.

Вывод максимально подробной информации.

Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —

Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s

-x , но включает в себя заголовок канального уровня

Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.

То же, что и предыдущий параметр -X , но включает заголовок канального уровня.

tcpdump завершит работу после получения указанного числа пакетов.

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

Фильтры tcpdump

Фильтры разделяются на следующие классификации

host — адрес узла сети

port – порт на котором нужно ловить пакеты

portrange – диапазон портов

net – сеть

Tcpdump net 192.168.0.0/24

захват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24

Tcpdump port 80

Будет захватываться весь трафик на 80-м порту.

Направление трафика по отношению к объекту мониторинга

src – отправитель

dst — получатель

например команда

Src host 172.31.25.200

Захват трафика у которого отправитель ip адрес 172.31.25.200

Протокол

ether – базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес

ip – протокол IPv4

ip6 – протокол IPv6

arp – протокол ARP

tcp – протокол TCP

udp – протокол UDP

Если протокол не указан, то будет захвачен трафик по все протоколам

Например команда

Udp port 5060

захват трафика по протоколу udp порт 5060

Составные фильтры

Для того что бы более гибко фильтровать трафик можно использовать логические операции

«И» – and (&&)

«ИЛИ» – or (||)

«НЕ» – not (!) – инверсия значения

При этом приоритет этих операций следующий:

наивысшим приоритетом обладает операция инверсии

потом логическое «И»

наименьшим приоритетом обладает операция «ИЛИ».

Приоритет операций можно менять с помощью круглых скобок.

(net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80

захват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе

(net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80

захват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе

tcpdump linux примеры

Запись вывода в файл

$ sudo tcpdump -w sshtrace.tcpdump tcp port 22

Файл sshtrace.tcpdump при этом будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла myrouter.tcpdump следует использовать опцию -r:

$ tcpdump -r sshtrace.tcpdump

Снять весь трафик с интерфейса eth1

$ tcpdump –i eth1

Снять трафик с диапазона портов на интерфейсе eth1

$ tcpdump -i eth1 portrange 100-200

весь трафик, идущий к 172.16.0.1, который не является ICMP.

Dec 19, 2011 By Henry Van Styn
in HOW-TOs

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

tcpdump - важнейший инструмент прослушивания трафика, или снифинга, он предоставляет множество возможностей анализа и даже может экспортировать интерпретированные поля пакетов в другие программы.

Если вы думаете, что утилиты, подобные tcpdump, утрачивают свое значение с появлением графических инструментов типа Wireshark, подумайте еще раз. Wireshark - отличное приложение, однако вовсе не универсальный инструмент абсолютно для всех ситуаций. В качестве универсального легковесного решения для различных применений (как например юниксовые инструменты cat, less и hexdump) tcpdump смотрится намного круче. И наиболее впечатляющая его особенность, это удобство использования. В качестве стиля поведения он следует приближению к концепции "команды в одну строку" для получения быстрых одноходовых ответов. Кроме того его можно применять в рамках ssh-сессии без нужды использования графики. Благодаря поддержке соглашений синтаксиса командной строки (например, выдача выходного потока данных на стандартный вывод, который можно перенаправить) tcpdump может быть использован во всех типах конвейеров для построения интересных и полезных утилит.

В настоящей статье я рассмотрю некоторые базовые принципы использования tcpdump и основы его синтаксиса.

Основы

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

Поскольку предполагается, что вы интересуетесь бОльшим, чем только пакеты для вашей системы, tcpdump переведет первый интерфейс в системе (если прямо не указан другой) в беспорядочный режим автоматически. Эта операция требует привилегий суперпользователя.

Анатомия команд tcpdump

Команда tcpdump состоит из двух частей: опций и выражения для фильтра (Figure 1).

Figure 1. Example tcpdump Command

Выражение для фильтра определяет, какие пакеты захватывать, а опции - какие из них показывать в выводе, также опции отвечают за поведение утилиты.

Опции

Опции tcpdump следуют стандартным соглашениям командной строки, поэтому формат опций - флаг-значение. Некоторые флаги не имеют значения параметра, потому что сами являются переключателями. Например, за -i следует имя интерфейса, а -n выключает разрешение имен через DNS.

Страница руководства man описывает множество опций, но есть некоторое множество их, без которых не обойтись:

I interface: интерфейс, на котором tcpdump будет прослушивать трафик;

V, -vv, -vvv: многословность вывода;

Q: тихий режим;

E: печатать заголовки кадров канального уровня (Ethernet);

N: разрешать доменные имена хостов;

T: не печатать временнЫе метки;

N: не разрешать доменные имена хостов;

S0 (or -s 0): максимальный захват, пакеты захватываются целиком; в последних версиях tcpdump это поведение по умолчанию.

Ни одна опция не является обязательной. Определяемые пользователем значения только изменяют поведение программы по умолчанию, в котором предусмотрен захват на первом интерфейсе и вывод информации о пакетах в одну строку.

Выражения для фильтра
Выражения для фильтра есть булевы критерии (да/нет) для оценки совпадения пакета с образцом. Все пакеты, не соответствующие заданным условиям, игнорируются.

Синтаксис пакетного фильтра мощный и прозрачный. В начале он содержит ключевые слова, называемые "примитивы", которые представляют собой различные классификаторы для пакетов, это могут быть протокол, адрес, порт или направление. Они могут быть соединены между собой в цепочки с помощью операторов и/или, сгруппированы и объединены правилами наследования, отсортированы с помощью отрицания.

Благодаря говорящим именам критериев, выражения для фильтров обычно выглядят как "самообъясняющие" свою суть конструкции, из-за этого их довольно легко конструировать и понимать. Полностью синтаксис описан в man-странице pcap-filter, здесь же представлены некоторые примеры:

ARP - простой протокол, он используется для разрешения IP-адресов в MAC-адреса сетевых карт. Как можно видеть выше, tcpdump описывает эти пакеты в довольно-таки примитивной манере. Пакеты DNS, с другой стороны, будут описаны несколько по-другому:

IP 10.0.0.2.50435 > 10.0.0.1.53: 19+ A? linuxjournal.com. (34) IP 10.0.0.1.53 > 10.0.0.2.50435: 19 1/0/0 A 76.74.252.198 (50)

Поначалу это может показаться недостаточно ясным, но по мере изучения того, как работают протоколы различных уровней, наполнится смыслом. DNS намного более сложный протокол, чем ARP, но кроме этого он работает на более высоком уровне. Это означает, что пакеты нижележащих протоколов также отображаются в выводе. В отличие от ARP, который не маршрутизируется между различными физическими сегментами сети, DNS это протокол для всего Интернета. Для маршрутизации этих пакетов используется уровень IP, для транспорта задействован UDP. Это делает DNS протоколом пятого уровня (IP - третий уровень, UDP - четвертый).

Информация уровней UDP/IP, содержащая адрес и порт источника, отображается в левой стороне строки, специфическая DNS-информация - в правой. Несмотря на то, что синтаксис довольно сжатый, он достаточен для определения базовых элементов DNS. Первый пакет есть запрос адреса для linuxjournal.com, второй пакет - это ответ, дающий адрес 76.74.252.198. Это типичная последовательность для простых DNS-запросов.

Просмотрите секцию "OUTPUT FORMAT" справки man для tcpdump для полного описания всех протокол-зависимых форматов вывода. Пакеты некоторых протоколов видны в выводе лучше, другие хуже, но важная информация обычно находится легко.

Захват вывода в файл
Помимо обычного режима с выводом информации на консоль (стандартный вывод), tcpdump также поддерживает режим записи вывода в файл. Режим активируется опцией -w, в которой задается путь к файлу.

При записи в файл tcpdump использует другой формат, чем при выводе на экран. Это так называемый сырой вывод, в нем не производится первичный анализ пакета. Эти файлы можно затем использовать в сторонних программах типа Wireshark, потому что формат записей в файл соответствует универсальному формату "pcap" (на ввод tcpdump такой файл можно подать с помощью опции -r). Эта возможность позволяет нам захватывать пакеты на одной машине, а анализировать на другой. Например, у вас на ноутбуке есть Wireshark. Вам не потребуется его подключать к анализируемой сети, чтобы просканировать захваченный ранее файл.

Анализ протоколов на основе TCP
tcpdump - это пакетный анализатор, поэтому он хорошо работает с протоколами, основанными на работе с отдельным пакетом, например, IP, UDP, DHCP, DNS и ICMP. Если же есть некий "поток", или последовательность пакетов для установления соединения, tcpdump не сможет напрямую анализировать эти потоки и сценарии соединений. Такие протоколы, как HTTP, SMTP и IMAP с точки зрения сетевого взаимодействия гораздо больше похожи на интерактивные приложения, чем "пакетные" протоколы.

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

Трюк со строками
Обычно при захвате трафика я имею в виду цель анализа причин каких-то ошибок. Данные вовсе не должны быть идеальными для просмотра, чтобы понять причины каких-либо инцидентов. В таких случаях скорость понимания важнее всего остального. Следующий трюк - это одна из самых любимых моих техник работы с tcpdump. Это работает потому что:

TCP сегмены обычно идут в хронологическом порядке;
- протоколы приложений, основанных на тексте, генерируют пакеты с текстовой нагрузкой;
- данные, окружающие текстовую нагрузку (например, хэдеры пакетов) - это не текст;
- UNIX-утилиты могут сохранять текст из бинарного вывода приложений;
- если запускать tcpdump с опцией -w -, он будет генерировать на стандартный вывод сырую информацию.

Соединив все вместе, получим инструмент для захвата данных HTTP-сессий.

Кроме того, вы должны понимать, что в выводе может содержаться некоторое количество мусора. Лишнее можно отрезать с помощью опции утилиты strings, которая ограничивает длину вывода строки (смотри man strings).

Этот трюк довольно хорошо работает для любых протоколов, основанных на тексте.

Анализ HTTP и SMTP
Трюк со строками из предыдущего раздела может помочь для захвата данных сессий HTTP, несмотря на отсутствие встроенного анализатора потоков. Полученные данные можно "проанализировать" и потом множеством различных способов.

Например, вам вздумалось проверить доступность всех сайтов, в имени которых есть "davepc", в реальном времени. Поможет такая команда, запущенная на файерволе (подразумевается, что внутренний интерфейс eth1):

Это только два простых примера для иллюстрации возможностей. Вы же можете пойти настолько далеко, что, например, напишете скрипт на Perl для более глубокого анализа полученных строк.

Таким образом, настоящая мощь tcpdump проявляется в тех случаях, когда вы хотите быстро получить ответы на некоторые вопросы без особых усилий. Особенно это важно при отладке сетевых приложений.

Отладка маршрутизации и соединений VPN
tcpdump может здорово помочь при отладке таких вещей, как соединения VPN. Все, что нужно, это понять, на каких хостах какие пакеты появляются, на каких нет.

Возьмем стандартную схему соединения двух сетей через VPN-соединение. Сети 10.0.50.0/24 и 192.168.5.0/24 (Figure 2).

Figure 2. Example VPN Topology

Если это работает правильно, хосты из разных сетей должны пинговать друг друга. Если же ответы на пинги не приходят (в данном случае предположим, что они не приходят от D к хосту А), мы можем использовать tcpdump для обнаружения, где чего теряется.

Если пакеты запроса идут на хост С (удаленный шлюз), но не на D, это показывает, что само соединение VPN работает, но имеются проблемы маршрутизации. Если хост D получает запросы, но не оправляет ответы, это может означать, что протокол ICMP заблокирован. Если же ответы отправляются, но не доходят до С, возможно на D неправильно настроен шлюз по умолчанию.

Похожие публикации