tcpdump

Дамп трафика сети

Синтаксис:

tcpdump [-AdDefKlLnNOpqRStuUvxX] [-c количество] [-C размер_файла] [-E spi-адрес алгоритм:секрет,...] [-F файл] 
[-G интервал_сек] [-i интерфейс] [-m модуль] [-M секрет] [-r файл] [-s размер_снимка] [-T тип] [-w файл] [-W число_файлов]
[-y тип_канала] [-z команда_postrotate] [-Z пользователь] [выражение]

Опции:

-A
Отображать каждый пакет (за исключением заголовка канального уровня) в кодировке ASCII. Эта опция удобна для захвата web-страниц.
-c количество
Завершить работу после получения указанного количества пакетов
-C размер_файла
Перед записью пакета в резервный файл проверять, не превышает ли текущий размер файла значение размер_файла; если размер превышен – закрыть текущий резервный файл и открыть новый. Имена резервных файлов, следующих за первым, устанавливаются опцией -w, к значению добавляется номер (начиная с 1) с соответствующим приращением. Аргумент размер_файла задается в миллионах байт (1 000 000 байт, не 1 048 576 байт).
-d
Вывести скомпилированный код сопоставления пакетов в удобочитаемом формате в стандартный поток вывода и завершить работу.
-dd
Вывести скомпилированный код сопоставления пакетов в виде фрагмента программы на языке С.
-ddd
Вывести скомпилированный код сопоставления пакетов в виде десятичных чисел (перед которыми указывается количество).
-D
Вывести список имеющихся в системе сетевых интерфейсов, на которых утилита tcpdump способна захватывать пакеты. Для каждого сетевого интерфейса выводится его номер и имя, а также текстовое описание этого интерфейса (по возможности). С помощью опции -i можно указать номер или имя интерфейса, с которого будет выполняться захват данных.

Эта опция может быть полезной при работе в системах, не имеющих команд выдачи списка интерфейсов (например, Windows-системы или UNIX- системы, в которых не реализована команда ifconfig -a); номер интерфейса можно использовать в системе Windows 2000 и более поздних, в которых имя интерфейса представляет собой достаточно сложную строку.
-e
Вывести на каждой строке дампа заголовок канального уровня.
-E spi@IP-адрес алгоритм:секрет,...
Аргумент spi -адрес алгоритм:секрет используется для декодирования пакетов IPsec ESP, отправленных на указанный адрес и содержащих индекс параметров безопасности (Security Parameter Index, spi). Можно указать несколько сочетаний, разделяя их запятыми или символами новой строки.

Note: Установка секрета для пакетов ESP IPv4 в настоящее время не поддерживается.

Алгоритм может принимать одно из следующих значений: Значение секрет представляет собой ASCII-текст секретного ключа ESP. Если перед ним указано 0x, то считывается шестнадцатеричное значение.

Данная опция соответствует ESP стандарта RFC 2406 (не RFC 1827). Она используется только для отладки, ее применение с настоящим значением "секретного" ключа не рекомендуется. Наличие секретного ключа IPsec в командной строке означает его доступность другим пользователям, например при выполнении команды ps и в других случаях.

Кроме вышеуказанного синтаксиса, можно использовать синтаксис имя_файла – в этом случае tcpdump считывает указанный файл. Открытие этого файла выполняется при поступлении первого пакета ESP, поэтому любые специальные полномочия, предоставленные утилите tcpdump, к этому моменту должны быть отменены.
-f
Вывести "чужие" адреса IPv4 в числовом виде (не в виде символов).

Проверка адресов IPv4 на принадлежность к "чужим" выполняется на основе адреса IPv4 и сетевой маски интерфейса, с которого производится захват. Если этот адрес или сетевая маска недоступны, ввиду отсутствия адреса или сетевой маски интерфейса, с которого выполняется захват, или захват выполняется с интерфейса "any" в Linux (который допускает захват с нескольких интерфейсов), то данная опция не будет работать корректно.
-F файл
Использовать файл в качестве входного для выражения фильтра. Любое последующее выражение в командной строке игнорируется.
-G интервал_сек
Если указана эта опция, то выполняется ротация файла дампа, заданного опцией -w, с периодом, равным значению интервал_сек в секундах. Резервные файлы именуются согласно имени в опции -w, при этом имена включают в себя время в формате функции strftime(). Если формат времени не указан, то каждым новым файлом предыдущий перезаписывается.

При использовании совместно с опцией -C файлы получают имена в формате файл <количество>.
-i интерфейс
Прослушивать интерфейс. Если эта опция не указана, утилита tcpdump выполняет поиск интерфейса с наименьшим номером, сконфигурированного и включенного в список интерфейсов системы (за исключением замыкающихся на себя). Поиск заканчивается на первом соответствующем интерфейсе.

В Linux-системе с ядром 2.2 или выше для аргумента интерфейс можно указать значение any, что означает захват пакетов со всех интерфейсов. Следует отметить, что сбор данных с устройства any не выполняется в режиме прослушивания трафика.

Номер интерфейса, полученный с помощью этой опции, можно использовать в качестве аргумента интерфейс.
-K
Не пытаться проверять контрольные суммы TCP. Эту опцию удобно использовать для интерфейсов, выполняющих расчет контрольной суммы TCP аппаратным способом; в противном случае все контрольные суммы TCP для исходящих данных отмечаются как неверные.
-l
("эль") Включить буферизацию строки stdout. Эта опция удобна для просмотра данных во время их захвата. Пример: tcpdump -l | tee dat или tcpdump -l > dat & tail -f dat.
-L
Вывести список известных типов каналов данных для указанного интерфейса и завершить работу.
-m модуль
Загрузить определения модулей SMI MIB из модуля файла. Эту опцию можно использовать несколько раз для загрузки в утилиту tcpdump нескольких модулей MIB.
-M секрет
Использовать значение секрет в качестве общего секрета для проверки профилей, найденных в сегментах TCP с опцией TCP-MD5 (RFC 2385), при наличии таковых.
-n
Не преобразовывать адреса (адреса хостов, номера портов и т.д.) в имена.
-N
Не выводить квалификацию доменных имен для имен хостов. Например, если указана эта опция, то утилита tcpdump, вместо строки nic.ddn.mil выводит значение nic.
-O
(прописная "О") Не использовать оптимизацию кода сопоставления пакетов. Эту опцию удобно применять только в случае предполагаемой ошибки в оптимизаторе.
-p
Не переводить интерфейс в режим прослушивания трафика. Следует отметить, что интерфейс может работать в режиме прослушивания трафика и по другой причине, поэтому опция -p не является сокращенной формой выражения ether host {local-hw-addr} or ether broadcast.
-q
Вывести краткую информацию; вывести меньше информации о протоколе для сокращения длины строк.
-R
Обрабатывать пакеты ESP/AH как соответствующие старой спецификации (RFC 1825–RFC 1829). Если указана эта опция, утилита tcpdump не выводит поле предотвращения повторной обработки. В спецификации ESP/AH отсутствует поле версии протокола, поэтому утилита tcpdump не может получить версию протокола ESP/AH.
-r файл
Считывать пакеты из файла файл (созданного с помощью опции -w). Если в аргументе файл указан символ -, утилита tcpdump использует стандартный поток ввода.
-S
Выводить абсолютные номера последовательностей TCP вместо относительных.
-s размер_снимка
Копировать из каждого пакета число байт, равное аргументу размер_снимка, вместо 68 по умолчанию (в NIT SunOS минимальное значение равно 96). 68 байт соответствуют стандартам IP, ICMP, TCP и UDP, но в них может не входить информация о протоколе, поступающая от сервера имен и из пакетов NFS (см. далее).

Пакеты, усеченные ввиду ограничения на размер снимка, отмечаются в выходных данных строкой [|протокол], где протокол – имя уровня протокола, на котором производится усечение.

Note: Создание снимков повышенного размера ведет к увеличению времени, затрачиваемого на обработку пакетов, и, как следствие, снижает объем буферизации пакетов. Это может приводить к потере пакетов. Значение размер_снимка следует ограничить наименьшим числом, позволяющим захватывать всю требуемую информацию о протоколе. Если размер_снимка имеет нулевое значение, то утилита tcpdump будет использовать размер, необходимый для захвата полных пакетов.

-T тип
Считать пакеты, соответствующие указанному выражению, пакетами указанного типа. В настоящее время поддерживаются следующие типы:
aodv
протокол ad hoc On-demand Distance Vector (Одноранговый вектор расстояний по запросу)
cnfp
протокол Cisco NetFlow
rpc
Remote Procedure Call (Удаленный вызов процедур)
rtp
протокол Real-Time Applications (Протокол приложений реального времени)
rtcp
протокол Real-Time Applications control (Протокол управления приложениями реального времени)
snmp
Simple Network Management Protocol (Простой протокол управления сетью)
tftp
Trivial File Transfer Protocol (Упрощенный протокол передачи файлов)
vat
Visual Audio Tool (Визуальный аудиоинструмент)
wb
распределенный протокол White Board (Белая доска)
-t
Не выводить метку времени на каждой строке дампа.
-tt
Вывести неформатированную метку времени на каждой строке дампа.
-ttt
Вывести разность времени (с точностью до микросекунды) между текущей и предыдущей строкой дампа на каждой строке дампа.
-tttt
Вывести метку времени в формате по умолчанию и дату после нее на каждой строке дампа.
-ttttt
Вывести разность времени (с точностью до микросекунды) между текущей и первой строкой дампа на каждой строке дампа.
-u
Вывести описатели NFS без декодирования.
-U
Включить для выходных данных, сохраняемых с помощью опции -w, буферизацию по пакетам, т.е. записывать каждый пакет в файл сразу при сохранении пакета, а не при заполнении выходного буфера.
-v
Вывести несколько расширенную информацию при синтаксическом анализе и выводе. Дополнительная информация включает в себя, например, предельное время существования, идентификатор, общую длину и опции в IP-пакете. Эта опция также активирует дополнительную проверку целостности пакетов, в том числе проверку контрольных сумм в заголовках IP и ICMP.

При записи в файл (с помощью опции -w) каждые 10 секунд сообщается количество захваченных пакетов.
-vv
Вывести более расширенную информацию. Например, выводятся дополнительные поля из пакетов ответа NFS и производится полное декодирование пакетов SMB.
-vvv
Вывести еще более расширенную информацию. Например, telnet SB ... Опции SE выводятся полностью. При использовании опции -X опции telnet дополнительно выводятся в шестнадцатеричной форме.
-w файл
Записывать необработанные пакеты в файл вместо их анализа и вывода. Вывести их можно с помощью опции -r. Если в аргументе файл указан символ -, утилита tcpdump использует стандартный поток вывода.
-W число_файлов
При использовании совместно с опцией -C эта опция ограничивает количество создаваемых файлов указанным числом, по достижении которого файлы перезаписываются с начала, т.е. использовать буфер с "ротацией". Также при этом в присваиваемые имена файлов добавляется достаточное число ведущих нулей, что позволяет поддерживать максимальное количество файлов и правильно сортировать их.

При использовании совместно с опцией -G эта опция ограничивает количество создаваемых "ротируемых" файлов дампа; при достижении этого количества утилита tcpdump завершает работу с нулевым статусом завершения. Если при этом указана и опция -C, то утилита tcpdump использует циклически перезаписываемые файлы за каждый интервал.
-x
При синтаксическом анализе и выводе дополнять выводимые заголовки каждого пакета данными каждого пакета (за исключением заголовка канального уровня) в шестнадцатеричном виде. Отправляется либо целый пакет, либо количество байт, равное размеру_снимка, в зависимости от того, какое из этих значений окажется наименьшим. Следует отметить, что в данном случае пакет – это полный пакет канального уровня; соответственно, для канальных уровней с заполнением (таких как Ethernet) в случаях, когда пакет более высокого уровня оказывается короче требуемой длины, будут выводиться и заполняющие байты.
-xx
При синтаксическом анализе и выводе дополнять выводимые заголовки каждого пакета данными каждого пакета, включая его заголовок канального уровня, в шестнадцатеричном виде.
-X
При синтаксическом анализе и выводе дополнять выводимые заголовки каждого пакета данными каждого пакета (за исключением заголовка канального уровня) в шестнадцатеричном виде и в ASCII. Это удобно для анализа новых протоколов.
-XX
При синтаксическом анализе и выводе дополнять выводимые заголовки каждого пакета данными каждого пакета, включая его заголовок канального уровня, в шестнадцатеричном виде и в ASCII.
-y тип_канала
Использовать при захвате пакетов тип канала передачи данных тип_канала.
-z команда_postrotate
При использовании этой опции совместно с опцией -C или -G утилита tcpdump выполняет команду команда_postrotate файл, где файл – резервный файл, который закрывается после каждой ротации. Например, выражение -z gzip или -z bzip2 активирует сжатие каждого резервного файла с помощью утилит gzip или bzip2.

Note: Утилита tcpdump запускает эту команду параллельно с захватом макетов с использованием самого низкого приоритета, во избежание нарушения процесса захвата.

При необходимости использования команды, у которой имеются собственные опции или различные аргументы, следует написать сценарий командного интерпретатора, для которого в качестве единственного аргумента будет указано имя резервного файла, внести в него требуемые опции и аргументы и затем выполнить необходимую команду.
-Z пользователь
Игнорировать полномочия (для пользователя root) и изменить идентификатор пользователя на пользователь, а идентификатор группы – на основную группу пользователя. Эту операцию можно активировать по умолчанию в процессе компиляции.

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

aarch64, arm, armv7, e2k, mips, ppc, x86

Описание:

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

Для получения информации об аргументе выражение см. раздел "Выражения" далее.

Если утилита tcpdump запущена без опции -c, она продолжает захват пакетов до прерывания работы по сигналу SIGINT (который подается, например, при вводе символа прерывания, т.е. Control - C) или SIGTERM (обычно подается командой kill); при запуске с опцией -c утилита tcpdump захватывает пакеты до прерывания работы по сигналу SIGINT или SIGTERM или достижения определенного количества обработанных пакетов.

По окончании захвата пакетов утилита tcpdump сообщает следующие количества:

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

В SunOS 3.x или 4.x с NIT или BPF:
Необходимо иметь доступ для чтения к каталогу /dev/nit или /dev/bpf*.
В Solaris с DLPI:
Необходимо иметь доступ для чтения и записи к сетевому псевдоустройству, например, /dev/le. Однако в некоторых версиях Solaris этого недостаточно для работы утилиты tcpdump в режиме прослушивания трафика; в этих версиях Solaris для захвата в режиме прослушивания трафика необходимо войти в систему с учетной записью root или установить tcpdump в качестве setuid для root. Следует отметить, что на многих (вероятно, всех) интерфейсах невозможно увидеть исходящие пакеты, если захват не выполняется в режиме прослушивания трафика, поэтому захват в другом режиме может оказаться не очень удобным.
В HP-UX с DLPI:
Необходимо войти в систему с учетной записью root или установить tcpdump в качестве setuid для root.
В IRIX со снупингом:
Необходимо войти в систему с учетной записью root или установить tcpdump в качестве setuid для root.
В Linux:
Необходимо войти в систему с учетной записью root или установить tcpdump в качестве setuid для root (в комплект поставки ОС может входить ядро, которое поддерживает, например, бит CAP_NET_RAW, и содержит код, который позволяет присваивать эти биты функций определенным учетным записям и устанавливать эти биты для начальных процессов пользователей, выполняемых при входе в систему; в этом случае необходим бит CAP_NET_RAW для захвата и бит CAP_NET_ADMIN для перечисления сетевых устройств с помощью, например, опции -D).
В ULTRIX и Digital UNIX/Tru64 UNIX:
Захват трафика с помощью утилиты tcpdump может выполнять любой пользователь. Тем не менее, прослушивание трафика на интерфейсе любым пользователем (в т.ч. суперпользователем) возможно только в том случае, если суперпользователь активирует работу с этим интерфейсом в режиме смешанного трафика с помощью утилиты pfconfig; кроме того, захват одноадресного трафика, принимаемого или посылаемого компьютером через интерфейс, любым пользователем (в т.ч. суперпользователем) возможен только в случае, если суперпользователь активирует работу с этим интерфейсом в режиме полного копирования с помощью утилиты pfconfig, поэтому для удобного захвата пакетов на этом интерфейсе может потребоваться активация работы в режиме прослушивания трафика или полного копирования или в обоих этих режимах на этом интерфейсе.
В BSD (в том числе Mac OS X):
Необходимо наличие доступа для чтения к каталогу /dev/bpf* (в системах, не имеющих устройства клонирования BPF) или каталогу /dev/bpf (в системах, имеющих это устройство). В системах BSD с поддержкой "devfs" (в том числе Mac OS X) в дополнение к установке принадлежности или полномочий на работу с устройствами BPF пользователем с полномочиями суперпользователя может потребоваться конфигурирование "devfs" для установки принадлежности и полномочий при каждой загрузке системы, если такая операция поддерживается в этой системе; если такая поддержка отсутствует, то потребуется найти другой способ для выполнения этой операции в процессе загрузки.

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

Выражения

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

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

тип
Тип объекта, с которым связан идентификатор (имя или номер). Допустимые типы: Примеры: host xyz, net 128.3, port 20, portrange 6000-6008. Если спецификатор типа не указан, утилита tcpdump использует тип host.
каталог
Определенное направление передачи – к идентификатору и/или от него. Допустимые направления: Примеры: src xyz, dst net 128.3, src or dst port ftp-data.

На некоторых канальных уровнях, таких как SLIP, и в режиме захвата "с обработкой" в Linux, используемом при работе с устройствами any и некоторых других, указать требуемое направление можно с помощью спецификаторов inbound и outbound.
протокол
Соответствие ограничивается определенным протоколом. Допустимые протоколы: Примеры: ether src xyz, arp net 128.3, tcp port 21, udp portrange 7000-7009.

Если спецификатор протокола не указан, используются все протоколы, совместимые с используемым типом. Например, запись src xyz аналогична записи (ip or arp or rarp) src xyz (однако синтаксис последнего выражения не является допустимым), запись net abc аналогична записи (ip or arp or rarp) net abc, запись port 53 – записи (tcp or udp) port 53.

Протокол fddi фактически является псевдонимом протокола ether; синтаксический анализатор рассматривает оба эти выражения как "канальный уровень передачи данных, используемый на определенном сетевом интерфейсе". Заголовки FDDI содержат адреса источника и назначения стандарта Ethernet, и, кроме того, часто содержат типы пакетов стандарта Ethernet; таким образом, можно производить фильтрацию по этим полям FDDI так же, как по аналогичным полям Ethernet. В заголовках FDDI имеются и другие поля, однако их невозможно указать явно каким-либо именем в выражении фильтра.

Записи tr и wlan также являются псевдонимами ether; вышеприведенные утверждения для заголовков FDDI справедливы и для заголовков Token Ring и беспроводных локальных сетей стандарта 802.11. В случае заголовков 802.11 адрес назначения содержится в поле DA, а адрес источника – в поле SA; поля BSSID, RA и TA не проверяются.

Помимо вышеперечисленных, имеется несколько специальных "примитивных" ключевых слов, не соответствующих описанному шаблону:

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

С помощью слов and, or и not можно комбинировать примитивы и создавать более сложные выражения фильтров. Пример: host xyz and not port ftp and not port ftp-data. Для сокращения ввода вручную можно не указывать спецификаторы в каждом из тех сочетаний, для которых они одинаковы. Например, выражение
tcp dst port ftp or ftp-data or domain

полностью аналогично выражению
tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain.

Допустимые примитивы:

dst host хост
Истинно, если значение в поле адреса назначения IPv4/v6 в пакете равно значению хост (адрес или имя).
src host хост
Истинно, если значение в поле адреса источника IPv4/v6 в пакете равно значению хост.
host хост
Истинно, если значение в поле адреса источника или адреса назначения IPv4/v6 в пакете равно значению хост.

Перед любым из вышеприведенных выражений для хоста можно указать ключевое слово ip, arp, rarp или ip6. Например, запись:
ip host хост

эквивалентна следующей записи:
ether proto \ip and host хост

Если аргумент хост является именем с несколькими IP-адресами, то проверка соответствия выполняется для каждого адреса.
ether dst хост_Ethernet
Истинно, если Ethernet-адрес назначения равен значению хост_Ethernet. Значение хост_Ethernet может быть именем из файла /etc/ethers или номером (формат номера см. в описании ethers(3N)).
ether src хост_Ethernet
Истинно, если Ethernet-адрес источника равен значению хост_Ethernet.
ether host хост_Ethernet
Истинно, если Ethernet-адрес источника или назначения равен значению хост_Ethernet.
gateway хост
Истинно, при передаче пакета хост использовался в качестве шлюза. Это означает, что Ethernet-адрес источника или назначения был равен значению аргумента хост, но в то же время хост не был ни источником, ни местом назначения IP. Аргумент хост должен представлять собой имя и должен обнаруживаться как механизмом преобразования имени хоста в IP-адрес (посредством файла имен хостов, DNS, NIS и т.д.) на компьютере, так и механизмом преобразования имени хоста в Ethernet-адрес (посредством файла /etc/ethers и т.д.) на компьютере. (Эквивалентное выражение:
ether host хост_Ethernet and not host хост В нем можно указать или имена, или номера хоста/хоста_Ethernet.) В настоящее время в конфигурации с IPv6 этот синтаксис не работает.
dst net сеть
Истинно, если номер сети в адресе назначения IPv4/v6 пакета совпадает со значением сеть. Аргумент сеть может представлять собой имя из базы данных сетей (/etc/networks и т.д.) или номер сети.

Номер сети IPv4 может быть записан как четыре числа, разделенные точками (например, 192.168.1.0), три числа, разделенные точками (например, 192.168.1), два числа, разделенные точками (например, 172.16) или одно число (например, 10); сетевая маска будет равна 255.255.255.255 для четырех чисел (что означает фактическое соответствие хосту), 255.255.255.0 для трех чисел, 255.255.0.0 для двух чисел и 255.0.0.0 для одного числа.

Номер сети IPv6 должен быть записан полностью; сетевая маска равна ff:ff:ff:ff:ff:ff:ff:ff, поэтому "сетевые" соответствия IPv6 всегда представляют собой фактическое соответствие хосту, а для сопоставления сетей требуется указать длину сетевой маски.
src net сеть
Истинно, если номер сети в адресе источника IPv4/v6 пакета совпадает со значением сеть.
net сеть
Истинно, если номер сети в адресе источника или адресе назначения IPv4/v6 пакета совпадает со значением сеть.
net сеть mask сетевая_маска
Истинно, если адрес IPv4 соответствует значению сеть с определенной сетевой маской сетевая_маска. Можно указать спецификатор src или dst. Следует отметить, что этот синтаксис не действует для аргументов сеть в формате IPv6.
net сеть/длина
Истинно, если адрес IPv4/v6 соответствует сети сеть с сетевой маской длиной, равной значению длина в битах. Можно указать спецификатор src или dst.
dst port порт
Истинно, если пакет имеет тип "ip/tcp", "ip/udp", "ip6/tcp" или "ip6/udp", и значение его порта назначения равно аргументу порт. Значение порт может представлять собой номер или имя из файла /etc/services. (Cм. описание tcp(4P) и udp(4P).)

Если используется имя, то выполняется проверка номера порта и протокола. Если используется номер или неоднозначное имя, то проверяется только номер порта (например, при использовании опции dst port 513 будет выводиться трафик "tcp/login" и "udp/who", а при использовании опции port domain – трафик "tcp/domain" и "udp/domain").
src port порт
Истинно, если значение порта источника пакета равно значению порт.
port порт
Истинно, если значение порта источника или порта назначения пакета равно значению порт.
dst portrange порт1-порт2
Истинно, если пакет имеет тип "ip/tcp", "ip/udp", "ip6/tcp" или "ip6/udp", и значение его порта назначения находится в диапазоне между значениями порт1 и порт2. Аргументы порт1 и порт2 анализируются таким же образом, что и параметр порт для port.
src portrange порт1-порт2
Истинно, если значение порта источника пакета находится в диапазоне между значениями порт1 и порт2.
portrange порт1-порт2
Истинно, если значение порта источника или порта назначения пакета находится в диапазоне между значениями порт1 и порт2.

Перед любым из вышеприведенных выражений для портов или диапазонов портов можно указать ключевые слова tcp или udp, например, следующим образом:
tcp src port порт

– этому выражению соответствуют только пакеты "tcp" с портом источника порт.
less длина
Истинно, если длина пакета не превышает значения длина или равна ему. Эквивалентное выражение:
len <= длина
greater длина
Истинно, если длина пакета превышает или равна значению длина. Эквивалентное выражение:
len >= длина
ip proto протокол
Истинно, если пакет представляет собой пакет IPv4 (см. описание ip(4P)) протокола типа протокол. Значение аргумента протокол может быть числом или одним из следующих имен:

Note: Идентификаторы tcp, udp и icmp одновременно являются ключевыми словами, поэтому их следует отделять обратной косой чертой (\), что в командном интерпретаторе csh будет выглядеть как \\. Этот примитив не относится к последовательности заголовка протокола.

