|
Универсальные правила являются мощным и гибким механизмом создания фильтров с помощью булевой логики. Требуются лишь элементарные знания математики и логики; синтаксис правил несложен для понимания.

Обзор
Чтобы создать новое правило, задайте ему произвольное имя в поле Имя, выберите действие (Захват пакетов/Игнорировать пакеты), в поле Формула задайте формулу, пользуясь синтаксисом, описанным ниже, и нажмите Добавить/Изменить. Новое правило будет добавлено в список и немедленно активизировано. Вы можете задать неограниченное количество правил, но активными из них буду лишь те, возле которых будет установлена метка. Любое правило можно включить/выключить, изменяя соответствующий флажок, либо совсем удалить правило с помощью кнопки Удалить. Если активны сразу несколько правил, вы можете выполнить комбинированное правило, нажав на кнопку Оценить. Обратите внимание, что отдельные правила объединяются логическим оператором OR ("ИЛИ"). Пример: для трех активных правил RULE1, RULE2, RULE3, результирующим будет правило RULE1 OR RULE2 OR RULE3.
Можно пользоваться составными правилами совместно с обычными, описанными в предыдущей главе. Однако, если вы владеете булевой логикой, рекомендуем пользоваться только составными, так как они более гибки. Обычные правила объединяются с составными с помощью логического оператора AND ("И").
Описание синтаксиса
dir – Направление пакета. Возможные значения - in (входящий), out (исходящий) и pass (транзитный).
etherproto – Протокол Ethernet (13-й и 14-й байты пакета). Допустимыми значениями являются числа (например, etherproto=0x0800 соответствует протоколу IP) или известные аббревиатуры (например, etherproto=ARP, что соответствует 0x0806).
ipproto – Протокол IP. Допустимыми значениями являются числа (например, ipproto!=0x06 соответствует протоколу TCP) или известные аббревиатуры (например, ipproto=UDP, что соответствует 0x11).
smac – MAC источника. Допустимыми значениями являются MAC-адреса источников в шестнадцатеричном виде (например, smac=00:00:21:0A:13:0F) или алиасы.
dmac – MAC получателя.
sip – IP- или IPv6-адрес источника. Допустимыми значениями являются IP-адреса, записанные через точку (например, sip=192.168.0.1 или sip= fe80::02c0:26ff:fe2d:edb5), IP-адреса с карт-бланшами (например, sip!=*.*.*.255, кроме адресов IPv6), сетевые адреса с масками подсетей (например, sip=192.168.0.4/255.255.255.240 или sip=192.168.0.5/28), диапазоны IP-адресов (то есть, sip from 192.168.0.15 to 192.168.0.18 или sip in 192.168.0.15 ... 192.168.0.18) или алиасы. Для работы с адресами IPv6 требуется версия Windows XP или выше, а также установленный протокол IPv6.
dip - IP-адрес получателя.
sport – Номер порта-источника пакета TCP или UDP. Допустимыми значениями являются числа (например, sport=80 соответствует HTTP), диапазоны (то есть, sport from 20 to 50 или sport in 20..50 для любых портов в диапазоне от 20 до 50) или алиасы, известные операционной системе (например, sport=ftp, что соответствует порту 21). Проверить список алиасов, известных ОС, можно нажав Вид => Информация о портах.
dport – Порт-получатель пакетов TCP или UDP.
flag – Флаг TCP. Допустимыми значениями являются числа (например, 0x18 соответствует PSH ACK), одна или несколько букв из следующего списка: F (FIN), S (SYN), R (RST), P (PSH), A (ACK) и U (URG) или ключевое слово has, означающее, что флаг содержит определённое значение. Например: flag=0x18, flag=SA, flag has F.
size – Размер пакета. Допустимыми значениями являются числа (например, size=1514) или диапазоны (size from 64 to 84 или size in 64..84 для размеров с 64 до 84 байтов).
str – Содержимое пакета. Задает условие, что пакет должен содержать определённую строку. Функция имеет три аргумента: образец поиска, местоположение, чувствительность к регистру. Первый аргумент – строка, например, 'GET'. Второй аргумент – число, показывающее смешение строки в пакете. Счёт начинается с нуля – первый байт пакета надо искать, задавая смещение равное 0. Чтобы искать строку в любом месте пакета, задайте смещение равным –1. Третий аргумент устанавливает чувствительность к регистру и может принимать значения false (без учёта регистра) или true (с учётом регистра). Второй и третий аргументы необязательны, по умолчанию имеют значения –1 и false соответственно (искать во всём пакете, без учёта регистра). Примеры: str ('GET',-1,false), str ('GET',-1), str ('GET').
hex - Содержимое пакета. Задает условие, что пакет должен содержать определённый 16-ричный набор. Функция имеет два аргумента: образец поиска и местоположение. Первый аргумент – 16-ричная величина, например, 0x4500. Второй аргумент – число, задающее смещение внутри пакета. Отсчёт ведется с нуля, т. е. первый байт пакета соответствует смещению, равному 0. Чтобы искать во всём пакете, задайте смещение равным –1. Второй аргумент необязателен, по умолчанию имеет значение –1 (искать во всём пакете). Пример: hex (0x04500, 14) , hex (0x4500, 0x0E), hex (0x010101).
bit - Содержимое пакета. Задает условие, что пакет должен содержать по указанному смещению определённый бит, имеющий значение 1. В этом случае функция вернёт код возврата true. Если же искомый бит имеет значение 0 или находится за пределами пакета - функция вернёт код возврата false. Первый аргумент – номер бита в байте, начиная с нуля; допустимые значения 0-7. Таким образом, если вы ищете восьмой бит, установите номер равным семи. Второй аргумент – число, обозначающее смещение байта в пакете, начиная с нуля, то есть, если нужен первый байт пакета – смещение должно быть равно 0. Оба аргумента обязательны, например: bit(0, 14) , bit(5, 1).
Вышеописанные ключевые слова можно использовать со следующими операторами:
and - Конъюнкция, булево И.
or - Дизъюнкция, булево ИЛИ.
not - Булево отрицание.
= - Арифметическое равенство.
!= - Арифметическое неравенство.
<> - Арифметическое неравенство.
> - Арифметическое условие "больше, чем".
< - Арифметическое условие "меньше, чем".
( ) – Скобки, управляющие порядком вычисления правил.
Числа могут быть в десятичной или шестнадцатеричной системе. Для указания на шестнадцатеричную нотацию, используйте 0x перед значением, например, 15 и 0x0F задают одно и то же число.
Примеры
Ниже приведены несколько примеров, поясняющих синтаксис правил. К каждому правилу даны комментарии, отделяемые двойной косой чертой.
| • | dir!=pass // Захватывать только входящие и исходящие пакеты. Транзитные пакеты игнорируются. |
| • | (smac=00:00:21:0A:13:0E or smac=00:00:21:0A:13:0F) and etherproto=arp // Захватывать пакеты ARP, посылаемые двумя компьютерами с MAC 00:00:21:0A:13:0E и 00:00:21:0A:13:0F. |
| • | ipproto=udp and dport=137 // Захватывать пакеты UDP/IP, посылаемые в порт 137. |
| • | dport=25 and str('RCPT TO:', -1, true) // Захватывать пакеты TCP/IP или UDP/IP, содержащие строку "RCPT TO:" и направляемые в порт 25. |
| • | not (sport>110) // Захватывать все пакеты, кроме тех, что имеют порт-источник с номером выше 110. |
| • | (sip=192.168.0.3 and dip=192.168.0.15) or (sip=192.168.0.15 and dip=192.168.0.3) // Захватывать только IP-пакеты, следующие между двумя хостами, 192.168.0.3 и 192.168.0.15. Все остальные игнорируются. |
| • | ((sip from 192.168.0.3 to 192.168.0.7) and (dip = 192.168.1.0/28)) and (flag=PA) and (size in 200..600) // Захватывать TCP-пакеты, размер которых лежит в диапазоне от 200 до 600 байтов, приходящие с IP-адресов в диапазоне 192.168.0.3 - 192.168.0.7, причем IP-адреса получателей находятся в сегменте 192.168.1.0/255.255.255.240, и имеющие TCP-флаг PSH ACK. |
| • | Hex(0x0203, 89) and (dir<>in) // Захватывать пакеты, содержащие 0x0203 в смещении 89, при этом направление пакета - не "входящий". |
|