Tcpdump — утилита для анализа и перехвата сетевого трафика. Используется для диагностики сетевых проблем. Можно увидеть какими пакетами обмениваются устройства, какие порты используются,
Официальный сайт проекта: https://www.tcpdump.org/
Как выглядит вывод команды?
Один перехваченный пакет — одна строка в выводе.
12:54:21.590381 IP 10.20.3.215 > 10.100.1.50: ICMP echo request, id 27945, seq 1, length 64
В строках может содержаться информация:
- Метка времени
- Протокол
- IP адрес или имя источника
- Исходящий порт
- IP адрес или имя назначения
- Порт назначения
- Флаги
- Порядковый номер пакета
- Номер подтверждения
- Размер окна в байтах
- Длина полезной нагрузки
Завершение работы утилиты — Ctrl+C
Флаги TCP
Может быть более одного значения в одном пакете.
- S – SYN
- F – FIN
- . – ACK
- P – PUSH
- R – RST
tcpdump ‘tcp[tcpflags] == tcp-rst’
Запуск утилиты:
Запускаем с правами root
Опции запуска
tcpdump -D – вывод всех доступных для захвата трафика сетевых интерфейсов
tcpdump –list-interfaces – оно же.
Для фильтрации вывода используется язык BPF.
Например
sudo tcpdump port 53.
Здесь port 53 – это BPF фильтр.
Другие BPF – фильтры:
- port
- portrange
- net
- mask
- host
- src
- dst
- tcp
- udp
- icmp
- greater
- ip6
- less
- <=
для комбинирования фильтров можно использовать логические операторы
- and
- or
- not
Например
tcpdump -A greater 1000 and \(src host amazon.com or src host tcpdump.com\)
Скобки здесь нужны чтобы размер пакета учитывался для обоих источников. «\» — потому что это shell-команда.
tcpdump -A greater 1000 and \(src host amazon.com or tcpdump.com\) – тоже работает. Исключили повторяющиеся идентификаторы.
tcpdump `greater 1000 and (src host amazon.com or tcpdump.com)` — тоже работает
Для просмотра файла дампа в Wireshark нужно сохранить вывод в файл с расширением .pcap и открыть его в wireshark.
Как передать вывод tcpdump в wireshark:
ssh <remote.ip> tcpdump -pni any -w — -s0 -U port dest_port | wireshark -k -i – для трансляции вывода из tcpdump в wireshark.
Запись в файл: sudo tcpdump host host_ip -w filename -c 10000 (записывает только 10000 пакетов)
-i – для фильтра по интерфейсу. Рекомендуется указывать интерфейс или писать -i any, т.к. по дефолту интерфейс может быть неподходящий.
-w – для записи в файл
-c – количество пакетов
-A – полный вывод содержимого пакетов в формате ASCII (-X – для вывода в HEX-формате). -x – вывод в hex-режиме первых 82 байт пакета. Для вывода ethernet-заголовка используется -xx (добавит 14 байт).
(можно использовать ngrep)
-n – запрет трансляции ip адресов в имена (по умолчанию транслируется).
В случае большого количества улавливаемых пакетов, постоянные DNS-запросы замедляют и даже могут приостановить работу tcpdump, также эту опцию нужно использовать при отсутствии связи с DNS-сервером или при его некорректной работе.
-e – информация L2 . Например MAC-адреса
-P — показывает только пакеты, которые приходят или отправляются с данного IP.
Флаги -v, -vv и -vvv влияют на подробность вывода.
-t – исключить timestamp
-tt – timestamp – количество секунд, отсчитываемое от 1.01.1970
-ttt – разница между этой строкой и предыдущей.
-tttt – удобный вывод времени
-r – прочитать записанный дамп
-s – размер захватываемого пакета. По дефолту, когда дамп сохраняется в файл, сохраняется только 68 байт данных каждого пакета. -s 0 – говорит сохранять пакет целиком.
Примеры
tcpdump src net 10.208.148.0 mask 255.255.255.0
tcpdump src net 10.208.148.0/24
tcpdump -ni eth1 greater 1000 – захватывает пакеты размером более 1000 байт
См. также https://packetlife.net/media/library/12/tcpdump.pdf
Список литературы
- Let’s learn tcpdump! by Julia Evans.
- http://www.alexonlinux.com/tcpdump-for-dummies