ip6 proto протокол
Истинно, если пакет представляет собой пакет IPv6 протокола типа протокол. Следует отметить, что этот примитив не относится к последовательности заголовка протокола.
ip6 protochain протокол
Истинно, если пакет представляет собой пакет IPv6 и содержит заголовок протокола типа протокол в последовательности заголовка протокола. Например, выражению
ip6 protochain 6

соответствует любой пакет IPv6 с заголовком протокола TCP в последовательности заголовка протокола. Между заголовком IPv6 и заголовком TCP пакет может содержать, например, заголовок аутентификации, заголовок маршрутизации или заголовок опции "hop-by-hop" (с информацией, которая должна быть обработана каждым узлом по пути следования). Код BPF, создаваемый этим примитивом, достаточно сложен и не поддается оптимизации кодом оптимизатора BPF в tcpdump, поэтому его использование может привести к замедлению работы.
ip protochain протокол
Эквивалентно ip6 protochain протокол, но для стандарта IPv4.
ether broadcast
Истинно, если пакет является широковещательным Ethernet-пакетом. Ключевое слово ether является необязательным.
ip broadcast
Истинно, если пакет является широковещательным пакетом IPv4. Выполняется проверка на основе соглашений по широковещательной передаче "все нули" и "все единицы" и поиск маски подсети на том интерфейсе, с которого выполняется захват.

Если маска подсети интерфейса, с которого выполняется захват, недоступна вследствие отсутствия маски подсети на этом интерфейсе или выполнения захвата на интерфейсе "any" Linux, позволяющем производить захват с нескольких интерфейсов, то данная проверка будет некорректной.
ether multicast
Истинно, если пакет является многоадресным пакетом Ethernet. Ключевое слово ether является необязательным. Является сокращением выражения ether[0] & 1 != 0.
ip multicast
Истинно, если пакет является многоадресным пакетом IPv4.
ip6 multicast
Истинно, если пакет является многоадресным пакетом IPv6.
ether proto протокол
Истинно, если протоколом пакета является протокол типа ether. Значение аргумента протокол может быть числом или одним из следующих имен: Следует отметить, что эти идентификаторы одновременно являются ключевыми словами, поэтому их следует отделять обратной косой чертой (\).

В случае FDDI (например, fddi protocol arp), Token Ring (например, tr protocol arp) или беспроводных локальных сетей IEEE 802.11 (например, wlan protocol arp), идентификация протокола для большинства из этих протоколов выполняется по заголовку 802.2 Logical Link Control (LLC), который обычно "накладывается" на заголовок FDDI, Token Ring или 802.11.

При фильтрации для большинства идентификаторов протоколов в FDDI, Token Ring и 802.11 утилита tcpdump проверяет только поле идентификатора протокола в заголовке LLC в так называемом формате SNAP при значении OUI (Organizational Unit Identifier – идентификатор организационной единицы), равном 0x000000; для инкапсулированного Ethernet; соответствие пакета формату SNAP с OUI, равным 0x000000, не проверяется. Исключения: В случае Ethernet утилита tcpdump проверяет поле типа Ethernet на наличие большинства из этих протоколов. Исключения:
decnet src хост
Истинно, если адрес источника DECNET равен значению хост, которое указывается в форме 10.123.
decnet dst хост
Истинно, если адрес назначения DECNET равен значению хост.
decnet host хост
Истинно, если адрес источника или назначения DECNET равен значению хост.
ifname интерфейс
Истинно, если пакет зарегистрирован как поступивший с указанного интерфейса (только для пакетов, регистрируемых программой pf в OpenBSD).
on интерфейс
Синоним модификатора ifname.
rnr номер
Истинно, если пакет зарегистрирован как соответствующий правилу PF с указанным номером (только для пакетов, регистрируемых программой pf в OpenBSD).
rulenum номер
Синоним модификатора rnr.
reason код
Истинно, если пакет зарегистрирован с указанным кодом причины PF. Возможные коды:
rset имя
Истинно, если пакет зарегистрирован как соответствующий набору правил PF с указанным именем из присвоенного набора правил (только для пакетов, регистрируемых программой pf).
ruleset имя
Синоним модификатора rset.
srnr номер
Истинно, если пакет зарегистрирован как соответствующий правилу PF с указанным номером из присвоенного набора правил (только для пакетов, регистрируемых программой pf).
subrulenum номер
Синоним модификатора srnr.
action действие
Истинно, если при регистрации пакета программа PF выполнила указанное действие. Возможные действия – pass и block (только для пакетов, регистрируемых программой pf в OpenBSD).
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
Сокращения выражения
ether proto p

где p – один из вышеперечисленных протоколов.
lat, moprc, mopdl
Сокращения выражения
ether proto p

где p – один из вышеперечисленных протоколов. Следует отметить, что утилита tcpdump в настоящее время не поддерживает синтаксический анализ этих протоколов.
type тип_беспроводной_сети
Истинно, если тип кадра IEEE 802.11 соответствует указанному типу_беспроводной_сети. Допустимые значения аргумента тип_беспроводной_сети:
type тип_беспроводной_сети subtype подтип_беспроводной_сети
Истинно, если тип кадра IEEE 802.11 соответствует указанному типу_беспроводной_сети, а подтип кадра – указанному подтипу_беспроводной_сети.

Если указанный тип_беспроводной_сети имеет значение mgt, то допустимыми подтипами_беспроводной_сети являются следующие: Если указанный тип_беспроводной_сети имеет значение ctl, то допустимыми подтипами_беспроводной_сети являются следующие: Если указанный тип_беспроводной_сети имеет значение data, то допустимыми подтипами_беспроводной_сети являются следующие:
subtype подтип_беспроводной_сети Истинно, если подтип кадра IEEE 802.11 соответствует указанному подтипу_беспроводной_сети, а кадр имеет тип, к которому относится указанный подтип_беспроводной_сети.
vlan [идентификатор_vlan]
Истинно, если пакет является пакетом VLAN IEEE 802.1Q. Если указан [идентификатор_vlan], то выражение будет истинным только в том случае, если пакет имеет указанный идентификатор_vlan.

Note: Первое ключевое слово vlan в выражении изменяет смещения декодирования для остальной части выражения, поскольку предполагается, что данный пакет является пакетом VLAN. Для фильтрации иерархий VLAN можно использовать несколько выражений vlan[идентификатор_vlan]. Каждый экземпляр этого выражения увеличивает смещения фильтра на 4.

Пример.
vlan 100 && vlan 200

В результате осуществляется фильтрация VLAN 200, инкапсулированной в VLAN 100.
vlan && vlan 300 && ip

В результате выполняется фильтрация протоколов IPv4, инкапсулированных в VLAN 300, инкапсулированную в любую VLAN более высокого уровня.
mpls [номер_метки]
Истинно, если пакет является пакетом MPLS. Если указан [номер_метки], то выражение будет истинным только в том случае, если пакет имеет указанный номер_метки.

Note: Первое ключевое слово mpls в выражении изменяет смещения декодирования для остальной части выражения, поскольку предполагается, что данный пакет является IP-пакетом с инкапсуляцией MPLS. Для фильтрации иерархий MPLS можно использовать несколько выражений mpls[номер_метки]. Каждый экземпляр этого выражения увеличивает смещения фильтра на 4.

Пример.
mpls 100000 && mpls 1024

В результате выполняется фильтрация пакетов с внешней меткой 100000 и внутренней меткой 1024.
mpls && mpls 1024 && host 192.9.200.1

В результате выполняется фильтрация пакетов, поступающих с 192.9.200.1 или отправляемых на этот адрес, с внутренней меткой 1024 и любой внешней меткой.
pppoed
Истинно, если пакет является пакетом PPP-over-Ethernet Discovery (тип Ethernet 0x8863).
pppoes
Истинно, если пакет является пакетом PPP-over-Ethernet Session (тип Ethernet 0x8864).

Note: Первое ключевое слово pppoes в выражении изменяет смещения декодирования для остальной части выражения, поскольку предполагается, что данный пакет является пакетом сеанса PPPoE.

Пример.
pppoes && ip

В результате выполняется фильтрация протоколов IPv4, инкапсулированных в PPPoE.
tcp, udp, icmp
Сокращения выражения
ip proto p or ip6 proto p

где p – один из вышеперечисленных протоколов.
iso proto протокол
Истинно, если пакет является пакетом OSI протокола типа протокол. Значение аргумента протокол может быть числом или одним из следующих имен:
clnp, esis, isis
Сокращения выражения
iso proto p

