Основные назначения tcpdump:
1.Отладка сетевых приложений.
2.Отладка сети и сетевой конфигурации в целом.
Tcpdump выводит заголовки пакетов проходящих через сетевой интерфейс, которые совпадают с булевым выражением. Он может также быть запущен с ключем -w, который заставляет сохранять данные пактов в файл для дальнейшего исследования, и/или с ключем -r, который заставляет читать сохраненные пакеты из файла, вместо чтения пакетов из сетевого интерфейса. В любом случае, tcpdump будут обработаны только те пакеты, которые совпадают с выражением.
Описание некоторых ключей tcpdump
1 |
-c count |
Выйти после получения определенного количества пакетов.
1 |
-C file_size |
Перед записью «сырого» пакета в файл, происходит проверка на превышение размером файла лимита, указанного в file_size. Если размер файла больше, то файл закрывается и открывается новый. Новый файл будет иметь имя определенное в ключе -w, со стоящим в конце числом 2, которое будет увеличиваться в следующих именах файлов. file_size определяет размер в миллионах байт (1,000,000), а не мегабайтах (1,048,576).
1 |
-F file |
Использовать file для ввода фильтрующего выражения. Выражение, указанное в командной строке, будет игнорироваться.
1 |
-i interface |
Собирать пакеты только на определенном интерфейсе. Если не указан — берется минимальный по номеру интерфейс (исключая loopback). Для Linux-ядер 2.2 и более новых, возможно указать ‘any’, тогда будет происходить сбор на всех интерфейсах, но они не будут переведены в режим promiscuous.
1 |
-n |
Не преобразовывать адрес хоста в имя. Может быть использовано, если необходимо избегать DNS-запросов.
1 |
-nn |
Не преобразовывать протокол и номер порта в их имена.
1 |
-N |
Не выводить доменную часть имени хоста. Например, при данном ключе будет выводится «nic» вместо «nic.ddn.mil»
1 |
-p |
Не переводить интерфейс в режим promiscuous. Следует заметить, что интерфейс может быть в режиме promiscuous по другим причинам.
1 |
-r file |
Читать пакеты из file (который, был создан с ключем -w). Если file указан как «-«, то используется стандартный ввод.
1 |
-t |
Не выводить временной штамп (timestamp) в каждой строке дампа (dump).
1 |
-tt |
Выводит не форматированный временной штамп в каждой строке дампа.
1 |
-ttt |
Выводить разницу (в микросекундах) между текущей и предыдущей строками дампа.
1 |
-tttt |
Выводить временной штамп вместе с датой в формате по-умолчанию в каждой строке дампа.
1 |
-v |
(Чуть более) подробный вывод. Для еще более подробного вывода используются: -vv и -vvv.
1 |
-w file |
Писать «сырые» пакеты в file перед тем как произвести их разбор и вывести. Они могут быть позднее выведены с ключем -r. Если file указан как «-«, то используется стандартный вывод.
1 |
-x |
Печатать каждый пакет (без заголовков уровня соединения) в шестнадцатиричном виде.
1 |
-X |
Помимо шестнадцатиричного вида выводить их ASCII-значения.
Описание фильтрующих выражений
Выражение выбирает какие пакеты будут выбираться из общего потока. Если оно не указано, то будут выбираться и выводится все пакеты идущие через интерфейс. Иначе, будут обработаны только те пакеты, для которых проверка с выражением выдаст значение «истина» (true).
Выражение состоит из одного или более примитивов. Примитивы обычно состоят из ID (имя или номер) следующего за одним или более классификаторами. Различают три вида классификаторов:
1 |
type |
Говорят к какому виду относить ID. Возможный значения
1 |
host, net или port |
Если классификатор type не указан, то подразумевается host.
1 |
dir |
Определяет конкретное направление передачи «к» и/или «от» ID. Возможны значения
1 |
src, dst, src or dst and src and dst |
Если не указан, то подразумевается src or dst. Для соединений нулевого (‘null’) уровня (к примеру, протокол точка-точка, такой как slip) указанием направления могут быть классификаторы inbound и outbound.
1 |
proto |
Ограничивает совпадение конкретным протоколом. Возможные протоколы:
1 |
ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp и udp |
.Если классификатор proto не указан, то подразумеваются все перечисленные типы протоколов. Например, ‘src foo означает ‘(ip or arp or rarp) src foo’, ‘net bar’ означает ‘(ip or arp or rarp) net bar’, а ‘port 53’ означает ‘(tcp or udp) port 53’.
В добавок, существует несколько специальных примитивов — ключевых слов:
1 |
gateway, broadcast, less, greater и арифметические выражения |
Более сложные фильтрующие выражения могут быть построены с помощью слов
1 |
and, or и not |
объединяющих примитивы. Чтобы уменьшить количество вводимой информации, идентичные списки классификаторов могут быть опущены. Пример, ‘tcp dst port ftp or ftp-data or domain’ это тоже самое, что и ‘tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain’
Некоторые из допустимых примитивов (за более полным списком в man tcpdump):
1 |
dst host host |
Истина, если поле «назначение» пакета -это host, который может быть адресом или именем
1 |
src host host |
Истина, если поле «источник» пакета — это host.
1 |
host host |
Истина, если или поле «назначение», или поле «источник» пакета — это host. Любое из описанный выше выражений может быть приписано к ключевому слову ip, arp, rarp, или ip6, как в ‘ip host host’, что эквивалентно ‘ether proto \ip and host host’. Если host — это имя с несколькими IP адресам, то проверяется совпадение по каждому адресу.
1 |
net net mask netmask |
Истина, если IP адрес входит в сеть с указанной сетевой маской. Может быть классифицировано с dst или src.
1 |
net net/len |
Истина, если IP адрес входит в сеть с указанной сетевой маской, заданной количеством бит. Может быть классифицировано с dst или src.
1 |
dst port port |
Истина, если пакет протоколов ip/tcp, ip/udp, ip6/tcp или ip6/udp, и порт-назначения имеет значение указанное в port. Порт может быть числом или именем, используемым в /etc/services. Если используется число или неоднозначное имя, то проверяется только номер порта (пример, ‘dst port 513’ будет выводить трафик и для tcp/login и для udp/who, а ‘port domain’ будет выводить трафик и для tcp/domain и для udp/domain).
1 |
src port port |
Истина, если пакет имеет порт-источник — port
1 |
port port |
Истина, если или порт-назначение, или порт-источник в пакете — port. Любое из описанных выше выражений может быть приписано к ключевому слову tcp или udp, как в ‘tcp src port port’, проверяющее совпадения только для TCP-пакетов.
1 |
less length |
Истина, если пакет имеет длину меньше или равную length. Это эквивалентно len <= length.
1 |
greater length |
Истина, если пакет имеет длину больше или равную length. Это эквивалентно len >= length.
1 |
ip proto protocol |
Истина, если пакет — это IP-пакет протокола, указанного в protocol. Протокол может быть числом или одним из имен icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, или tcp. Заметим, что идентификаторы tcp, udp и icmp — ключевые слова и должны быть «заэкранированы» через обратный слэш (\).
Примеры использования tcpdump
Cписок интерфейсов, по которым tcpdump можете прослушивать пакеты
1 |
# tcpdump -D |
Обмен пакетами между двумя серверами и с назначением/источником порта 2223 без вывода временной метки(-t), без преобразовывания адресов хоста в имена(-n), без преобразовывания протокола и номера порта в их имена(-nn)
1 |
# tcpdump -t -n -nn -i eth0 host 192.168.1.85 and 192.168.1.5 and port 2223 |
Аналогично,но с выводом максимольной информации(-vvv) и временного штампа вместе с датой в формате по-умолчанию в каждой строке дампа(-tttt)
1 |
# tcpdump -tttt -vvv -n -nn -i eth0 host 192.168.1.85 and 192.168.1.5 and port 2223 |
Сокращенный вывод информации
1 |
# tcpdump -t -n -nn -q -i eth0 |
Запись первых 10 пакетов(-с) для/с хоста 192.168.1.85 в файл tcpdump.txt (-w)
1 |
# tcpdump -t -n -nn -c 10 -w tcpdump.txt -i eth0 host 192.168.1.85 |
Чтение/ввод пакетов из файла(-r)
1 |
# tcpdump -r tcpdump.txt |
Захват любых пакетов , где хост назначения 192.168.1.85
1 |
# tcpdump -t -n -nn dst host 192.168.1.85 |
Захват любых пакетов , где хост источника 192.168.1.85
1 |
# tcpdump -t -n -nn src host 192.168.1.85 |
Захват любых пакетов с хоста 192.168.1.85
1 |
# tcpdump -t -n -nn host 192.168.1.85 |
Захват любых пакетов , где сеть источника 192.168.1.0/24
1 |
# tcpdump -t -n -nn src net 192.168.1 |
1 |
# tcpdump -t -n -nn src net 192.168.1.0/24 |
Захват любых пакетов , где сеть назначения 192.168.1.0/24
1 |
# tcpdump -t -n -nn dst net 192.168.1 |
1 |
# tcpdump -t -n -nn dst net 192.168.1.0/24 |
Захват любых пакетов с сети 192.168.1.0/24
1 |
# tcpdump -t -n -nn -i eth0 net 192.168.1 |
1 |
# tcpdump -t -n -nn -i eth0 net 192.168.1.0/24 |
Захват пакетов на/с порт/порта 80
1 |
# tcpdump -t -n -nn -i eth0 port 80 |
Захват пакетов протокола UDP c назначением на порт/порты из диапазона портов 1-1024
1 |
# tcpdump -t -n -nn -i eth0 udp dst portrange 1-1024 |
Захват пакетов c назначением для хоста 192.168.1.85 и с порта/на порт 22
1 |
# tcpdump -t -n -nn -i eth0 dst host 192.168.1.85 and port 22 |
Захват пакетов c назначением для хоста 192.168.1.85 и c назначением на порт 22
1 |
# tcpdump -t -n -nn -i eth0 dst host 192.168.1.85 and dst port 22 |
Захват пакетов c назначением для хоста 192.168.1.85 и c назначением на порт 80 или на порт 443
1 |
# tcpdump -t -n -nn -i eth0 "dst host 192.168.1.85 and (dst port 80 or dst port 443)" |
Захват всех пакетов на интерфейсе eth0 c/для хоста 192.168.1.85 и НЕ c/для хоста 192.168.1.5 и порта 22
1 |
# tcpdump -t -n -nn -i eth0 "host 192.168.1.85 and not ( host 192.168.1.5 and port 22 )" |
Захват всех UDP-пакетов на интерфейсе eth0, кроме тех, которые используют порты указанные в скобках.
1 |
# tcpdump -t -n -n -i eth0 udp and not "( port 53 or port 161 or port 137 or port 121 )" |
Захват всех icmp пакетов
1 |
# tcpdump -t -n -nn icmp |
Захват всех arp пакетов
1 |
# tcpdump -t -n -nn arp |
Захват всех arp или icmp пакетов
1 |
# tcpdump -t -n -nn "arp or icmp" |
Захват всех пакетов, кроме arp и icmp пакетов
1 |
# tcpdump -t -n -nn -i eth0 not arp and not icmp |
Захват всех широковещательных или многоадресных пакетов
1 |
# tcpdump -t -n -nn -i eth0 "broadcast or multicast" |
Захват всех пакетов на интерфейсе eth0 и отбражение их в кодировке ASCII
1 |
# tcpdump -t -n -nn -i eth0 -A |
Захват всех пакетов на интерфейсе eth0 и отбражение их в кодировке ASCII и в HEX-формате одновременно
1 |
# tcpdump -t -n -nn -i eth0 -XX |
Захват всех пакетов на интерфейсе eth0, длина которых больше 1024 байта
1 |
# tcpdump -t -n -nn -i eth0 greater 1024 |
Захват всех пакетов на интерфейсе eth0, длина которых меньше 1024 байта
1 |
# tcpdump -t -n -nn -i eth0 less 1024 |
Фильтрация пакетов на основании установленных флагов
Здесь выбирается только тринадцатый байт пакета и проверяется, если 32й бит не равен нулю, то пакет соответствует искомому.
Просмотр всех URGENT(URG)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 32!=0' |
Просмотр всех ACKNOWLEDGE(ACK)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 16!=0' |
Просмотр всех PUSH(PSH)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 8!=0' |
Просмотр всех RESET(RST)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 4!=0' |
Просмотр всех SYNCHRONIZE(SYN)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 2!=0' |
Просмотр всех FINISH(FIN)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 1!=0 |
Просмотр всех всех SYNCHRONIZE/ACKNOWLEDGE(SYN ACK)-пакетов
1 |
# tcpdump -t -n -nn 'tcp[13] & 18!=0' |
Источник
http://linuxshare.ru/docs/net/tcpdump.html
https://ru.wikipedia.org/wiki/Tcpdump
https://linux-notes.org/ustanovka-i-ispol-zovanie-tcpdump/