Перейти к основному содержанию

tcpdump — анализатор сетевого трафика

Network

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

Wireshark — анализатор сетевого трафика

PktMon — анализатор сетевого трафика

netsh trace — анализатор сетевого трафика

Для Windows есть клон под названием WinDump, использующий библиотеку WinPcap.

Пример вывода:

# tcpdump -c 3 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:37:04.377578 IP postfix02.local.60408 > dns00.local.domain: 15157+ MX? mail.ru. (25)
16:37:04.378106 IP dns00.local.domain > postfix02.local.60408: 15157 1/3/5 MX mxs.MAIL.ru. 10 (203)
16:37:04.378489 IP postfix02.local.56235 > dns00.local.domain: 20730+ [1au] A? mxs.MAIL.ru. (40)
3 packets captured
8 packets received by filter
0 packets dropped by kernel

net

Ссылки

Официальный сайт tcpdump:

http://www.tcpdump.org/

WinDump:

https://www.winpcap.org/windump/default.htm

Документация для пользователей WinDump:

http://www.tcpdump.org/wpcap.html

Флаги

  • SYN (S) — флаг, который используется при запросе на соединение.
  • ACK (.) — используется при подтверждении пришедшего пакета.
  • FIN (F) — флаг устанавливается при нормальном закрытии соединения.
  • URGENT (U) — этот флаг нужен при передаче экстренных данных, например, при посылке Ctrl+C в telnet-соединении.
  • PUSH (P) — как правило, данный флаг устанавливается при передаче пользовательских данных.
  • RESET (R) — немедленный разрыв соединения.
  • Заполнитель (none) — данный заполнитель используется в случае, если в пакете отсутствует какой-либо флаг.

Ключи

Команда имеет синтаксис:

 tcpdump опции -i интерфейс фильтры
  • -a — Преобразовывает сетевые и широковещательные адреса в доменные имена.
  • -e — Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров.
  • -F файл — Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться.
  • -i — Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.
  • -l — Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:
    shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log
  • -N — Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит 'net' вместо 'net.library.org'.
  • -n — Отображает IP-адрес вместо имени хоста.
  • -nn — Отображает номер порта вместо используемого им протокола.
  • -p — Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).
  • -q — Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.
  • -r — Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.
  • -S — Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные.
  • -s число — Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet).
  • -t — Не отображает метку времени в каждой строке.
  • -T тип — Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.
  • -tt — Отображает неформатированную метку времени в каждой строке.
  • -tttt — Показывает время вместе с датой.
  • -v — Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков).
  • -vv — Вывод ещё более полной информации, в основном касается NFS и SMB.
  • -vvv — Вывод максимально подробной информации.
  • -w файл — Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w -.
  • -x — Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s.
  • -xx — То же, что и предыдущий параметр -x, но включает в себя заголовок канального уровня.
  • -X — Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.
  • -XX — То же, что и предыдущий параметр -X, но включает заголовок канального уровня.
  • -с число — tcpdump завершит работу после получения указанного числа пакетов. TБез ключа -c tcpdump будет продолжать собирать пакеты до тех пор, пока не будет прерван сигналом SIGINT (обычно CTRL+C) или сигналом SIGTERM (обычно kill). Если запуск был с ключем -c, то сбор пакетов будет продолжаться до тех пор, пока не произойдет прерывание сигналом SIGINT или SIGTERM или пока не будет обработано указанное количество пакетов.
  • -U — Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится.

Часто используемые фильтрующие параметры

  • dst хост — адрес получателя. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.
  • src хост — адрес отправителя. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.
  • host хост — адрес отправителя или получателя. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.
  • net имя_сети — адрес отправителя или получателя в заданной сети. Возможно указание сети в формате CIDR (например 10.0.0.1/22), либо указание имени сети, заданной в файле /etc/networks.
  • ip | arp | rarp | tcp | udp | icmp [хост] — пакет одного из указанных протоколов для адреса отправителя или получателя. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.
  • [tcp | udp] dst port номер_порта — пакет протоколов TCP/UDP и порт получателя. Можно указать номер порта, либо имя, заданное в файле /etc/services.
  • [tcp | udp] src port номер_порта — пакет протоколов TCP/UDP и порт отправителя. Можно указать номер порта, либо имя, заданное в файле /etc/services.
  • [tcp | udp] port номер_порта — пакет протоколов TCP/UDP и портотправителя или получателя. Можно указать номер порта, либо имя, заданное в файле /etc/services.
  • ip broadcast — широковещательный IP пакет.
  • ether { src | dst | host } MAC_адрес — MAC_адрес отправителя или получателя.
  • ether broadcast — широковещательный ARP-пакет.

Примеры

Определить интерфейсы, которые можно использовать:

tcpdump -D

Сетевой интерфейс:

tcpdump -i eth2

Пакеты от определенного хоста:

tcpdump host nameofserver

Обмен nameofserverA и nameofserverB:

tcpdump host nameofserverA and nameofserverB

Только исходящие пакеты:

 tcpdump src host nameofserver

Только входящие пакеты:

tcpdump dst host nameofserver

Порт получателя:

tcpdump dst port 80

Порт отправителя:

tcpdump src port 22

UDP-пакеты, приходящие из внешней сети:

tcpdump udp and not src net localnet

Весь входящий трафик из локальной сети на сервер:

tcpdump -i eth0 -n -nn -ttt dst host 192.168.1.11

Весь входящий трафик из локальной сети на сервер, исключая трафик текущей SSH-сессии:

tcpdump -i eth0 -n -nn -ttt 'dst host 192.168.1.11 and not ( src host 192.168.2.22 and dst port 22 )'

UDP трафик между сервером и узлом сети:

tcpdump -i eth0 -n -nn -ttt 'host 192.168.2.22 and ip proto \udp'

DNS трафик между сервером и узлом сети:

tcpdump -i eth0 -n -nn -ttt 'host 192.168.2.22 and port 53'

icmp пакеты:

tcpdump -i eth0 -n -nn -ttt 'ip proto \icmp'

Трафик на основе определенных флагов TCP:

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

Все пакеты (ACKNOWLEDGE) :

tcpdump 'tcp[13] & 16!=0'
tcpdump 'tcp[tcpflags] == tcp-ack'

Все пакеты (PUSH) :

tcpdump 'tcp[13] & 8!=0'
tcpdump 'tcp[tcpflags] == tcp-psh'

Все пакеты (RESET) :

tcpdump 'tcp[13] & 4!=0'
tcpdump 'tcp[tcpflags] == tcp-rst'

Все пакеты (SYNCHRONIZE) :

tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'

Все пакеты (FINISH) :

tcpdump 'tcp[13] & 1!=0'
tcpdump 'tcp[tcpflags] == tcp-fin'

Все пакеты (URGENT) :

tcpdump 'tcp[13] & 32 != 0'
tcpdump 'tcp[tcpflags] == tcp-urg'

Все пакеты (SYNCHRONIZE/ACKNOWLEDGE) :

tcpdump 'tcp[13]=18'

Все пакеты (SYNCHRONIZE/RESET) :

tcpdump 'tcp[13] = 6'

grep и egrep добавляет возможности, например, поиск User Agent:

tcpdump -vvAls0 | grep 'User-Agent:'

Сбор cookie:

tcpdump -vvAls0 | egrep 'Set-Cookie:|Cookie:'

FTP трафик:

tcpdump -vvAs0 port ftp or ftp-data

NTP трафик:

tcpdump -vvAs0 port 123

Для специалистов по информационной безопасности, сбор паролей:

tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user ' 

Не забываем о:

man tcpdump

Теги

 

Похожие материалы

ethtool — утилита для работы с сетевыми интерфейсам в Linux

В помощь системным администраторам полезная Linux-утилита ethtool для получения информации о сетевых интерфейсах и изменения низкоуровневых параметров сетевых карт.

Теги

Установка и настройка keepalived на примере MultiFactor Ldap Adapter

Есть два сервера с операционной системой Ubuntu 20.04.4 LTS. Но обоих серверах развёрнут LDAP proxy сервер на базе Multifactor. По сути это обычные LDAPS сервера, которые неплохо было бы объединить в один отказоустойчивый кластер Master— Slave с плавающим виртуальным IP-адресом. Сделаем это с помощью keepalived.