где p – один из вышеперечисленных протоколов.
l1, l2, iih, lsp, snp, csnp, psnp
Сокращения для типов IS-IS PDU.
vpi n
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, с идентификатором виртуального пути, равным n.
vci n Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, с идентификатором виртуального канала n.
lane
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, вида ATM LANE.

Note: Первое ключевое слово lane в выражении изменяет смещения декодирования для остальной части выражения, поскольку предполагается, что данный пакет является пакетом Ethernet в эмуляции LANE или пакетом LANE LE Control. Если аргумент lane не указан, то при проверке пакет считается пакетом с инкапсуляцией LLC.

llc
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и имеет инкапсуляцию LLC.
oamf4s
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и является ячейкой потока сегментного контроля OAM F4 (VPI=0 & VCI=3).
oamf4e
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и является ячейкой потока сквозного контроля OAM F4 (VPI=0 & VCI=4).
oamf4
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и является ячейкой потока сегментного или сквозного контроля OAM F4 (VPI=0 & (VCI=3 | VCI=4)).
oam
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и является ячейкой потока сегментного или сквозного контроля OAM F4 (VPI=0 & (VCI=3 | VCI=4)).
metac
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и входит в цепь мета-сигнализации (VPI=0 & VCI=1).
bcc
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и входит в цепь широковещательной сигнализации (VPI=0 & VCI=2).
sc
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и входит в цепь сигнализации (VPI=0 & VCI=5).
ilmic
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, и входит в цепь ILMI (VPI=0 & VCI=16).
connectmsg
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, входит в цепь сигнализации и является сообщением Q.2931 "Setup" ("Установка"), "Call Proceeding" ("Установление соединения при вызове"), "Connect" ("Соединение"), "Connect Ack" ("Подтверждение соединения"), "Release" ("Разъединение") или "Release Done" ("Разъединение выполнено").
metaconnect
Истинно, если пакет является пакетом ATM, в случае SunATM в Solaris, входит в цепь мета-сигнализации и является сообщением Q.2931 "Setup" ("Установка"), "Call Proceeding" ("Установление соединения при вызове"), "Connect" ("Соединение"), "Release" ("Разъединение") или "Release Done" ("Разъединение выполнено").
выражение оператор_отношения выражение
Истинно, если выполняется отношение; оператор_отношения может быть одним из следующих: >, <, >=, <=, =, !=, а выражение представляет собой арифметическое выражение, состоящее из целочисленных констант (записанных в стандартном синтаксисе C), нормальных бинарных операторов (+, -, *, /, &, |, <<, >>), оператора длины и специальных аксессоров для данных пакетов. Следует отметить, что сравнения выполняются без учета знака, поэтому, например, числа 0x80000000 и 0xffffffff будут больше 0. Для обращения к данным, содержащимся в пакете, используется следующий синтаксис:
протокол [выражение : размер ]

где значение протокол может быть одним из следующих: и обозначает уровень протокола для операций с индексами (значения ether, fddi, wlan, tr, ppp, slip и link относятся к канальному уровню; значение radio относится к "заголовку радиочастотной среды", добавляемого к некоторым захватываемым данным 802.11).

Note: Типы протоколов высокого уровня tcp, udp и др. применяются только для IPv4 и не применяются для IPv6 (ожидается исправление).

Смещение в байтах относительного указанного уровня протокола указывается в выражении. Аргумент размер является необязательным; он обозначает число байт в требуемом поле и может быть равен 1, 2 или 4 (по умолчанию равен 1). Оператор длины, обозначаемый ключевым словом len, выдает длину пакета.

Например, выражению ether[0] & 1 != 0 соответствует весь трафик многоадресной передачи. Выражению ip[0] & 0xf != 5 соответствуют все пакеты IPv4 с опциями. Выражению ip[6:2] & 0x1fff = 0 соответствуют только нефрагментированные дейтаграммы IPv4 и нулевые фрагменты фрагментированных дейтаграмм IPv4. Эта проверка неявно применяется к операциям с индексами tcp и udp. Например, tcp[0] всегда означает первый байт заголовка TCP и никогда не означает первый байт промежуточного фрагмента.

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

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

Отрицание имеет наивысший приоритет. Чередование и конкатенация имеют равный приоритет и анализируются слева направо. Следует отметить, что для конкатенации в настоящее время операторы and требуется указывать явно (не подразумевать их).

Если идентификатор указан без ключевого слова, используется последнее указанное ключевое слово. Пример: not host vs and ace является сокращением выражения not host vs and host ace которое не следует путать с выражением not ( host vs or ace )

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

Выходной формат

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

Заголовки канального уровня

Если указана опция -e, то заголовок канального уровня выводится. Для сетей Ethernet выводятся адреса источника и назначения, протокол и длина пакета.

Для сетей FDDI при использовании опции -e утилита tcpdump выводит поле управления кадрами, адреса источника и назначения и длину пакета. Поле управления кадрами определяет интерпретацию остальной части пакета. Стандартные пакеты (например, содержащие дейтаграммы IP), являются "асинхронными" ("async") пакетами со значением приоритета от 0 до 7, например async4. Каждый такой пакет должен включать в себя пакет 802.2 LLC (Logical Link Control – управление логическим каналом); заголовок LLC выводится в том случае, если он не является дейтаграммой ISO или так называемым пакетом SNAP.

Для сетей Token Ring при использовании опции -e утилита tcpdump выводит поля управления доступом и управления кадрами, адреса источника и назначения и длину пакета. Как и в случае сетей FDDI, предполагается, что каждый пакет содержит пакет LLC. Независимо от использования опции -e, для пакетов с маршрутом от источника выводится информация о маршруте от источника.

Для сетей 802.11 при использовании опции -e утилита tcpdump выводит поля управления кадрами, все адреса в заголовке 802.11 и длину пакета. Как и в случае сетей FDDI, предполагается, что каждый пакет содержит пакет LLC.


Note: Перед чтением нижеследующего описания рекомендуется ознакомиться с алгоритмом сжатия SLIP, описанным в RFC 1144.

Для каналов SLIP выводится индикатор направления (I для входящего, O для исходящего), тип пакета и информация о сжатии. Первым выводится тип пакета. Существует три типа таких пакетов: ip, utcp, ctcp. Другая информация о канале для пакетов ip не выводится. Для TCP-пакетов после типа пакета выводится идентификатор соединения. Если пакет является сжатым, выводится его кодированный заголовок. Особые случаи выводятся в форме *S+n и *SA+n, где n – число, на которое изменился номер последовательности (или номер последовательности и данные подтверждения). Если случай не является особым, выводятся изменения в количестве ноль или более. Изменение обозначается символом U (указатель срочности), W (окно), A (подтверждение), S (номер последовательности) и I (идентификатор пакета), за которыми следует дельта (+n или -n) или новое значение (=n). В конце выводится объем данных в пакете и длина сжатого заголовка.

Например, следующая строка описывает исходящий сжатый TCP-пакет с неявным идентификатором соединения; подтверждение изменилось на 6, порядковый номер – на 49, идентификатор пакета – на 6; имеется 3 байта данных и 6 байт сжатого заголовка:

O ctcp * A+6 S+49 I+6 3 (6)

Пакеты ARP/RARP

Выходные данные ARP/RARP содержат тип запроса и его аргументы. Предполагается, что формат не требует дополнительных пояснений. Ниже приведен короткий пример запуска rlogin с хоста rtsg на хост csam:

arp who-has csam tell rtsg arp reply csam is-at CSAM

Первая строка означает, что хост rtsg отправляет ARP-пакет с запросом Ethernet-адреса хоста csam в Интернете. В ответ csam отправляет свой Ethernet-адрес (в данном примере Ethernet-адреса указаны в верхнем регистре, а IP-адреса – в нижнем регистре).

Если выполнить команду tcpdump -n, то избыточность будет меньше:

arp who-has 128.3.254.6 tell 128.3.254.68 arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

Если выполнить команду tcpdump -e, то станет видно, что первый пакет является широковещательным, а второй имеет тип "точка-точка":

RTSG Broadcast 0806 64: arp who-has csam tell rtsg CSAM RTSG 0806 64: arp reply csam is-at CSAM

Для первого пакета это означает, что Ethernet-адрес источника – RTSG, адрес назначения – широковещательный Ethernet-адрес, поле типа содержит шестнадцатеричное значение 0806 (тип ETHER_ARP), а общая длина составляет 64 байта.

TCP-пакеты


Note: Перед чтением нижеследующего описания рекомендуется ознакомиться с протоколом TCP, описанным в RFC 793. Если читатель не знаком с этим протоколом, то описание и утилита tcpdump будут для него малополезны.

Общий формат строки протокола TCP:

src > dst: flags data-seqno ack window urgent options

Значения src и dst представляют собой IP-адреса и порты источника и назначения. Значение flags представляет собой комбинацию S (SYN), F (FIN), P (PUSH), R (RST), W (ECN CWR) и E (ECN-Echo) или одиночный символ . (флаги отсутствуют). Значение data-seqno описывает часть пространства последовательности, занятое данными в пакете (см. пример далее). Значение ack является номером последовательности следующих данных, ожидаемых для другого направления на этом соединении. Значение window представляет собой размер пространства в приемном буфере в байтах, доступного для другого направления на этом соединении. Значение urg указывает на то, что в пакете содержатся срочные данные. Опции options представляют собой опции TCP и выводятся в угловых скобках (например, <mss 1024>).

Значения src, dst и flags присутствуют всегда. Другие поля зависят от содержания заголовка пакета протокола TCP и выводятся только при необходимости.

Ниже представлен начальный фрагмент rlogin с хоста rtsg на хост csam:

rtsg.1023 > csam.login: S 768512:768512(0) win 4096 csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 rtsg.1023 > csam.login: . ack 1 win 4096 rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096 csam.login > rtsg.1023: . ack 2 win 4096 rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096 csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077 csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1 csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

Первая строка означает, что TCP-порт 1023 на rtsg отправляет пакет для login порта на csam. Символ S указывает на то, что установлен флаг SYN. Пакет имел порядковый номер 768512 и не содержал данных. (Используется нотация первый:последний(число_байт), что означает: "порядковые номера с первого до последнего, не включая его, что составляет число_байт пользовательских данных"). Сообщение ACK отсутствует, доступное окно приема составляло 4096 байт, использовалась опция максимального размера сегмента с запросом mss, равного 1024 байтам.

Csam ответил аналогичным пакетом, но с сообщением ACK для сообщения SYN, полученного от rtsg. Затем rtsg подтверждает SYN, поступившее от csam. Символ . означает, что флаги не установлены. Пакет не содержал данных, поэтому номер последовательности данных отсутствует. Следует отметить, что номером последовательности сообщения ACK является малое целое число (1). При первом появлении "переговоров" TCP утилита tcpdump выводит порядковый номер из пакета. Для последующих пакетов диалога выводится разность между порядковым номером текущего пакета и вышеупомянутым начальным номером последовательности. Это означает, что порядковые номера после начального можно интерпретировать как относительные позиции в байтах в потоке данных диалога (первый байт данных в каждом направлении имеет номер 1). Опция -S переопределяет это поведение – при ее использовании выводятся исходные порядковые номера.

На шестой строке rtsg отправляет на csam 19 байт данных (байты 2–20 на стороне диалога rtsg -> csam). В пакете установлен флаг PUSH. На седьмой строке csam сообщает о получении данных, отправленных от rtsg, до байта 21 (не включая его). Большая часть этих данных, очевидно, находится в буфере сокета, поскольку окно приема csam уменьшилось на 19 байт. Кроме того, в этом пакете csam отправляет на rtsg один байт данных. На восьмой и девятой строках csam отправляет rtsg два байта срочных данных push.

Если снимок был настолько маленьким, что утилита tcpdump не захватила полный заголовок TCP, то она интерпретирует все имеющиеся данные и выводит строку "[|tcp]", означающую, что оставшуюся часть интерпретировать невозможно. Если заголовок содержит некорректную опцию (слишком короткую или, наоборот, выходящую за пределы заголовка), утилита tcpdump обозначает ее как неверную ("[bad opt]") и не интерпретирует остальные опции (поскольку становится невозможно определить, где они начинаются). Если длина заголовка указывает на то, что в нем присутствуют опции, но длина дейтаграммы IP недостаточна для фактического наличия опций в нем, утилита tcpdump сообщает о неверной длине заголовка ("[bad hdr length]").

Сбор TCP-пакетов с определенными комбинациями флагов (SYN-ACK, URG-ACK и т.д.)

В разделе служебных битов заголовка TCP имеется 8 битов:

CWR | ECE | URG | ACK | PSH | RST | SYN | FIN

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

  1. Вызывающая сторона посылает SYN.
  2. Принимающая сторона отвечает SYN, ACK.
  3. Вызывающая сторона посылает ACK.

Требуется захватить пакеты, в которых установлен только бит SYN (шаг 1). Отметим, что пакеты из шага 2 (SYN-ACK) не требуются, требуется только начальный пакет SYN. Для утилиты tcpdump необходимо указать корректное выражение фильтра.

Вспомним структуру заголовка TCP без опций:

0 15 31 ----------------------------------------------------------------- | source port | destination port | ----------------------------------------------------------------- | sequence number | ----------------------------------------------------------------- | acknowledgment number | ----------------------------------------------------------------- | HL | rsvd |C|E|U|A|P|R|S|F| window size | ----------------------------------------------------------------- | TCP checksum | urgent pointer | -----------------------------------------------------------------

Заголовок TCP обычно содержит 20 октетов данных, если отсутствуют опции. В первой строке диаграммы представлены октеты 0–3, во второй строке – октеты 4–7 и т.д. Если считать с 0, соответствующие биты управления TCP содержатся в октете 13:

0 7| 15| 23| 31 ----------------|---------------|---------------|---------------- | HL | rsvd |C|E|U|A|P|R|S|F| window size | ----------------|---------------|---------------|---------------- | | 13th octet | | |

Рассмотрим тринадцатый октет:

| | |---------------| |C|E|U|A|P|R|S|F| |---------------| |7 5 3 0|

В нем представлены требуемые служебные биты TCP. Биты в этом октете пронумерованы от 0 до 7 справа налево; таким образом, бит PSH – это бит 3, а бит URG – бит 5.

Вспомним, что требуется захватывать только пакеты с установленным SYN. Рассмотрим изменения октета 13 при поступлении дейтаграммы TCP с установленным битом SYN в заголовке:

|C|E|U|A|P|R|S|F| |---------------| |0 0 0 0 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

В разделе битов управления видно, что установлен только бит 1 (SYN).

Учитывая, что октет 13 представляет собой 8-битное целое число без знака в последовательности байт адреса, двоичное значение этого октета будет равно 00000010, а его десятичное представление:

7 6 5 4 3 2 1 0 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2

Анализ почти завершен: известно, что если установлен только бит SYN, то значение тринадцатого октета в заголовке TCP, если он представляется 8-битным целым числом без знака в последовательности байт адреса, должно быть точно равно 2.

Это отношение может быть выражено следующим образом:

tcp[13] == 2

Это выражение можно использовать в качестве фильтра для утилиты tcpdump, позволяющего отслеживать пакеты, в которых установлен только бит SYN:

tcpdump -i xl0 tcp[13] == 2

Это выражение означает: "пусть тринадцатый октет дейтаграммы TCP имеет десятичное значение 2", что и требуется.

Теперь предположим, что требуется захватывать пакеты SYN, но в данном случае не требуется проверять, установлен ли одновременно бит ACK или любой другой бит управления TCP. Рассмотрим изменения октета 13 при поступлении дейтаграммы TCP с установленными битами SYN-ACK:

|C|E|U|A|P|R|S|F| |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

Теперь в тринадцатом октете установлены биты 1 и 4. Двоичное значение октета 13 равно 00010010, что в десятичном виде составляет:

7 6 5 4 3 2 1 0 0*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18

Использовать в выражении фильтра tcpdump просто выражение 'tcp[13] == 18' не получится, поскольку ему соответствуют только пакеты с установленными битами SYN-ACK, т.е. пакеты только с установленным битом SYN выбираться не будут. Отметим, что если установлен бит SYN, то состояние бита ACK и любого другого бита управления не имеет значения.

Для получения требуемого результата необходимо логически сложить (AND) двоичное значение октета 13 с каким-либо другим значением для сохранения бита SYN. Известно, что бит SYN должен быть установлен в любом случае, поэтому логически сложим значение в тринадцатом октете и бинарное значение SYN:

00010010 SYN-ACK 00000010 SYN AND 00000010 (требуется SYN) AND 00000010 (требуется SYN) -------- -------- = 00000010 = 00000010

Видно, что эта операция AND дает одинаковый результат независимо от того, установлен ли бит ACK или другой бит управления TCP. Десятичное представление значения AND (а также результат этой операции) равно 2 (00000010 в двоичной форме); таким образом, известно, что для пакетов с установленным битом SYN должно сохраняться следующее отношение:

( ( значение октета 13 ) AND ( 2 ) ) == ( 2 )

Отсюда получаем выражение фильтра tcpdump

tcpdump -i xl0 'tcp[13] & 2 == 2'

Следует отметить, что специальный символ AND ('&') в выражении необходимо экранировать от командного интерпретатора с помощью апострофов или обратной косой черты.

UDP-пакеты

Формат UDP представлен в следующем пакете rwho:

actinide.who > broadcast.who: udp 84

Это означает, что порт who на хосте actinide отправляет UDP-дейтаграмму на порт who на хосте broadcast (широковещательный Интернет-адрес). Пакет содержит 84 байта пользовательских данных.

Некоторые службы UDP распознаются (на основе номера порта источника или назначения), и выводится информация о протоколе высокого уровня. К ним, в частности, относятся запросы службы доменных имен (RFC 1034 и 1035) и вызовы Sun RPC (RFC 1050) для NFS.

Запросы к серверу имен UDP


Note: Перед чтением нижеследующего описания рекомендуется ознакомиться с протоколом службы доменных имен, описанным в RFC 1035.

Запросы к серверу имен имеют следующий формат:

src > dst: id op? flags qtype qclass name (len) h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

Хост h2opolo запрашивает у сервера домена на хосте helios запись адреса (qtype=A), связанную с именем ucbvax.berkeley.edu. Запрос имеет идентификатор 3. Символ + означает, что установлен флаг recursion desired. Длина запроса составляла 37 байт, не включая заголовки протоколов UDP и IP. Операция запроса была обычной (Query), поэтому поле операции "op" отсутствует. Другая операция была бы указана между символами 3 и +. Аналогичным образом, параметр qclass был обычным (C_IN) и не указан. Другой параметр qclass был бы отображен после символа A.

Выполняется проверка на нестандартные параметры, результатом которой могут быть дополнительные значения в квадратных скобках: если запрос содержит в себе ответ, записи авторизации или раздел дополнительных записей, то отображается параметр ancount, nscount или arcount в форме [na], [nn] или [nau], где n – соответствующее количество. Если установлен какой-либо из битов ответа (AA, RA, rcode) или любой из битов, которые "должны быть нулевыми" в байтах 2 и 3, то выводится строка [b2&3=x], где x – шестнадцатеричное значение байт 2 и 3 заголовка.

Ответы сервера имен UDP

Ответы сервера имен имеют следующий формат:

src > dst: id op rcode flags a/n/au type class data (len) helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273) helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

В первом примере хост helios отвечает на запрос с идентификатором 3 от h2opolo тремя записями ответа, тремя записями сервера имен и семью дополнительными записями. Первая запись ответа имеет тип A (адрес), ее данные представляют собой IP- адрес 128.32.137.3. Общий размер ответа составляет 273 байта, не считая заголовков IP и UDP. Значение "op" ("Query") и код ответа ("NoError") не указаны, как не указан и класс записи A (C_IN).

Во втором примере хост helios отвечает на запрос 2 кодом запроса, означающим несуществующий домен ("NXDomain"), без ответов, одним сервером имен, без записей авторизации. Символ '*' означает, что установлен бит authoritative answer. Поскольку ответы отсутствуют, тип, класс и данные не отображаются.

Кроме того, существуют флаговые символы '-' (RA (возможна рекурсия) не установлен) и '|' (TC (обрезанное сообщение) установлен). Если в разделе запроса содержится не ровно одна запись, выводится строка [nq].

Следует отметить, что запросы серверу имен и его ответы обычно имеют большой размер, и размер_снимка в 68 байт может не охватывать достаточную длину пакета для вывода полной информации. Если требуется детально изучить трафик сервера имен, используется флаг -s для увеличения размера снимка. Пример: -s 128.

Декодирование SMB/CIFS

Утилита tcpdump теперь включает в себя расширенные средства декодирования SMB/CIFS/NBT для данных UDP/137, UDP/138 и TCP/139. Кроме того, выполняется базовое декодирование данных IPX и NetBEUI SMB.

По умолчанию декодирование выполняется в минимальном объеме, для расширения используется опция -v. Следует учитывать, что при использовании опции -v один пакет SMB может занимать целую страницу или более, поэтому опция -v применяется только при необходимости получения всех подробных данных.

Запросы и ответы NFS

Запросы и ответы Sun NFS (Network File System – сетевая файловая система) выводятся в следующем виде:

src.xid > dst.nfs: len op args src.nfs > dst.xid: reply stat len op results

Пример.

sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165 wrl.nfs > sushi.6709: reply ok 40 readlink "../var" sushi.201b > wrl.nfs: 144 lookup fh 9,74/4096.6878 "xcolors" wrl.nfs > sushi.201b: reply ok 128 lookup fh 9,74/4134.3150

Первая строка: хост sushi посылает транзакцию с идентификатором 6709 хосту wrl (обратите внимание, что число, следующее за хостом-отправителем, является идентификатором транзакции, а не портом источника). Размер запроса составляет 112 байт, не считая заголовки UDP и IP. Была выполнена операция readlink (чтение символьной ссылки) в отношении описателя файла (fh) 21,24/10.731657119. (В оптимальном случае, аналогичном данному, описатель файла можно интерпретировать как пару из старшего и младшего номеров устройства, за которой следует индексный дескриптор и номер поколения). Хост wrl отвечает ok и передает содержимое ссылки.

В третьей строке хост sushi запрашивает у хоста wrl поиск имени xcolors в файле каталога 9,74/4096.6878. Следует отметить, что выводимые данные зависят от типа операции. Предполагается, что формат при чтении совместно со спецификациями протокола NFS не требует дополнительных пояснений.

Если указана опция -v (режим вывода расширенной информации), то выводится дополнительная информация. Пример.

sushi.1372a > wrl.nfs: 148 read fh 21,11/12.195 8192 bytes @ 24576 wrl.nfs > sushi.1372a: reply ok 1472 read REG 100664 ids 417/0 sz 29388

(При использовании опции -v также выводятся поля предельного срока существования, идентификатора, длины и фрагментации заголовка IP, не представленные в этом примере). В первой строке sushi запрашивает у wrl чтение 8192 байт из файла 21,11/12.195 по смещению 24576 в байтах. Хост wrl отвечает ok; пакет на второй строке является первым фрагментом ответа, и следовательно, его длина составляет всего 1472 байта (остальные байты поступают в последующих фрагментах, но эти фрагменты не имеют заголовков NFS или UDP и поэтому могут не выводиться, в зависимости от используемого выражения фильтра). Поскольку указан флаг -v, выводятся некоторые атрибуты файла (возвращаемые вместе с данными файла): тип файла (для стандартного файла – "REG"), режим файла (в восьмеричном виде), идентификаторы пользователя и группы, размер файла.

Если указано несколько опций -v, то отображается более подробная информация.

Следует отметить, что запросы NFS имеют большой размер, и большая часть данных не будет выводиться, если не увеличить размер_снимка. Для просмотра трафика NFS рекомендуется использовать, например, опцию -s 192.

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

Запросы и ответы AFS

Запросы и ответы Transarc AFS (Andrew File System) выводятся в следующем виде:

src.sport > dst.dport: rx packet-type src.sport > dst.dport: rx packet-type service call call-name args src.sport > dst.dport: rx packet-type service reply call-name args elvis.7001 > pike.afsfs: rx data fs call rename old fid 536876964/1/1 ".newsrc.new" new fid 536876964/1/1 ".newsrc" pike.afsfs > elvis.7001: rx data fs reply rename

В первой строке хост elvis отправляет хосту pike пакет RX. Он представляет собой пакет данных RX для службы fs (fileserver, файловый сервер) и является началом вызова RPC. Вызовом RPC была запрошена операция переименования; идентификатор старого файла каталога – 536876964/1/1, старое имя файла – .newsrc.new, идентификатор нового файла каталога – 536876964/1/1, новое имя файла – .newsrc. Хост pike посылает ответ RPC на запрос переименования (которое было выполнено успешно, поскольку поступил пакет данных, а не пакет отмены).

В общем случае декодирование всех RPC AFS выполняется как минимум по имени вызова RPC. По крайней мере для некоторых аргументов большинства RPC AFS существует расшифровка (обычно только для "значимых" аргументов, в зависимости от значимости).

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

Если флаг -v (режим вывода расширенной информации) указан дважды, то выводятся пакеты подтверждения и дополнительная информация из заголовков, такая как идентификатор вызова RX, номер вызова, порядковый номер, серийный номер и флаги пакетов RX.

