(назад ...)
В командной строке tcpdump наряду с опциями могут задаваться выражения, определяющие фильтрацию пакетов на этапе их сбора. Если никакого фильтра не задано, программа будет собирать все пакеты.
Каждое выражение, задающее фильтр, включает один или несколько примитивов, состоящих обычно из одного или нескольких идентификаторов объекта и предшествующих ему классификаторов. Идентификатором объекта может служить его имя или номер. Классификаторы объектов могут относиться к одному из трех видов:
type
указывает тип объекта, заданного идентификатором. В качестве типа объектов могут указываться значения host (хост), net (сеть) и port (порт). Если тип объекта не указан, предполагается значение host.
dir
задает направление по отношению к объекту. Для этого классификатора поддерживаются значения src (объект является отправителем), dst (объект является получателем), src or dst (отправитель или получатель) и src and dst (отправитель и получатель). Например, src foo указывает на пакеты, отправленные с хоста foo, dst net 128.3 - пакеты, адресованные в сеть 128.3.0.0/16, а src or dst port ftp-data – пакеты данных протокола FTP (порт ftp-data), передаваемые в обоих направлениях. Если классификатор dir не задан, предполагается значение src or dst. Для некоторых типов соединений (например, SLIP) и режимов захвата (например, захват с фиктивного интерфейса any в Linux-системах) могут использоваться классификаторы inbound и outbound.
proto
задает протокол, к которому должны относиться пакеты. Этот классификатор может принимать значения ether, fddi18, tr19, wlan20, ip, ip6, arp, rarp, decnet, tcp и udp. Если примитив не содержит классификатора протокола, предполагается, что данному фильтру удовлетворяют все протоколы, совместимые с типом объекта21.
Кроме объектов и квалификаторов примитивы могут содержать ключевые слова gateway (шлюз), broadcast (широковещательный), less (меньше), greater (больше) и арифметические выражения.
Сложные фильтры могут содержать множество примитивов, связанных между собой с использованием логических операторов and, or и not (например, host foo 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
Ниже приводится список допустимых примитивов с краткими комментариями для каждого из них.
Таблица 2 Примитивы фильтров tcpdump
Примитив |
Описание |
---|---|
dst host <хост> |
будет отбирать пакеты, в которых поле адреса получателя IPv4/v6 содержит адрес хоста, заданного в примитиве. |
src host <хост> |
будет выбирать все пакеты, в которых поле отправителя содержит адрес указанного хоста. |
host <хост> |
будет отбирать все пакеты, для которых адрес хоста указан в поле получателя или отправителя. Все три приведенных выше выражения могут содержать идентификаторы протоколов ip, arp, rarp или ip6, как в выражении ip host <хост> эквивалентном фильтру: ether proto \ip and host <хост> Если именем задан хост, с которым связано несколько адресов IP, фильтру будут соответствовать пакеты с любым из этих адресов в заголовках пакетов. |
ether dst <ehost> |
будет выбирать все кадры, в которых поле MAC-адреса получателя содержит значение ehost (имя хоста из файла /etc/ethers или шестнадцатеричное представление MAC-адреса22). |
ether src <ehost> |
будет выбирать все кадры, в которых поле MAC-адреса отправителя содержит значение ehost. |
ether host <ehost> |
будет отбирать все пакеты с адресом, указанным значением ehost в поле отправителя или получателя. |
gateway <шлюз> |
будет отбирать все пакеты, использующие указанный именем хост в качестве шлюза23. Указанное параметром имя хоста должно преобразовываться в IP-адрес механизмами преобразования имен, доступными локальному компьютеру (файл /etc/hosts, DNS, NIS и т. п.), а также механизмами определения MAC-адреса по имени хоста (/etc/ethers и т. п.). Эквивалентное выражение ether host ehost and not host <хост> позволяет указывать хост по имени или адресу, указанному в файле host/ehost. Отметим, что данный примитив пока не поддерживается для конфигураций IPv6. |
dst net <сеть> |
отбирает все пакеты IPv4/v6, направленные в указанную сеть. Для указания сети можно использовать имя из файла /etc/networks или номер сети. |
src net <сеть> |
выбирает все пакеты Ipv4/v6, отправленные из указанной сети. |
net <сеть> |
выбирает все пакеты IPv4/v6, содержащие адреса из указанной сети в поле отправителя или получателя. |
net <сеть> mask <маска сети> |
будет отбирать все пакеты IP24, содержащие в поле отправителя или получателя адреса из сети, указанной с использованием маски. |
net <сеть/размер маски> |
будет отбирать все пакеты IPv4/v6, содержащие в поле отправителя или получателя адреса из сети, указанной с использованием маски. |
dst port <порт> |
отберет все пакеты ip/tcp, ip/udp, ip6/tcp и ip6/udp, направленные в указанный порт. Номера портов могут задаваться номерами или именами из файла /etc/services. При указании имени (протокол/порт) проверяется как порт, так и протокол. Если примитив содержит номер или неоднозначное обозначение порта (только порт, без протокола) фильтру будут соответствовать пакеты обоих протоколов (tcp и udp). Например, фильтру dst port 513 будут соответствовать пакеты tcp/login и udp/who, а фильтру port domain – трафик tcp/domain и udp/domain. |
src port <порт> |
отбирает все пакеты, отправленные из указанного порта. |
port <порт> |
отбирает все пакеты, содержащие указанный номер порта в поле отправителя или получателя. Любое из трех перечисленных правил для портов может включать в качестве префикса идентификатор протокола tcp или udp (например, tcp src port <порт>, будет отбирать пакеты tcp, отправленные из указанного порта). |
less <размер> |
будет собирать пакеты, размер которых не превышает указанного значения. |
greater <размер> |
будет собирать пакеты, размер которых не меньше указанного значения. |
ip proto <протокол> |
отбирает все пакеты IP, содержащие заданный идентификатор типа в поле типа протокола. Типы протоколов IP можно указывать по именам или (icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, tcp) или номерам. Поскольку tcp, udp и icmp используются также в качестве ключевых слов, перед этими идентификаторами следует помешать символ \ (слэш)25. Отметим, что этот примитив не проверяет цепочки протокольных заголовков. |
ip6 proto <протокол> |
будет отбирать все пакеты IPv6 указанного типа. Отметим, что этот примитив не проверяет цепочки протокольных заголовков. |
ip6 protochain <протокол> |
отберет все пакеты IPv6, содержащие в цепочке протокольных заголовков идентификатор указанного типа протокола. Например, фильтру ip6 protochain 6 будут соответствовать все пакеты IPv6 с заголовками TCP в цепочке заголовков. Такой пакет может содержать, например, заголовок аутентификации (AH), маршрутный заголовок (routing header), или заголовок опции hop-by-hop между заголовками IPv6 и TCP. Отметим, что порождаемый этим примитивом код BPF достаточно сложен и не может быть оптимизирован средствами tcpdump, поэтому использование данного фильтра может замедлять работу программы. |
ip protochain <протокол> |
эквивалентно примитиву ip6 protochain protocol, но работает с пакетами IPv4. |
ether broadcast |
обеспечивает отбор всех широковещательных кадров Ethernet. Ключевое слово ether может быть опущено. |
ip broadcast |
отбирает все широковещательные пакеты IPv4. Этому правилу будут соответствовать широковещательные адреса, содержащие только нули (all-zeroes) и только единицы (all-ones) с учетом маски подсети для интерфейса, который используется для захвата пакетов. Если маска подсети для интерфейса недоступна26, фильтр может работать некорректно. |
ether multicast |
собирает все кадры с групповыми адресами Ethernet. Ключевое слово ether использовать необязательно. Логически это правило эквивалентно выражению ether[0] & 1 != 0. |
ip multicast |
отбирает пакеты с групповыми адресами IP. |
ip6 multicast |
отбирает пакеты с групповыми адресами IPv6. |
ether proto <протокол> |
отбирает кадры Ethernet с заданным типом протокола. Протокол может быть указан по номеру или имени27 (ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, netbeui). В случаях использования правила для протоколов 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 проверяет только поле идентификатора протокола (protocol ID) в заголовке LLC так называемого SNAP-формата с идентификатором OUI = 0x000000 (Organizational Unit Identifier), указывающим на инкапсуляцию Ethernet. Проверка для пакетов использования формата SNAP с OUI = 0x000000 не выполняется за исключением перечисленных ниже случаев: iso tcpdump проверяет поля DSAP28 и SSAP29 в заголовках LLC; stp netbeui tcpdump проверяет поле DSAP в заголовке LLC; atalk tcpdump проверяет использование в кадре формата SNAP с OUI = 0x080007 и тип (etype) AppleTalk. Для случая Ethernet проверяются поля типа Ethernet для большинства протоколов. Исключениями являются протоколы iso sap netbeui tcpdump проверяет для кадра принадлежность к 802.3 и заголовок LLC (как это описано выше для FDDI, Token Ring и 802.11); atalk проверяется типа AppleTalk в кадре Ethernet и формат заголовка SNAP (как для FDDI, Token Ring и 802.11); aarp проверяется тип AppleTalk ARP в кадре Ethernet или использование формата 802.2 SNAP с OUI = 0x000000; ipx tcpdump проверяет тип IPX в кадре Ethernet, поле IPX DSAP в заголовке LLC, инкапсуляцию IPX и тип IPX в кадре SNAP. |
decnet src <хост> |
собирает все пакеты от указанного хоста DECNET, который может быть задан по адресу или имени DECNET30. |
decnet dst <хост> |
отбирает все пакеты, адресованные указанному хосту DECNET. |
decnet host <хост> |
собирает все пакеты, содержащие адрес указанного хоста DECNET в поле отправителя или получателя. |
ifname <интерфейс> |
отбирает все пакеты, полученные от указанного интерфейса31. |
on <интерфейс> |
синоним ifname. |
rnr <номер> |
собирает только пакеты, записанные в файл программой pf в соответствии с правилом, имеющим указанных номер. Это правило работает только при просмотре файлов, собранных с помощью pf. |
rulenum <номер> |
синоним для rnr. |
reason <код> |
собирает только пакеты, соответствующие указанному коду причины (PF reason code). Известные коды причин включают match, bad-offset, fragment, short, normalize, memory. Правило работает только при просмотре файлов, собранных с помощью pf. |
action <действие> |
отбирает пакеты, записанные в файл указанной операцией PF (pass или block). Правило работает только при просмотре файлов, собранных с помощью pf. |
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui |
используются в качестве сокращения для: ether proto p где p – один из перечисленных протоколов. |
lat, moprc, mopdl |
сокращения для: ether proto p где p – один из перечисленных протоколов. Отметим, что в настоящее время tcpdump не умеет разбирать эти протоколы. |
vlan [vlan_id] |
отбирает кадры IEEE 802.1Q VLAN. Если указан необязательный идентификатор VLAN, выделяются лишь пакеты, относящиеся в указанной виртуальной ЛВС. Отметим, что первое ключевой слово vlan изменяет расчет смещения полей для оставшейся части выражения с учетом размеров полей VLAN в заголовке кадра. |
tcp, udp, icmp |
используется в качестве сокращения для ip proto p или ip6 proto p где p – один из перечисленных протоколов. |
iso proto <протокол> |
собирает пакеты с указанным типом протокола OSI. Протокол может быть указан по номеру или имени (clnp, esis, isis). |
clnp, esis, isis |
сокращения для выражений: iso proto p где p – один из перечисленных протоколов. |
l1, l2, iih, lsp, snp, csnp, psnp |
сокращения для типов IS-IS PDU. |
vpi n |
собирает пакеты ATM с указанным идентификатором виртуального пути для SunATM (Solaris). |
vci n |
собирает пакеты ATM с указанным идентификатором виртуального канала для SunATM (Solaris). |
lane |
собирает пакеты эмуляции ЛВС (ATM LANE) для SunATM (Solaris). Первое ключевое слово lane в выражении изменяет проверки для остальной части фильтра в предположении что пакет относится к пакетам эмуляции Ethernet или LANE LE Control. Если ключевое слово lane не указано, проверки выполняются в предположении LLC-инкапсуляции. |
llc |
собирает пакеты ATM с инкапсуляцией LLC для SunATM (Solaris). |
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, Connect Ack, Release, Release Done. |
18fddi в действительности является псевдонимом ether; при анализе примитива оба классификатора трактуются как “канальный уровень, используемый указанным интерфейсом”. Заголовки FDDI содержат адреса отправителя и получателя, подобные адресам Ethernet, поля типа также зачастую содежат значения, подобные используемым для Ethernet, поэтому можно фильтровать эти поля в кадрах FDDI как и аналогичные поля кадров Ethernet. Заголовки FDDI содержат и другие поля, но их нельзя указать в фильтрах.
19tr также является в действительности псевдонимом ether, поскольку оба типа кадров используют весьма похожую структуру заголовков.
20Идентификатор протокола wlan (беспроводные сети 802.11) является псевдонимом ether. В заголовках 802.11 адрес получателя содержится в поле DA, адрес отправителя – в поле SA, а поля BSSID, RA и TA в заголовках 802.11 не проверяются фильтрами.
21Например, примитиву src foo будут соответствовать все пакеты ip, arp и rarp, исходящие от хоста foo.
22MAC-адрес записывается в формате xx:xx:xx:xx:xx:xx
23Т. е., адрес отправителя или получателя на канальном уровне (например, ethernet) соответствует адресу хоста, заданному значением <шлюз>, но IP-адреса отправителя и получателя в заголовке пакета не совпадают с IP-адресом указанного шлюза.
24Этот примитив не может использоваться для сетей IPv6.
25При работе с командным интерпретатором C-shell следует добавлять еще один слэш (\\)
26Интерфейс не имеет маски или сбор пакетов осуществляется со всех интерфесов хоста Linux (фиктивный интерфейс any).
27Перечисленные здесь имена протоколов могут использоваться также в качестве ключевых слов, поэтому имени протокола должен предшествовать символ \ (например, \arp).
28Destination Service Access Point – точка доступа к сервису для получателя.
29Source Service Access Point – точка доступа к сервису для отправителя.
30Поддержка имен DECNET обеспечивается только на хостах ULTRIX, настроенных для использования DECNET.
31Это правило применимо только к пакетам, собранным в файл с помощью программы pf (OpenBSD).
далее ...
Дата обновления 14.02.2005