ZaLinux.ru

Фильтры tcpdump и pcap. Фильтры захвата Wireshark

pcap — это библиотека захвата пакетов. Имеется синтаксис фильтрации пакетов, который описывает, какие именно пакеты должны быть захвачены (сохранены или отображены).

Работа с библиотеками, в первую очередь, интересна программистам, но не обычным пользователям. Но в данном случае синтаксису фильтров pcap (pcap-filter) следует уделить внимание и обычным пользователям, поскольку этот синтаксис применяется в программах:

  • tcpdump (программа для захвата трафика в сети),
  • tcpkill (программа для обрыва определённых TCP подключений в локальной сети),
  • tcpnice (программа для замедления определённых TCP соединений в локальной сети),
  • Wireshark (популярнейшая программа для анализа сетевых подключений и отладки сети, фильтры pcap являются фильтрами захвата). Смотрите также «Фильтры Wireshark» (в статье рассмотрены фильтры отображения Wireshark),
  • WinDump,
  • Analyzer.

Выражение фильтра состоит из одного или более примитивов. Примитивы обычно состоят из идентификатора (имя или число) которому предшествует один или более квалификаторов. Имеется три вида квалификаторов:

тип

квалификатор тип говорит, на какого рода вещи ссылается именной или числовой идентификатор. Возможными типами являются: host (хост), net (сеть), port (порт) и portrange (диапазон портов). К примеру, «host foo», «net 128.3», «port 20», «portrange 6000-6008». Если квалификатор тип отсутствует, то подразумевается host.

направление

квалификатор направление определяет определённое направление передачи к и/или от идентификатора. Возможными направлениями являются: src, dst, src or dst, src and dst, ra, ta, addr1, addr2, addr3 и addr4. Например, «src foo», «dst net 128.3», «src or dst port ftp-data». Если квалификатор направления отсутствует, то подразумевается src or dst. Квалификаторы ra, ta, addr1, addr2, addr3 и addr4 являются валидными только для уровней канала передачи IEEE 802.11 Wireless LAN.

протокол

квалификатор протокол ограничивает совпадение определённым протоколом. Возможными протоколами являются: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp. Например, «ether src foo», «arp net 128.3», «tcp port 21», «udp portrange 7000-7009», «wlan addr2 0:2:3:4:5:6». Если квалификатор протокола отсутствует, то подразумеваются все протоколы, совместимые с типом. К примеру «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».

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

FDDI заголовки также содержат другие поля, но вы не можете наименовать их явно в выражении фильтра.

Похожим образом «tr» и «wlan» являются псевдонимом для «ether»; утверждения из предыдущего параграфа о заголовках FDDI также применимы к заголовкам Token Ring и беспроводных локальных сетей 802.11. Для заголовков 802.11, адресом назначения является поле DA, а адресом источника является поле SA; поля BSSID, RA и TA не тестировались.]

В дополнении к указанным выше, имеется несколько специальных «примитивных» ключевых слов, которые не следуют шаблону: 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».

Некоторые слова могут быть как примитивом (ключевым словом), так и значением другого примитива (например, ip, tpc, upd, icmp). В случае использования такого слова в качестве значения, требуется его экранирование с помощью обратного слэша (\). При использовании выражения фильтра, например, с программой tcpdump, нужно помнить, что обратный слэш имеет особое значение для оболочки, по этой причине весь фильтр нужно заключать в одинарные кавычки, например:

sudo tcpdump 'ip proto \tcp'

Разрешёнными примитивами являются:

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 ehost

Истина, если адресом назначения Ethernet является ehost. В качестве ehost может быть как имя из /etc/ethers или MAC адрес в форме "xx:xx:xx:xx:xx:xx", "xx.xx.xx.xx.xx.xx", "xx-xx-xx-xx-xx-xx", "xxxx.xxxx.xxxx", "xxxxxxxxxxxx", различных смешений ':', '.', и '-', где каждый "x" является шестнадцатеричной цифрой (0-9, a-f или A-F).

ether src ehost

Истина, если адресом источника Ethernet является ehost.

ether host ehost

Истина, если адресом источника или пункта назначения Ethernet является ehost.

gateway хост

Истина, если пакеты используют хост в качестве шлюза. Например, адрес источника или пункта назначения Ethernet был хостом, но при этом ни IP источника, ни IP пункта назначения не являются хостом. Хостом должно быть имя и оно должно быть найдено обоими механизмами преобразования имён на машине:

  • имя-хоста-в-IP-адрес (файл имён хостов, DNS, NIS и т.д.)
  • имя-хоста-в-Ethernet-адрес (/etc/ethers и т.д).

(Эквивалентным выражением является

ether host ehost and not host host

которое может использоваться как с именами, так и числами для хоста/ehost.) В настоящее время этот синтаксис не работает в конфигурациях с включённым IPv6.

dst net сеть