Если флаг -v указан дважды, то выводится дополнительная информация, такая как идентификатор вызова RX, серийный номер и флаги пакетов RX. Кроме того, выводится информация согласования MTU и пакетов ACK RX.

Если опция -v указана три раза, выводится индекс безопасности и идентификатор службы.

Для пакетов отмены выводятся коды ошибок, за исключением сигнальных пакетов Ubik (поскольку пакеты отмены используются для индикации голосования "да" в протоколе Ubik).

Следует отметить, что запросы AFS имеют большой размер, и большая часть аргументов не будет выводиться, если не увеличить размер_снимка. Для просмотра трафика AFS рекомендуется использовать, например, опцию -s 256.

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

KIP AppleTalk (DDP в UDP)

Для пакетов AppleTalk DDP, инкапсулированных в дейтаграммы UDP, производится декапсуляция, после чего они выводятся в дамп как пакеты DDP (т.е. все данные заголовка UDP отбрасываются). Для преобразования номеров сетей и узлов AppleTalk в имена используется файл /etc/atalk.names. Строки в этом файле имеют следующий формат:

номер имя 1.254 her 16.1 csd-net 1.254.110 ace

Первые две строки содержат имена сетей AppleTalk. В третьей строке указано имя конкретного хоста. (Хост отличается от сети третьим октетом номера; номер сети обязательно содержит два октета, номер хоста обязательно содержит три октета.) Номер и имя должны быть разделены пробельным символом (символ пробела или символ табуляции). Файл /etc/atalk.names может содержать пустые строки или строки комментариев (комментарии начинаются с символа #).

Адреса AppleTalk выводятся в следующем формате:

сеть.хост.порт 144.1.209.2 > icsd-net.112.220 office.2 > icsd-net.112.220 jssmag.149.235 > icsd-net.2

(Если файл /etc/atalk.names не существует или не содержит записи для какого-либо номера хоста/сети AppleTalk, то адреса выводятся в числовом виде.) В первом примере NBP (порт DDP 2) в сети 144.1, узел 209, посылает данные любому прослушивающему сервису на порт 220 в сети icsd, узел 112. Вторая строка является аналогичной, за исключением того, что известно полное имя узла источника (office). В третьей строке описывается широковещательная передача с порта 235 в сети jssmag, узел 149, на порт NBP сети icsd-net (отметим, что широковещательный адрес (255) обозначается именем сети без номера хоста, поэтому в файле /etc/atalk.names рекомендуется присваивать узлам и сетям различные имена).

Содержание пакетов NBP (name binding protocol, протокол привязки имен) и ATP (AppleTalk transaction protocol, протокол транзакций AppleTalk) обрабатывается. Для других протоколов в дамп выводится только имя протокола (или номер, если для протокола не зарегистрировано имя) и размер пакета.

Пакеты NBP выводятся в следующем формате:

icsd-net.112.220 > jssmag.2: nbp-lkup 190: “=:LaserWriter@*” jssmag.209.2 > icsd-net.112.220: nbp-reply 190: “RM1140:LaserWriter@*” 250 techpit.2 > icsd-net.112.220: nbp-reply 190: “techpit:LaserWriter@*” 186

Первая строка содержит запрос поиска имен принтеров LaserWriter, отправленный хостом 112 сети icsd, и подлежащий широковещательной рассылке по сети jssmag. Идентификатор nbp для поиска равен 190. Вторая строка содержит ответ на этот запрос (отметим, что он имеет тот же идентификатор) от хоста jssmag.209, в котором сообщается о наличии ресурса LaserWriter RM1140, зарегистрированном по порту 250. Третья строка содержит ответ на этот же запрос, сообщающий о наличии на хосте techpit принтера LaserWriter techpit, зарегистрированному по порту 186.

Пример формата вывода пакетов ATP:

jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001 helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000 jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001 helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001 jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002

Хост jssmag.209 инициирует транзакцию с идентификатором 12266 с хостом helios, для чего запрашивает до 8 пакетов (<0-7>). Шестнадцатеричное число в конце строки является значением поля пользовательские_данные в запросе.

В ответ хост helios посылает 8 пакетов по 512 байт каждый. Значение :digit, следующее за идентификатором транзакции, соответствует порядковому номеру пакета в транзакции, а номер в скобках объему данных в пакете, не считая заголовка ATP. Символ * в пакете 7 указывает на установленный бит EOM.

Затем хост jssmag.209 запрашивает повторную передачу пакетов 3 и 5; хост helios повторяет их отправку, после чего хост jssmag.209 завершает транзакцию. Наконец, хост jssmag.209 инициирует следующий запрос. Символ * в запросе указывает, что бит XO ("только один раз") не был установлен.

Фрагментация IP-пакетов

Фрагментированные дейтаграммы Интернета выводятся в следующем виде:

(frag идентификатор:размер@смещение+) (frag идентификатор:размер@смещение)

В первом случае указывается на наличие последующих фрагментов. Вторая – на то, что данный фрагмент является последним.

Идентификатор – это идентификатор фрагмента. Размер соответствует размеру пакета (в байтах), не считая заголовка IP. Смещение – это смещение этого фрагмента (в байтах) в исходной дейтаграмме.

Информация о фрагменте выводится для каждого фрагмента. Первый фрагмент содержит заголовок протокола высокого уровня, а информация о фрагменте выводится после информации о протоколе. Фрагменты, следующие за первым, не содержат заголовки протокола высокого уровня, а информация о фрагменте выводится после адресов источника и назначения. Пример обращения по FTP от хоста arizona.edu к хосту lbl-rtsg.arpa через соединение CSNET, не поддерживающего дейтаграммы размером 576 байт:

arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+) arizona > rtsg: (frag 595a:204@328) rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

Следует отметить некоторые детали. Во-первых, адреса во второй строке не содержат номера портов. Причиной является то, что вся информация протокола TCP находится в первом фрагменте, а при выводе последующих фрагментов информация о портах или порядковых номерах отсутствует. Во- вторых, информация последовательности TCP в первой строке выводится с учетом 308 байт пользовательских данных, тогда как фактически данные занимают 512 байт (308 в первом фрагменте и 204 во втором). Это может затруднить поиск разрывов в пространстве последовательности и сопоставление пакетов с сообщениями ACK.

Пакеты с флагом IP не_фрагментировать отмечаются завершающим сочетанием (DF).

Метки времени

По умолчанию перед каждой строкой вывода указывается метка времени. Метка времени представляет собой текущее время в виде чч:мм:сс.доли, а ее точность соответствует точности часов ядра. Время метки соответствует времени обнаружения пакета процессом io-pkt-*. Время запаздывания между получением пакета интерфейсом Ethernet с физической линии связи и обработкой прерывания "новый пакет" процессом io-pkt-* не учитывается.

Примеры:

Вывод всех пакетов, поступающих на sundown или отправляемых с него:

tcpdump host sundown

Вывод трафика между helios и либо hot, либо ace:

tcpdump host helios and \( hot or ace \)

Вывод всех IP-пакетов, передаваемых между ace и любым хостом, кроме helios:

tcpdump ip host ace and not helios

Вывод всего трафика между локальными хостами и хостами в Беркли:

tcpdump net ucb-ether

Вывод всего трафика FTP между Интернет-шлюзом snup (обратите внимание, что выражение обрамлено кавычками во избежание неверной/излишней обработки скобок командным интерпретатором):

tcpdump 'gateway snup and (port ftp or ftp-data)'

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

tcpdump ip and not net локальная_сеть

Вывод первого и последнего пакетов (пакеты SYN и FIN) каждого диалога TCP с участием нелокального хоста:

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net локальная_сеть'

Вывод всех HTTP-пакетов IPv4, поступающих на порт 80 и отправляемых с него, т.е. только пакетов, содержащих данные; например, пакеты SYN и FIN, а также пакеты только с ACK не выводятся (IPv6 можно проанализировать самостоятельно):

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Вывод IP-пакетов длиннее 576 байт, переданных через шлюз snup:

tcpdump 'gateway snup and ip[2:2] > 576'

Вывод широковещательных или многоадресных IP-пакетов, не переданных путем широковещательной или многоадресной передачи Ethernet:

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

Вывод всех пакетов ICMP, не являющиеся эхо-запросами/ответами (т.е. пакетами ping):

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

Возвращаемое значение:

0
Завершено успешно.
1
Возникла ошибка.

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино», NetBSD

В ЗОСРВ «Нейтрино» редакции 2020 утилита обновлена до версии 4.9.3

Тематические ссылки:

stty, io-pkt-*




Предыдущий раздел: Утилиты