Правильно построенный фильтр обеспечивает всей интересующей информацией. Именно от продуманности фильтра зависит то, насколько полезная и достаточная информация будет выдаваться.
По каждому правилу ведётся подсчёт как прямого так и обратного направления передачи. Т.е. из очередного пакета берутся данные источника и приёмника и проверяются через фильтр, у соответствующих правил изменяется "прямая" статистика. Затем, данные источника и приёмника меняются местами и эта информация повторно проверяется через фильтр, у соответствующих правил изменяется "обратная" статистика. Т.е. каждое правило имеет два счётчика байт ("sent" - отправлено и "recv" - получено).
После подготовки фильтра его необходимо передать tv3 с помощью rexx-скрипта <директория tv3>\REXX\setfilter.cmd :
setfilter.cmd имя_файла
Тоже самое можно сделать через WEB-интерфейс (см. XML-source). Установка нового фильтра не требует перезапуска tv3.
Проще всего понять логику работы фильтра на конкретном примере.
Рассмотрим простую задачу подсчёта трафиков интернет-шлюза, имеющего почтовый сервис (smtp) и proxy-сервер. Необходимо подсчитывать статистику каждого пользователя proxy-сервера и трафик приходящий на почтовый сервис из Интернет. Допустим, адрес локальной сети - 192.168.33.0 маска сети - 255.255.255.0 , адрес шлюза в локальной сети - 192.168.33.1 , реальный адрес шлюза со стороны Интернет - 195.72.224.229 , порт smtp - 25, proxy - 8080. Пользователи: 192.168.33.2, 192.168.33.3, 192.168.33.4 . Схематически правила нашего фильтра будут выглядеть следующим образом:
Как видим, правило 2 имеет вложенные правила, это сделано для того, чтобы не указывать для каждого пользователя адрес и порт назначения: вложенные правила будут просматриваться только если выполнились условия родительского правила. Это не только упрощает задание правил, но и повышает производительность работы фильтра: правила пользователей не будут вообще просматриваться, если пакет не является запросом к proxy-серверу из внутренней сети.
В виде XML этот фильтр будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>rule - правило фильтра, атрибуты: stop (Y/N) - если правило сработало, суммировать статистику и остановить просмотр правил данного уровня вложенности. dataonly (Y/N) - подсчитывать общую длину пакета, включая заголовок протокола (N), либо только размер данных (Y). При подсчёте заголовок пакета обычно учитывается, ситуация когда необходимо считать только объём передаваемых протоколом данных довольно специфична и на практике используется редко. Реальный передаваемый объём информации в некоторых условиях (плохие линии связи, неоптимальная настройка сетевых служб) может значительно превышать объём данных за счёт фрагментации пакетов.
path - этот элемент на работу фильтра не влияет, однако используется клиентами для отображения статистики в виде древовидной структуры, узлы целевого дерева, которое строится на основании элементов path, разделяются символом "/". Так, из нашего фильтра пользователю будет предоставлена следующая наглядная структура:
Если элемент path не указан - статистика данного правила пользователю не отображается, далее будет показано как это может быть использовано.
src/dst - адреса, соответственно, источника и приёмника в виде: IP-адрес/маска_сети. Если маска не указана, её значение принимается равным 255.255.255.255 . Маска может быть задана либо в виде 4х чисел, разделённых точками, либо в виде одного числа, указывающего количество бит адреса маски. В одном правиле допускается указание до 255ти адресов источников и/или приёмников. В качестве адреса допускаются ключевые слова: HOST - любой IP-адрес принадлежащий данному компьютеру (на котором запущен tv3), OTHER - любой IP-адрес не принадлежащий данному компьютеру. Также, может быть задан MAC-адрес, например 00:15:f2:d6:fa:f5, в этом случае будут использоваться IP-адреса соответствующие данному MAC-адресу из локальной ARP-таблицы. Если элемент src(dst) не указан, то принимаются пакеты с любыми адресами источника(приёмника).
proto - протокол и порты источника и приёмника (UDP, TCP), либо тип протокола (ICMP). Атрибут name указывает протокол и может принимать значения UDP, TCP, ICMP, OTHER (ни один из предыдущих трёх) или ANY (любой). Значение элемента - списки портов источника и приёмника, разделённые символом ":". Списки могут указывать множество портов через запятую: 25,110,80 и/или диапазоны: 100-3000. Также указываются логические значения больше/меньше/не суффиксами, соответственно "gt","lt","!". Вместо указания портов источника или приёмника можно использовать значение "any" или "*" (любой).
Например:
<proto name="tcp">gt1023:25,110</proto> - TCP-пакет с порта источника больше 1023 на порт приёмника 25 или 110
<proto name="udp">!gt1024:100-3000,3050</proto> - UDP-пакет с порта источника 1024 или меньше на порт приёмника от 100 до 3000 включительно, или 3050
<proto name="icmp">0,9:0,9</proto>Отдельно нужно отметить, что для указания типа (номера) протокола ICMP оба значения до и после разделителя ":" должны быть одинаковыми. Для типа OTHER оба значения должны быть "*" (или any).
В правиле может быть указано несколько элементов proto. Если не задан ни один элемент proto, то проверка на принадлежность пакета к какому-либо протоколу не осуществляется и учитываются пакеты любых протоколов.
Вернёмся к нашему фильтру в первой части данного раздела. Предположим ситуацию, когда между внутренним и внешним интерфейсами включена маршрутизация, а в локальной сети могут появляться мобильные пользователи нашего почтового сервера, которые обращаются к сервису SMTP по адресу внешнего интерфейса. Любой пакет отправленный от такого пользователя из локальной сети почтовой службе будет соответствовать первому правилу, но задача состояла в подсчёте внешнего Интернет-трафика на сервис SMTP. Для исключения этой ситуации перепишем первое правило в виде правила с двумя вложенными:
Таким образом, все пакеты на порт 25 из локальной сети на адрес внешнего интерфейса нашего сервера будут попадать в первое вложенное правило, а пакеты из Интернет - во второе. Обратим внимание на то, что элемент path задан только в одном правиле, именно это правило ведёт подсчёт нужной нам статистики. Статистика родительского и первого вложенного правила нас не интересует, поэтому для них задавать path нет смысла и они не будут отображаться клиентами tv3.
При построении фильтра на практике периодически возникает необходимость узнать, какие же конкретно пакеты попадают в то или иное правило. Для таких ситуаций удобно применять «прослушку» правил. Любое правило может быть переведено в режим, когда запоминаются данные пакетов изменивших статистику правила. Данную операцию могут выполнять только пользователи с правами администратора.
Удобней всего это сделать через WEB-интерфейс: перейдите в раздел "Filter" (см. View) и щёлкните на заголовке интересующего правила. Появится окно в котором, после авторизации, каждые 5-10 секунд будет отображаться информация о нескольких последних попавших в правило пакетах (направление передачи, адреса источника и приёмника, длинна пакета).
Если какая-либо запись в этом списке имеет направление "both" - это означает, что соответствующий пакет повлиял как на «прямую», так и на «обратную» статистику правила, чего не может быть в правильно построенном фильтре.
Для получения этих данных из командной строки используется скрипт <директория tv3>\observer.cmd .