Истина, если IPv4/v6 адрес пункта назначения пакета имеет сетевой номер сеть. Сеть может быть как именем из базы данных сетей (/etc/networks, etc.) или сетевым номером. Сетевой номер IPv4 может быть записан как разделённые точкой четыре числа (например, 92.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 (смотрите 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 пакет (смотрите (4P)) с типом протокола протокол. В качестве протокола может быть число или одно из имён: icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp или tcp. Обратите внимание, что идентификаторы tcp, udp и icmp также являются ключевыми словами и должны быть экранированы обратным слэшем (\). Обратите внимание, что этот примитив не преследует цепочку заголовков протокола.

ip6 proto протокол

Истина, если пакет является IPv6 пакетом с типом протокола протокол. Обратите внимание, что этот примитив не преследует цепочку заголовков протокола.

proto протокол

Истина, если пакет является IPv4 или IPv6 пакетом с типом протокола протокол. Обратите внимание, что этот примитив не преследует цепочку заголовков протокола.

tcp, udp, icmp

Аббревиатура для:

proto p

где p является одним из перечисленных выше протоколов.

ip6 protochain протокол

Истина, если пакетом является IPv6 пакет и он содержит заголовок протокола с типом протокол в своей цепочке заголовков протокола. Например:

ip6 protochain 6

соответствует любому IPv6 пакету с заголовком протокола TCP в цепочке заголовков протокола. Пакет может содержать, например, заголовок аутентификации, заголовок маршрутизации или заголовок опции hop-by-hop между IPv6 заголовком и TCP заголовком. Код BPF, генерируемый этим примитивом, является сложным и не может быть оптимизирован в BPF optimizer code и не поддерживается механизмами фильтрации в ядре, поэтому это может быть несколько медленным и может привести к потере большего количества пакетов.

ip protochain протокол

Эквивалент для ip6 protochain протокол, но это для IPv4.

protochain протокол

Истина, если пакетом является IPv4 или IPv6 пакет с типом протокола протокол. Обратите внимание, что этот примитив преследует цепочку заголовков протокола.

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 с типом протокол. Протоколом может быть число или одно из имён: ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx или netbeui. Обратите внимание, что идентификаторы также являются ключевыми словами и должны быть экранированы обратным слэшем (\).

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

 

[В ПРОЦЕССЕ ПОДГОТОВКИ]

 

 

wlan ra ehost

Истина, если IEEE 802.11 RA является ehost. Поле RA используется во всех фреймах, кроме управляющих фреймов.

wlan ta ehost

Истина, если IEEE 802.11 TA является ehost. Поле TA используется во всех фреймах, кроме управляющих фреймов и контрольных фреймов CTS (Clear To Send) и ACK (Acknowledgment).

wlan addr1 ehost

Истина, если первый адрес IEEE 802.11 является ehost.

wlan addr2 ehost

Истина, если второй адрес IEEE 802.11, если он присутствует, является ehost. Поле второго адреса используется во всех фреймах, кроме контрольных фреймов CTS (Clear To Send) и ACK (Acknowledgment).

wlan addr3 ehost

Истина, если третий адрес IEEE 802.11, если он присутствует, является ehost. Поле третьего адреса используется в управляющих фреймах и фреймах данных, но не в контрольных фреймах.

wlan addr4 ehost

Истина, если четвёртый адрес IEEE 802.11, если он присутствует, является ehost. Поле четвёртого адреса используется для фреймов WDS (Wireless Distribution System).

type wlan_type

Истина, если тип фреймов IEEE 802.11 совпадает с указанным wlan_type. Действительными типами являются: mgt, ctl и data.

type wlan_type subtype wlan_subtype

Истина, если тип фреймов IEEE 802.11 совпадает с указанным типом wlan_type и подтип фреймов совпадает с указанным wlan_subtype.

Если указанным wlan_type является mgt, тогда действительными wlan_subtypes являются: assoc-req, assoc-resp, reassoc-req, reassoc-resp, probe-req, probe-resp, beacon, atim, disassoc, auth и deauth.

Если указанным wlan_type является ctl, тогда действительными wlan_subtypes являются: ps-poll, rts, cts, ack, cf-end и cf-end-ack.

Если указанным wlan_type является data, тогда действительными wlan_subtypes являются: data, data-cf-ack, data-cf-poll, data-cf-ack-poll, null, cf-ack, cf-poll, cf-ack-poll, qos-data, qos-data-cf-ack, qos-data-cf-poll, qos-data-cf-ack-poll, qos, qos-cf-poll и qos-cf-ack-poll.

subtype wlan_subtype

Истина, если фрейм подтипа IEEE 802.11 совпадает с указанным wlan_subtype и фрейм имеет тип к которому принадлежит указанный wlan_subtype.

dir направление

Истина, если фрейм направления IEEE 802.11 совпадает с указанным направлением. В качестве направлений могут быть указаны: nods, tods, fromds, dstods или цифровое значение.

 

 

[В ПРОЦЕССЕ ПОДГОТОВКИ]

 

 

Фильтрация по размеру и заголовкам пакетов

выражение отношение выражение

В качестве отношения может быть >, <, >=, <=, =, !=, а выражение является арифметическим выражением, состоящим из целочисленных констант (выраженных в стандартном синтаксисе C), нормальных бинарных операторов [+, -, *, /, %, &, |, ^, <<, >>], операторов длины и специальных средства доступа к данным пакета. Обратите внимание, что все сравнения являются беззнаковыми, то есть. Например, 0x80000000 и 0xffffffff является > 0.

Операторы % и ^ в настоящее время поддерживаются для фильтрации в ядре только в Linux с 3.7 и более поздними ядрами; во всех других системах, если эти операторы используются, фильтрация будет выполняться в пользовательском режиме, что увеличит накладные расходы на захват пакетов и может привести к потере большего количества пакетов.

Чтобы получить доступ к данным внутри пакета, используйте следующий синтаксис:

proto [ выражение : размер ]

Proto это один из ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp, tcp, udp, icmp, ip6 или radio, и указывает уровень протокола для операции индекса. (ether, fddi, wlan, tr, ppp, slip и link все относятся к канальному уровню. radio относится к «заголовку радио», добавленному к некоторым перехватам 802.11.) Обратите внимание, что протоколы tcp, udp и другие типы протоколов верхнего уровня применяются только к IPv4, а не IPv6 (это будет исправлено в будущем). Смещение в байтах относительно указанного уровня протокола определяется выражением выражение. Размер не является обязательным и указывает количество байтов в интересующем поле; это может быть один, два или четыре, по умолчанию один. Оператор длины, обозначенный ключевым словом len, даёт длину пакета.

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

Некоторые смещения и значения полей могут быть выражены как имена, а не как числовые значения. Доступны следующие смещения полей заголовка протокола: icmptype (поле типа ICMP), icmp6type (поле типа ICMP v6), icmpcode (поле кода ICMP), icmp6code (поле кода ICMP v6) и tcpflags (поле флагов TCP).

Доступны следующие значения полей типа ICMP: icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmptimxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

Доступны следующие поля типа ICMPv6: icmp6-echo, icmp6-echoreply, icmp6-multicastlistenerquery, icmp6-multicastlistenerreportv1, icmp6-multicastlistenerdone, icmp6-routersolicit, icmp6-routeradvert, icmp6-neighborsolicit, icmp6-neighboradvert, icmp6-redirect, icmp6-routerrenum, icmp6-nodeinformationquery, icmp6-nodeinformation‐response, icmp6-ineighbordiscoverysolicit, icmp6-ineighbordiscoveryadvert, icmp6-multicastlistenerreportv2, icmp6-homeagentdiscoveryrequest, icmp6-homeagentdiscoveryreply, icmp6-mobileprefixsolicit, icmp6-mobileprefixadvert, icmp6-certpathsolicit, icmp6-certpathadvert, icmp6-multicastrouteradvert, icmp6-multicastroutersolicit, icmp6-multi‐castrouterterm.

Доступны следующие значения полей флагов TCP: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg, tcp-ece, tcp-cwr.

Комбинация примитивов

Примитивы могут быть комбинированы друг с другом используя:

  • Помещение группы примитивов и операторов в скобки
  • Отрицание («!» или «not»).
  • Конкатенация, то есть логическое И («&&» или «and»).
  • Логическое ИЛИ («||» или «or»).

Отрицание имеет наивысший приоритет. Логическое ИЛИ и конкатенация имеют равный приоритет и связывают слева направо. Note that explicit and tokens, not juxtaposition, are now required for concatenation. [не переведено, т. к. не понял смысл]

Если идентификатор задан без ключевого слова, то подразумевается самое последнее ключевое слово. Например:

not host vs and ace

это сокращение для

not host vs and host ace

что не следует путать с

not ( host vs or ace )

Примеры

Для выбора всех пакетов прибывающих или отправляющихся с sundown:

host sundown

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

host helios and \( hot or ace \)

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

ip host ace and not helios

Для выбора всего трафика между локальными хостами и хостами на Berkeley:

net ucb-ether

Для выбора всего ftp трафика через интернет шлюз snup:

gateway snup and (port ftp or ftp-data)

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

ip and not net localnet

Для выбора начального и конечного пакетов (SYN и FIN пакеты) каждого TCP разговора в который вовлечён нелокальный хост:

tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet

Для выбора всех IPv4 HTTP пакетов к и от 80 порта, то есть напечатать только пакеты, которые содержат данные, не, например, SYN и FIN пакеты и только ACK пакеты (IPv6 оставлен в качестве упражнения для читателей):

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

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

gateway snup and ip[2:2] > 576

Для выбора IP широковещательных (broadcast) или мультивещательных (multicast) пакетов, которые не были отправлены через Ethernet broadcast или multicast:

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

Выбор всех ICMP пакетов, которые не являются запросами/ответами echo (то есть не пакеты ping):

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

Рекомендуемые статьи:

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *