NeTAMS

Network Traffic Accounting and Management System

(c) 1998-2003 Anton Vinokurov
(c) 2003 NeTAMS Development Team
All rights reserved. See 'Copying' file included in distribution.
For latest version and more info, visit this project web page located at http://www.netams.com
Document version 1.6 / Software version 3.1(1554) / Document date 16-05-2003

Содержание:

  1. Что это такое и зачем оно нужно
  2. Инсталляция
  3. Основные принципы работы
  4. Настройка и первый запуск
  5. Справочник команд
  6. Типичные конфигурации и тонкая настройка
  7. Как сообщить об ошибках и откуда они могут возникнуть
  8. Настройка операционной системы для бесперебойной работы NeTAMS
  9. Безопасность

  10. Разное

1. Что это такое и зачем оно нужно

NeTAMS - это программа, которая занимается контролем и учетом сетевого траффика, проходящего через ваш сервер.

Не секрет, что универсального средства учета траффика не существует. Множество программ, программулек и скриптов, которые можно легко разыскать в интернете, могут решить ограниченный круг задач, тот который заложил при создании автор. Такие решения обычно не масштабируемы, легко настраиваются и трудно управляются. Практически невозможно добиться от такой программы хоть чуть-чуть большего, чем запланированно конструкцией. Большинство "скриптов" не переживают перезагрузки сервера и вряд ли могут обеспечить информацию о траффике за позавчера. NeTAMS пробует сделать для вас то, что было возможно раньше за большие деньги. Эта программа будет учитывать потоки IP-траффика, проходящие через Unix-маршрутизатор, в том числе с трансляцией адресов, сохранять статистику в базе, предоставлять контроль доступа для отдельных машин и для групп компьютеров.

NeTAMS собирает в себя потоки информации о траффике, IP и не только, например, путем перехвата проходящих пакетов через сетевой интерфейс (libpcap), divert socket (ipfw divert), поток NetFlow или любой другой модуль. После обработки и суммирования данных информация о статистике попадает в БД, откуда любая статистика может быть запрошена посредством прямого запроса или через веб-интерфейс. Попутно может осуществляться контроль доступа, квот и прав пользования. Управление программой осуществляется посредством установления соединения на некий TCP порт сервера клиентом telnet и ввода соответствующих команд. Имеется также веб-интерфейс отображения статистики.

2. Инсталляция

Для успешной инсталляции и настройки вы должны обладать как минимум базовыми знаниями о функционировании ОС Unix и принципами работы TCP/IP. В любом случае, дочитайте эту документацию до конца, чтобы правильно произвести все настройки.

Распакуйте архив куда-нибудь, например, в каталог /usr/local/netams

tar zxvf netams-3.1.XXXX.tar.gz /usr/local

Исправляем настройки в Makefile для установки путей и использования типа БД и операционной системы. Конфигурирующий скрипт будет сделан позже. Также вы можете исправить пути по умолчанию до файла конфигурации и лог-файла. Значения по умолчанию:
PATH_TO_CONFIG="/root/netams/netams.cfg"
PATH_TO_LOG="/var/log/netams.log"

Требование я системе: Компилируем:

make

Если компиляция прошла успешно, и в текущем каталоге появился исполняемый файл src/netams, поздравляю - все нормально. Если в процессе компиляции возникли ошибки, и сборка программы была прервана, смотрите раздел 7.

При компиляции создается утилита управления, вызываемая из командной строки, netamsctl, при помощи которой можно существенно облегчить и автоматизировать ваше работу. Формат ее вызова:
netamsctl [-f path_to_rcfile] cmd
где:
path_to_rcfile - необязательный параметр, путь до файла настроек netamsctl (см. далее)
cmd - команда, которую исполняет netams, может состоять из нескольких слов. Не забывайте экранировать кавычки (\"something\")

Файл настроек, если не указан, последовательно ищется в путях:
~/.netamsctl.rc
.netamsctl.rc
/usr/local/etc/.netamsctl.rc
/etc/.netamsctl.rc
Он состоит из нескольких строчек вида key=value, варианты ключей:
login=... - имя пользователя для захода в программу
password=.. - его пароль
host=... - имя хоста, по умолчанию localhost
port=... - номер TCP-порта, по умолчанию 20001

Теперь необходимо подготовить конфигурационный файл для первого запуска. Для этого необходимо четко уяснить принципы работы NeTAMS, что будет рассмотрено далее.

3. Основные принципы работы

Демон NeTAMS написан на языке С++ и представляет собой многопоточное приложение. Каждый поток занимается своим делом: обрабатывает проходящий траффик, сохраняет данные в базу, отвечает на внешние запросы и прочее. Схема приведена на рисунке.

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

Сервис main представляет собой главный поток, с исполнения которого начинает программа. Он определяет основные свойства всего процесса, считывает и разбирает конфигурационный файл, запуская другие сервисы, и впадает в сон до завершения работы NeTAMS. При подаче команд kill, shutdown, reload, возникновении критического сбоя или получении сигнала SIGQUIT сервис main просыпается и пытается остановить все другие сервисы, чтобы корректно закрыть базы данных и убрать перехватчики пакетов.

Сервис processor является ядром NeTAMS, так как именно в нем определяется список объектов, по которым будет произведен учет, и самих правил учета. Вообще, все компоненты системы обмениваются между собой сообщениями, например запросами к БД или данными о траффике за некий момент. Processor обеспечивает диспетчеризацию всех сообщений. Всего возможен только один processor на экземпляр программы.

Сервис server обеспечивает возможность присоединяться к работающей программе через tcp-сокет; с помощью различных команд возможно управление программой и съём статистики

Сервис data-source обеспечивает поступление данных о траффике вовнутрь программы. В настоящее время в качестве обрабатываемых данных может быть только информация об IP-траффике, хотя в существующей схеме возможно собирать статистику о чем угодно, например о работе почтовой системы, прокси-сервера или учитывать голосовые звонки. В качестве источников данных об IP-траффике могут выступать средства перехвата пакетов систем FreeBSD (bsd-divert) Linux (ip_queue), прослушивания сетевого интерфейса (libpcap/bpf), статистика NetFlow, приходящая от маршрутизаторов Cisco. Вы сами также можете написать свой модуль.

Сервис storage определяет БД, в которой будет сохраняться статистика. Это может быть стандартный UNIX hash, который есть в любой системе, или SQL база данных, расположенная на локальной или на соседней машине. Статистика может существовать в двух форматах: raw или summary, в одной базе вы можете держать или один из форматов, или оба сразу.

Сервис alerter позволяет администратору организовывать отправку себе или пользователям отчета о прошедшем и учтенном траффике, информации о деятельности системы и пр.

Сервис scheduler обеспечивает выполнение заданных команд в запланированное время. Это "виртуальный" сервис, т.к. запускается всегда автоматически и не требует конфигурирования. Смысл имеют только запланированные команды, список которых выводится в конфигурационном файле после перечисления пользователей.

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

Сервис monitor организует мониторинг заданных юнитов для сбора информации по относящемуся к ним траффику.

Каждый объект в системе имеет свой уникальный номер, так называемый OID, object identificator, который является ключом в базе данных. Он генерируется автоматически при создании объекта, так что не забывайте сохранять конфигурационный файл после изменений. Индексация по именам объектов неэффективна с точки зрения производительности, к тому же после переименования объекта старая статистика была бы утеряна. Идентификатор представляется в виде шестнадцатеричного числа, записанного шестью символами. Его значение не несет большого смысла, кроме того, что по первому байту определяется тип идентификатора.

NeTAMS изначально спроектирован так, чтобы учитывать все что угодно, будь то траффик или статистика прокси-сервера, или логины в систему. В настоящее время реализован только учет IP-траффика. Основной "учетной единицей" является unit, или NetUnit, который определяется при конфигурировании сервиса processor. В качестве такой единицы выступают:

Например:

unit group oid 056255 name MYNET
unit host oid 02238E name gate ip 195.208.22.1 acct-policy all-ip all-web
unit cluster oid 0346E8 name srv ip 195.208.22.2 ip 212.192.24.27
unit net oid 043D1B name net1 ip 195.208.22.0 mask 255.255.255.0 parent MYNET

Каждый unit помимо идентификатора OID, и имени, имеет сведения о принадлежности какой-либо группе (он также может не принадлежать никакой группе), о своих параметрах (IP-адрес или, например, маска сети), а также два типа политик учета и фильтрации траффика.

В то время как предшественник NeTAMS (aaa+fw) учитывал только ip-only траффик, сейчас есть возможность делить данные по другим признакам. Они определяются при задании политики, policy. Политика может определять правила фильтрации и учета. В любом случае помимо имени и OID, указывается тип политики и target, т.е. принцип по которому будет проведен учет. Например:

policy acct oid 146633 name all-icmp target icmp
policy fw oid 1574B0 name all-web target tcp-http
policy fw oid 153333 name server target units oid 0346E8

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

  1. Если сервис data-source настроен так, что данный пакет "заворачивается" в программу, то анализируется заголовок пакета
  2. Проверяется, какому unit из конфигурации соответствует пакет, путем сопоставления всей таблицы с полями ip_src и ip_dst заголовка пакета. Один и тот же пакет может соответствовать нескольким учетным единицам, и относиться к нескольким вложенным группам.
  3. Для каждого NetUnit последовательно перебирается цепочка установленных политик на фильтрацию траффика, проверяется соответствует ли пакет установленной политике. Если после последовательного перебора всего списка пакет "пропущен", аналогично перебирается цепочка установленных правил учета (acct-policy), и если пакет попадает под соответствующее правило, для данного unit происходит увеличение соответствующего данной acct-policy счетчика. В случае ip-траффика это величины bytes in/out.
  4. Если пакет не пропущен правилом fw-policy, пакет молча отбрасывается и учет траффика по нему не ведется. В противном случае пакет возвращается ядру ОС.

Данные о траффике накапливаются в виде "потоков" (flows), которые периодически (за это отвечает параметр flow-lifetime сервиса processor) сбрасываются в базу данных (таблица raw), дополнительно в системе поддерживаются значения счетчиков о прошедшем траффике с начала текущего часа, дня, недели, месяца и с того момента, когда данная комбинация unit+policy была задана. По истечении соответствующего временного интервала данные о траффике за прошедший интервал все равно остаются в базе (таблица summary), вернее данные все время пересохраняются в базе, обеспечивая надежность и сохранение целостности статистики на время перезагрузок системы.

Информацию о текущем траффике можно получить, подсоединившись к программе по протоколу telnet и набрав команды:

show list full
send report to {user_name} on {unit_name}

Подробнее смотрите справочник команд.

4. Настройка и первый запуск

Создадим простейший конфигурационный файл и попробуем запустить программу. Этот файл по умолчанию должен называться /usr/local/etc/netams.cfg

# configuration file example 1 begin
debug none
user name admin real-name Admin email root@localhost password 123 permit all

service server 0
login any
listen 20001
max-conn 6
# configuration file example 1 end

Запускаем:

./netams -ld

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

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

# configuration file example 2 begin
debug none
user name admin real-name Admin email root@localhost password 123 permit all

service server 0
login any
listen 20001
max-conn 6

service processor 0
lookup-delay 2
flow-lifetime 5
policy acct name all-ip target ip
unit group name ALL acct-policy all-ip
unit host name server ip 192.168.1.1 parent ALL acct-policy all-ip
storage 1 all

service storage 1
type hash
path /tmp 

service data-source 1
type ip-traffic
source divert 199
rule 10 "ip from any to any via rl0"

service alerter 1
report oid 06100 name rep1 type traffic period day detail simple 
smtp-server localhost
# configuration file example 2 end

5. Справочник команд

Информация о командах их параметрах сгруппирована по сервисам

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

Вы всегда можете получить справку о доступных командах набрав ? ; для справки о параметрах наберите имя_команды ? . В ответ вы получите нечто вроде:

>?
top level commands
           data | send raw data to processor service
          debug | turning on or off debugging on some action
           exit | finish this client session and disconnect
           kill | kill the daemon very quickly, with last data loss
           mode | switch the client operation mode
           read | get raw data from processor service
         reload | gracefully shutdown and restart the daemon
           save | write the running config to a file
        service | set up service
           show | shows various system parameters
       shutdown | gracefully shut down the daemon
           user | users management
       schedule | schedule an action to do it intime

>show ?
shows various system parameters
         config | running configuration
    connections | active connections to server
           list | NetUnits list with applied policy list
         policy | policy list
      processor | processor service status
          units | NetUnits list
          users | users list
        version | software version and current status
       schedule | active scheduled actions
Каждая команда, будь это строка конфигурационного файла или введенная пользователем команда, обрабатывается соответствующим сервисом. Сначала конфигурируется сервис main, в котором регистрируются администраторы и пользователи системы. Также определяется тип выводимой отладочной информации и задания планировщика.

service: main, runtime: yes
user [oid OID] name user_name [real-name user_human_name] [email email_addr] [password pass] [permit permit_state]
       команда, которая задает пользователя системы и его права
       oid OID - уникальный идентификатор пользователя, создается автоматически
       name user_name - логин пользователя программы
       real-name user_human_name - его человеческое имя, может быть в кавычках
       email email_addr - адрес почты для отправки статистики пользователю
       password pass - пароль на вход, не зашифрованный
       crypted cryptedpass - пароль на вход, зашифрованный. если в конфигурационном файле был введен незашифрованный пароль, то он автоматически шифруется, и при выводе show config или save выдается именно шифрованная версия.
       permit permit_state - права пользователя в системе, от none до all
no user {oid OID} | {name user_name}
       удаляет пользователя из программы

service: main, runtime: yes
debug deb_str [deb_str ...]
       команда, которая задает тип выводимой в ходе работы отладочной информации о деятельности сервисов
       deb_str - идентификатор типа отладки
             none - отсутствие всех видов отладки
             command - введенные пользователем/файлом конфигурации команды
             parse - разбор введенных команд
             sleep - работа механизма синхронизации сервисов
             server - работа сервиса server
             proc_mux - мультиплексор сообщений сервиса processor
             ds_ip - данные ip сервиса data-source
             storage - работа сервиса storage
             alert - работа сервиса alerter
             scheduler - работа сервиса scheduler
             netflow - данные netflow сервиса data-source
             monitor - данные по пакетам для указанных units
             all - наличие всех видов отладки
no debug deb_str [deb_str ...]
       отключает отладку указанного типа

service: main, runtime: yes
schedule [oid OID] time time_period action requested_action
       задает расписание, по которому будет исполняться заданная команда
       oid OID - уникальный идентификатор задачи, создается автоматически
       time time_period - время или интервал, когда будет выполнена команда
             <число><указатель_времени>, например schedule time 1min action "show version". возможные указатели: sec, min, hour, day, week, month. указанная команда исполнится через соответствующий промежуток времени и будет после исполнения запланирована снова.
             {hourly|daily|weekly|monthly}, команда будет исполнена в первую секунду начала каждого периода, независимо от времени ее задания. например schedule time weekly action save будет автоматически сохранять конфиг в первую секунду понедельника, т.е. начала недели.
             at-XX:XX, команда запланируестя на заданное время и будет выполняться ежедневно. например schedule time at-22:00 action save
             если после time_period поставить знак '+', то выполнение команды запланируется на 10 секунд позже, чем указано
       action requested_action - запланированная команда - любая допустимая. если в ней несколько слов, заключите ее полностью в кавычки, а если в самой команде нужны кавычки, то используйте апострофы.
no schedule oid OID
       отменяет запланированную задачу
show schedule отображает список текущих задач планировщика


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

service XXX N

где N - номер экземпляра сервиса. Он должен быть ненулевым положительным числом, особенно это касается сервиса storage, который не переносит нулевой номер. Теоретически, сервисов каждого типа может быть несколько, на номер экземпляра можно потом ссылаться отдельно. Исключения составляют сервис main, который всегда один и запускается автоматически, и сервис processor, который может быть только один. Порядок записи не важен, но практически я рекомендую придерживаться следующего порядка:
Сервис server
service: server, runtime: no
listen XXXX
       определяет tcp-порт, на котором программа будет ожидать входящих соединений для управления своей работой или сбора статистики.
       XXXX - номер порта TCP (1...65535), по умолчанию 20001

service: server, runtime: yes
max-conn XXXX
       устанавливает максимальное число одновременно открытых подключений к процессу.
       XXXX - количество одновременных соединений, по умолчанию 6

service: server, runtime: yes
login {any|localhost}
       определяет возможность подключения с любого адреса или непосредственно с самого сервера, с точки зрения безопасности лучше выбрать последнее.
       any - соединение возможно с любого хоста
       localhost - соединение возмодно только с этой машины (127.0.0.1)

Сервис processor описывает настройки ядра NeTAMS, которое и будет производить учет.

service: processor, runtime: yes
lookup-delay XXXX
       определяет периодичность, с которой сервис processor будет просматривать список своих NetUnit чтобы проверить время существования потоков и сбросить их в базу данных. чем меньше это время, тем точнее идет "квантование" временных периодов но тем больше нагрузка на программу. на размер базы данных не влияет.
       XXX - время в секундах, по умолчанию 10.

service: processor, runtime: yes
flow-lifetime XXXX
       определяет время жизни потока. через указанное время поток обнуляется, а данныезаписываются в базу. чем меньше это время, тем с большей точностью записаны данные в базу, но тем она и больше.
       XXX - время в секундах, по умолчанию 600.

service: processor, runtime: yes
policy {acct|fw} [oid OID] name NAME target TARGET
       определяет некое правило, или политику, по которой для данного объекта (NetUnit) будет производиться фильтрация или подсчет траффика.
       acct - политика подсчета траффика
       fw - политика фильтрации траффика
       oid OID - уникальный идентификатор политики, создается автоматически
       name NAME - название политики в виде строки (2-8 символов)
       target TARGET - правило, по которому будет проводться проверка соответствия политике
Опишем подробнее правила формирования цели (target) политики. Сами политики жестко определены в исходном коде программы и вкомпилированы в обработчик политик траффика. Возможные варианты:
       ip весь ip траффик
       icmp весь траффик протокола ICMP
       tcp весь траффик протокола TCP
       udp весь траффик протокола UDP
       tcp-http траффик TCP при src или dst номерах портов=80,808,81,3128,443
       tcp-ports {s|d|}num {s|d|}num ... и udp-ports {s|d|}num {s|d|}num ... траффик TCP или соответственно UDP при совпадении соответствующих номеров портов. список портов - цифры, отделенные пробелом. если перед цифрой стоит буква s - совпадение происходит только если совпадает порт в поле SRC пакета, d - в DST пакета, отсутствие цифры - SRC и/или DST. например: target tcp-ports 25 описывает весь SMTP (почтовый)траффик, target tcp-ports s80 s81 s8080 - примененная к клиентскому компьютеру (юниту) такая политика считает входящий веб-траффик. ограничение на число портов в списке - 10. диапазоны портов не задаются.
       units oid XXXX весь траффик при том что другая сторона (по IP заголовку) является NetUnit с индексом XXXX
       file YYYY совпадает если другая сторона (по IP заголовку) совпадает с адресом из файла таблицы префиксов YYYY
Файл префиксов имеет следующую структуру:
A.B.C.D /N
где:
      A.B.C.D - адрес сети, например 212.67.32.0
      N - количество единичных битов в сетевой маске, например 24 (255.255.255.0)
В дистрибутиве идет файл ru-networks.txt, который построен на основе базы RIPE и содержит списки (почти) всех "российских" сетей. О деталях использования см. раздел 6.2.

service: processor, runtime: yes
restrict all {drop|pass} local {drop|pass}
задает политику фильтрации траффика для случая, когда fw-policy для объекта не определен
      all - для всех данных (всех ip-адресов src/dst)
      local - для данных, предназначенных объектам, описанным в конфигурационном файле
      drop - не пропускать пакет
      pass - пропускать пакет
Значение по умолчанию restrict all drop local pass приводит к тому, что для траффика, пакеты которого в заголовке в полях src/dst оба IP-адреса не принадлежат ни одной из описанных в конфигурационном файле машин/кластеров/сетей, этот траффик блокируется. Фактически, это означает что программа будет пропускать только данные с/для зарегистрированных машин "за" маршрутизатор. В случае установления restrict local drop вы обязаны явно для каждого юнита прописать fw-policy !что-то. Если для юнита не прописаны никакие политики acct-policy или fw-policy, то это эквивалентно применению к этому юниту параметра no-local-pass, т.е. применение restrict all вместо restrict local.
service: processor, runtime: yes
unit {host|group|cluster|net|user} [oid OID] name NAME [parameters] [parent GROUP] [no-local-pass] [email addr] [acct-policy [!]p_name [p_name] ...] [fw-policy [!]p_name [p_name] ...] [ds-list 1,2,3...]
определение объекта (NetUnit) по которому будет проводиться контроль и учет.
       host - хост, только один IP адрес
       group - группа (возможно пустая)
       cluster - хост с несколькими ip-адресами (кластер)
       net - подсеть, которая определяется сетевым адресом и маской
       oid OID - уникальный идентификатор сетевогй единицы, создается автоматически
       name NAME - название объекта в виде строки (2-8 символов)
       parameters - специфические для данного типа объекта параметры
             для хоста: ip A.B.C.D - адрес этого хоста
             для группы: нет
             для кластера: ip A.B.C.D [ip A.B.C.E [..]] - список адресов
             для подсети: ip A.B.C.D mask E.F.G.H - сетевой адрес и маска
       parent GROUP - название родительской для данного объекта группы
       no-local-pass - при указании этого флага ip-пакет, совпавший с этим юнитом, не будет считаться локальным, к нему применится политика фильтрации restrict all, а не restrict local (полезно для подсетей) (см. 6.3.)
       email addr - адрес электронной почты ответственного за этот юнит человека, эффективно только для unit user, требуется для работы сервисов quotactl и weblogin
       sys-XXXX - т.н. "системная политика", см. 6.8. возможные значения: sys-allow,
       acct-policy [!][%]p_name - разделенный пробелами список политик учета траффика для данного объекта
Если вы ставите восклицательный знак перед именем политики (без пробела), например !all-icmp, то совпадение/несовпадение данной политики применительно к пакету будет ИНВЕРТИРОВАНО, т.е. в данном случае будет учитываться ВЕСЬ НЕ-ICMP траффик. Учтите, что вы НЕ можете одновременно описывать две политики вроде
policy acct name all-tcp target tcp
unit ... acct-policy all-tcp !all-tcp
Все из-за того, что политики в базе хранятся по номерам, а здесь номера совпадают. Сделайте лучше:
policy acct name all-tcp target tcp
policy acct name i_all-tcp target tcp
unit ... acct-policy all-tcp !i_all-tcp
Если вы ставите знак процента при указании политики acct-policy, это значит ,что при совпадении данной политики для пакета, дальнейший просмотр списка политик прекращается и подсчет заканчивается. (см. 6.4.)

       fw-policy [!][%]p_name - разделенный пробелами список политик фильтрации траффика для данного объекта
Если вы ставите знак процента при указании политики fw-policy, это значит что при совпадении данной политики для пакета дальнейший просмотр списка политик прекращается, и вердикт пропускать/не пропускать пакет будет сделан сразу же. (см. 6.4.)
       ds-list no,[no,no,…] - список источников данных, которые будут связаны с этим сетевым объектом

service: processor, runtime: no
storage N {all|raw|summary}
определение типа типа информации , которая будет сохранена в хранилище, с которым будет работать сервис processor. хранилищ может быть несколько одновременно
       N - номер сервиса storage, он может быть еще не запущен
       raw - будут сохраняться данные в сыром виде, т.е. только о потоках траффика
       summary - будут сохраняться данные о суммарных потоках данных за сремя с начала текущих часа, дня, недели, месяца и с момента создания данного объекта unit
       all - указывает на то, что в этом хранилище будут сохраняться данные всех типов. представляет собой сумму данных, сохраняемых в виде summary и raw


Сервис storage определяет базу данных или хранилище, где будет сохраняться информация о стастистике по траффику.
service: storage, runtime: no
type {hash|mysql|postgres}
определение типа базы данных
       hash - UNIX hash (файлы .db)
       mysql - MySQL (www.mysql.com)
       postgers - PostgreSQL (www.postgresql.com)
       работа с другими базами данных не оформлена в виде кода, но при желании может быть легко добавлена

service: storage, runtime: no
path
определяет каталог в системе, где будут создаваться и храниться файлы базы данных при использовании hash в качестве хранилища данных. при использовании MySQL/PostgreSQL не имеет смысла

service: storage, runtime: no
user username
       имя пользователя для подключению к MySQL/PostgreSQL. по умолчанию root

service: storage, runtime: no
password password
       пароль для подключения к MySQL/PostgreSQL, по умолчанию отсутствует

service: storage, runtime: no
host hostname
       имя хоста где установлен MySQL/PostgreSQL

Сервис data-source служит источником информации о траффике, который считается программой
service: data-source, runtime: no
type {ip-traffic|netflow|libpcap}
задает тип источника данных
       ip-traffic - данные берутся путем перехвата ip-пакетов из ядра через divert socket (FreeBSD) или netfilter (Linux 2.4.x)
       netflow - данные о прошедшем траффике приходят от маршрутизатора Cisco, отдающего поток информации в пакетах NetFlow
       libpcap - данные берутся путем перехвата пакетов с помощью библиотеки libpcap, которая копирует в программу проходящие через ядро системы определенные пакеты. так же работает, например, tcpdump. см. раздел 6.5.с

service: data-source, runtime: no
source {tee|divert|A.B.C.D XXX|ifname}
задает источник данных
       tee XXX - пакеты будут копироваться в программу и параллельно обрабатываться системой, номер divert-порта XXX, для Линукса не имеет смысла
       divert XXX - пакеты будут заворачиваться в программу и она может отдать или не отдать их системе обратно, номер divert-порта XXX, для Линукса не имеет смысла
       A.B.C.D. XXX - поток NetFlow будет идти с хоста с IP-адресом A.B.C.D на локальный UDP-порт XXX
       ifname - имя локального сетевого интерфейса, на котором будут захватываться проходящие пакеты

service: data-source, runtime: yes
rule ID rule_string
задает системное правило, по которому данные будут попадать в программу
       ID - номер правила
       rule_string - правило в виде текстовой строки, которое будет передано системе (Linux или FreeBSD) для установки перехватчика пакетов. См. раздел 6.1.

service: data-source, runtime: yes
no rule ID
отмена правила
       ID - номер правила

Сервис alerter занимается рассылкой информации о статистике и о работе системы по почте
service: alerter, runtime: yes
report [oid 06100] name rep1 type traffic period day detail simple
ненастраиваемый в настоящее время параметр отправки сообщений

service: alerter, runtime: yes
smtp-server smtp_server_name
       smtp_server_name - имя почтового сервера, через который отправится почта

Сервис html позволяет автоматически создавать статические HTML-страницы с отчетами о траффике и о работе программы
service: html, runtime: yes
language { ru | en }
выбор языка, на котором пишутся отчеты. пока действует только английский

service: html, runtime: yes
run time_interval
интервал времени, в формате задачи планировщика, в который будет выполняться генерация страниц. по умолчанию time_interval=hourly, т.е. страницы будут создаваться за 10 секунд до начала каждого часа, и содержать статистику о предыдущем часе.

service: html, runtime: yes
path /path/to/html/root
путь дло каталога, в котором будут создаваться файлы.

Сервис quotactl позволяет устанавливать и проверять квоты по потреблению траффика для указанных юнитов
service: quotactl, runtime: yes
quota QOUTA_NAME policy POLICY_NAME set SYS_POLICY_NAME {hour SH1 soft-in H1 in SH2 soft-out SH soft-sum H2 out H sum day ... D1 in D2 out В sum week ... W1 in W2 out W sum month ... M1 in M2 out M sum total ... T1 in T2 out T sum }
определение квоты с именем QOUTA_NAME
       policy POLICY_NAME - имя политики, которая будет применяться при подсчете траффика и данной квоты. эта политика должна присутствовать для того юнита, который проверяется данной квотой.
       set SYS_POLICY_NAME - имя системной политики, которая установится для указанного юнита при превышении квоты. кроме того, при этом будет сделана запись в лог-файле.
       hour SH1 soft-in H1 in SH2 soft-out H2 out SH soft-sum day ... D1 in D2 out S sum week ... W1 in W2 out month ... M1 in M2 out M sum total ... T1 in T2 out T sum - список обычных и софт-квот для указанных интервалов времени. возможно задавать значения по-отдельности, например "hour 10M in week 20G out". величины траффика можно задавать как в байтах, так и указывая множители килобайтов (К), мегабайтов (M) и гигабайтов (G).

service: quotactl, runtime: yes
bind quota QUOTA_NAME to {UNIT UNIT ...}
привязка квоты QUOTA_NAME к списку конкретных юнитов.
       UNIT - имя или OID юнита, который будет проверяться на совпадение указанной квоты.

service: quotactl, runtime: yes
alert soft-reach [<user> | USER_NAME]
при превышении софт-квоты отправляет пользователю USER_NAME письмо на его e-mail; если определана константа <user>б то и на адрес e-mail параметров юнита, если юнит имеет тип user.
alert hard-reach [<user> | USER_NAME]
при превышении квоты отправляет пользователю USER_NAME письмо на его e-mail; если определана константа <user>б то и на адрес e-mail параметров юнита, если юнит имеет тип user.
alert reset-back [<user> | USER_NAME]
при восстановлении доступа по квоте отправляет пользователю USER_NAME письмо на его e-mail; если определана константа <user>б то и на адрес e-mail параметров юнита, если юнит имеет тип user.
lookup-delay seconds
интервал времени между актами проверки квот, по умолчанию 53 секунды.

КОММЕНТАРИЙ
Сервис quotactl проверяет переполнение квот каждые lookup-delay секунды. При превышении квоты для заданного периода для юнита в системной политике выставляется значение, определенное в описании квоты (set SYS_POLICY_NAME). При окончании временного интервала системная политика сбрасывается. Например, указав "quota ...set sys-deny-quota hour in 1M" каждый час данный юнит сможет скачать мегабайт, после чего он блокируется (sys-deny-quota), но при смене часа эта системная политика сбрасывается на sys-allow. О системных политиках см. также раздел 6.8. Можно определить так называемые софт-квоты, когда при превышении такой квоты будет отправлено сообщение по почте, но отключения не произойдет. Например, можно написать: "quota ... day 30M soft-in 40M in month 1G soft-in 1.2G in". Квоты должны работать для всех типов юнитов, но чтобы иметь возможность отправлять пользователю письмо и не создавать для каждого хоста соответствующего пользователя, рекомендуется использовать тип unit user. Фактически, это тот же тип unit host, но с дополнительными параметрами email и real_name. Чтобы настроить отсылку уведомлений о наступлании софт-квоты и отменене квоты обратно для данного пользователя, и при переполнении квоты пользоватею и администратору, напишите:
alert soft-reach 
alert hard-reach  admin
alert reset-back 
См. также пример конфигурационного файла: netams-quotactl.cfg

service: quotactl, runtime: yes
show quota [name XXX [oid YYY]]
текущее состояние проверки квот. см. 5.4.14.

Сервис weblogin позволяет осуществлять открытие доступа к заданному юниту и установление тайм-аута на его работу. Для реализации этого механизма используется скрипт веб-интерфейса, который и запускает соответствующие команды на открытие. Тайм-аут бывает двух типов: абсолютный, когда независимо от активности данного юнита после его открытия время работы четко фиксировано, или тайм-аут неактивности, когда блокировка юнита происходит после того, как в течение заданного времени траффик от/к этому юниту был нулевым.
service: weblogin, runtime: yes
user USER_NAME { time TIME_STRING | inact TIME_STRING } [set SYS_POLICY_NAME] [multi] open UNIT_NAME [UNIT_NAME] ... - определение пользователя, таймаутов и списка юнитов
       user USER_NAME - имя пользователя, логин и пароль которого будет проверяться при авторизации на открытие юнита. такой пользователь должен уже быть определен в программе глоюальной командой user.
       time TIME_STRING
       inact TIME_STRING - определение временного интервала, после которого будет произведена блокировка юнита. формат строки TIME_STRING такой же, как при описании задачи планировщика schedule, например 5min или 2hour. ключевое слово time задает абсолютный таймаут, слово inact - таймаут неактивности.
       set SYS_POLICY_NAME - имя системной политики, которая установится для указанного юнита при наступлании таймаута. по умолчанию имя - sys-deny-auth. кроме того, при этом будет сделана запись в лог-файле.
       multi - ключевое слово, которое показывает что данный пользователь имеет право открыть не один, а сразу несколько юнитов
       open UNIT_NAME - задает список юнитов, которые может открыть указанный пользователь, и к которым применятся определенные здесь же величины таймаутов.

service: main, weblogin, runtime: yes
auth user USER_NAME password PASSWORD [from A.B.C.D [open UNIT_NAME]] - процесс аутентификации клиента и открытия соответствующего юнита.
       user USER_NAME - имя пользователя
       password PASSWORD - его пароль
       from A.B.C.D - IP-адрес, с которого работает пользователь. подставляется сюда скриптом веб-интерфейса.
       open UNIT_NAME - имя юнита, который надо открыть

service: weblogin, runtime: yes
show timeout - текущее значение активных счетчиков timeout. см. 5.4.15.

Более подробно о применении веб-логинов см. 6.10.

Сервис monitor позволяет осуществлять запись данных из заголовков пакетов, относящихся к указанным units.

service: monitor, runtime: yes
monitor to {storage N | file XXXX}
       задает направление вывода информации и мониторинге. мониторинг позволяет собирать в текстовом файле или базе данных информацию о каждом IP-пакете или NetFlow-записи, обработанной NeTAMS. эту детальную информацию можно затем обработать для составления специфических отчетов.
       storage N - идентификатор хранилища, куда пойдет запись. должен иметь тип SQL
       file XXXX - имя (путь) до текстового файла с выводом мониторинга, относительно каталога лог-файла.

service: monitor, runtime: yes
monitor unit {N | XXXX}
       определяет юнит, который необходимо мониторить.
       N - идентификатор (OID) юнита
       XXXX - имя юнита

no monitor unit {N | XXXX} отменяет мониторинг указанного юнита
no monitor to отменяет мониторинг совсем
show monitor отображает текущее состояние мониторинга
см. также замечания в разделе 6.6. относительно применения мониторинга

Набор команд show служит для извлечения информации о работе программы, списке политик, юнита и наконец - собственно о статистике про траффику.
service: none, runtime: yes
show config
      выдает текущий конфигурационный файл

show connections
      выдает список текущих соединений с программой. пример:
      NAME |     ID |     IDLE |  CONNECTED |               ADDR |     PERMIT
<internal> | 000001 |    6m33s |     17m24s |            0.0.0.0 |        all
  conn0009 | 000009 |       0s |         1s |          127.0.0.1 |        all
show users
      выдает список зарегистрированных пользователей. пример:
   OID | MODE |       NAME |            REAL NAME |     PERMIT
01327B |    U |      anton |                Anton |        all
show schedule
      выдает список активных в системе задач. пример:
   OID | INTERVAL   |    LEFT | ACTION
08FFFF | hourly-    |    2564 | html
0841B7 | at-23:15   |    7074 | shutdown
0879E2 | 5min       |     294 | show version
show units
      выдает список всех юнитов. пример:
    TYPE |    OID |       NAME | NLP |     PARENT | PARAMS
    host | 0246E8 |        srv |     |         <> | IP: 195.208.209.5
    host | 022EB1 |         an |     |         <> | IP: 195.208.209.20
show processor
      выдает информацию о состоянии очередей внутри сервиса processor

show alerter
      выдает информацию об очереди сообщений к отправке

show monitor
      выдает информацию о работе сервисов monitor

show version
      информация о выполняемом процессе NeTAMS, его версия и другие системные параметры

show list
      список всех юнитов с указанием политик учета и фильтрации. пример:
OID: 0246E8 Name: srv        Type: host     Parent: <>
   FW policy list is empty
 ACCT policy: OID    NAME       CHECK        MATCH
              14643C all-ip     0            0
              14643D all-icmp   0            0
              146EFF russian    0            0
              146EFE local      0            0

OID: 022EB1 Name: an         Type: host     Parent: <>
   FW policy list is empty
 ACCT policy: OID    NAME       CHECK        MATCH
              14643C all-ip     36470        36470
              146EFF russian    36470        2520
              146EFE local      36470        0

show list name XXXX
      то же, но только для юнита с именем XXXX

show list oid YYYY
      то же, но только для юнита с индексом (oid) YYYY

show list full, show list full name XXXX, show list full oid YYYY
       выводится также значения счетчиков байт за разные периоды времени. пример:
OID: 022EB1 Name: an         Type: host     Parent: <>
   FW policy list is empty
 ACCT policy: OID    NAME       CHECK        MATCH
              14643C all-ip     37210        37210
 06.07.2002 21:18:51 flow       in: 162508       out: 3000
 22.06.2002 20:36:02 total      in: 2657037559   out: 3144255466
 01.07.2002 00:00:00 month      in: 2240298884   out: 2957011285
 01.07.2002 00:00:00 week       in: 2240298884   out: 2957011285
 06.07.2002 00:00:00 day        in: 179454142    out: 409746536
 06.07.2002 21:00:00 hour       in: 18925512     out: 339954
              146EFF russian    37210        2525
 06.07.2002 21:18:52 flow       in: 148          out: 40
 22.06.2002 20:36:02 total      in: 1477181768   out: 859691316
 01.07.2002 00:00:00 month      in: 1476102560   out: 849142477
 01.07.2002 00:00:00 week       in: 1476102560   out: 849142477
 06.07.2002 00:00:00 day        in: 13078568     out: 341296234
 06.07.2002 21:00:00 hour       in: 3904         out: 1766
              146EFE local      37210        0
 --.--.---- --:--:-- flow       in: 0            out: 0
 06.07.2002 20:48:59 total      in: 0            out: 0
 01.07.2002 00:00:00 month      in: 0            out: 0
 01.07.2002 00:00:00 week       in: 0            out: 0
 06.07.2002 00:00:00 day        in: 0            out: 0
 06.07.2002 21:00:00 hour       in: 0            out: 0
show policy
      выводит списов зарегистрированных политик учета и фильтрации траффика пример:
TYPE |    OID |            NAME | PARAMS
acct | 14643C |          all-ip | target: ip
acct | 14643D |        all-icmp | target: icmp
acct | 14753D |             tcp | target: tcp
acct | 14754D |             ant | target: units oid 022EB1
acct | 146EFF |         russian | target: file /usr/home/anton/netams/ru-networks.txt
acct | 146EFE |           local | target: file /usr/home/anton/netams/prefix.txt
acct | 146634 |            gate | target: units oid 0246E8
show quota
      выводит текущее состояние системы проверки квот. пример:
QUOTA: QQQ      policy all-ip   set sys-deny-quota
 UNIT 056255    (AA)    SYST:   ACCT is NOT present
 UNIT 0246E8    (avm)   SYST:   ACCT is present
  HOUR   in: 0, quota 300, ratio 0.00% -> [+]
  HOUR  out: 0, quota 800, ratio 0.00% -> [+]
  TOTAL out: 22932, quota 2.00G, ratio 0.00% -> [+]

QUOTA: AAA      policy tcp      set sys-local-quota
 UNIT 0246E8    (avm)   SYST:   ACCT is NOT present
для каждой квоты проверяется список всех юнитов, на которые указанная квота распространяется. для тех юнитов, у которых установлена соответствующая квоте политика учета (acct-policy), проверяются текущие значения счетчиков и сравниваются с установленными для квоты. в приведенном выше примере ничего квоту не нарушает.
QUOTA: QQQ      policy all-ip   set sys-deny-quota
 UNIT 056255    (AA)    SYST:   ACCT is NOT present
 UNIT 0246E8    (avm)   SYST: sys-deny-quota    ACCT is present
  HOUR   in: 420, quota 300, ratio 140.00% -> [-]
  HOUR  out: 420, quota 800, ratio 52.50% -> [+]
  TOTAL out: 23352, quota 2.00G, ratio 0.00% -> [+]

QUOTA: AAA      policy tcp      set sys-local-quota
 UNIT 0246E8    (avm)   SYST: sys-deny-quota    ACCT is NOT present
в данном состоянии система проверки квот обнаружила превышение и выставила для юнита avm системную политику sys-deny-quota. юнит заблокирован по превышению лимита на входящий за час траффик, о чем свидатальствует знак [-]

show timeout
      выводит текущие значения счетчиков timeout для юнитов, для которых в данный момент работает сервис weblogin. пример:
avm1 (0246E8) opened 14 sec. ago, last used -1 sec. ago
   absolute timeout at 106 sec, inactivity at -1 sec.
anb1 (022EB1) opened 6 sec. ago, last used -1 sec. ago
   absolute timeout at 114 sec, inactivity at -1 sec.

show stat unit UNIT_NAME PREFIX to now POINTS
      выводит таблицу значений счетчиков для заданного юнита за заданный промежуток времени
unit UNIT_NAME - имя юнита или его OID
PREFIX - указатель интервала времени, может быть W или M
to now - просто слова, пока не используются
POINTS - сколько строк будет в создаваемой таблице (влияет на точность), пока не испольуется. В данный момент информация берется из записей "H" таблицы summary БД, поэтому для недельной статистики получается 7*24=168 строк, для месячной 30*24=720 строк.
Формат вывода:
parse: unit avm1 [W] to->now <2>
avm1 0246E8 0 1028781390 2
all-ip all-icmp tcp 
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
...
Выводится строка с именем инита, строка со списком политик (через пробел) и блок из 168 или 720 строк, в каждой из которых 2*число_политик цифр, первая и вторая соответственно значения счетчиков in и out для каждой из политик последовательно, для каждого часа.


Набор команд rotate служит для осуществления ротации лог файлов и логов сервиса monitor.
service: none, runtime: yes
rotate log
      перемещает лог-файл в файл с расширением, указывающим на время ротации: "%Y-%m-%d_%H:%M" и открывает новый. rotate monitor N
      для сервиса monitor:N, в случае если используется monitor to file, перемещает файл мониторинга в новый с расширением, указывающем на время ротации: "%Y-%m-%d_%H:%M" и открывает новый.

6. Типичные конфигурации и тонкая настройка

  1. Несколько слов о задании правил заворачивания траффика для data-source
    В случае использование FreeBSD правила должны выглядеть следующим образом:

    Случай использования "честных" адресов
    rule number "ip from any to any via ifname"
    где number - относительно любой номер правила в таблице ipfw, например 100
    ifname - название внешнего интерфейса, через который траффик идет к провайдеру

    Случай использования "левых" адресов и их трансляции
    rule number1 "ip from any to any via ifname"
    rule number2 "ip from any to any via ifname"
    где number1 и number2 - номера правил в таблице ipfw, так чтобы ваше правило по трансляции адресов (заворот пакетов в divert socket NATD) имело номер МЕЖДУ НИМИ.
    ifname - название внешнего интерфейса, через который траффик идет к провайдеру
    Это сделано для того, чтобы учитывать траффик на неоттранслированные адреса.

    В случае Linux, независимо от наличия трансляции адресов (маскарадинга), правила имеют вид:
    rule number1 "INPUT -p all -j QUEUE"
    rule number2 "FORWARD -p all -j QUEUE"
    rule number3 "OUTPUT -p all -j QUEUE"
    причем номера number1, 2 и 3 совершенно произвольные так как никак не используются.

    Этими действиями выполняется следующее: вы задаете правила для ipfw/iptables, по которым пакеты ядром направляются пихаются в некую виртуальную трубу (которая называется queue), откуда их потом берет программа, прокачивает через себя (смотря на заголовки и делая подсчет) и отдает обратно в систему, после чего они спокойно идут себе дальше.

    ВАЖНО!!!
    Если вы остановили программу так что она не смогла после себя убрать эти поставленные правила (через kill -9) или она сама неожиданно померла, то все пакеты по прежнему система будет заворачивать туда откуда их никто не заберет, и они пропадут. С точки зрения системы это будет выглядеть как полная потеря работы с сетью. НИКОГДА не экспериментируйте с этим сидя за удаленной машиной. Тренируйтесь непосредственно за консолью, или в крайнем случае на icmp-траффике. Исключение - FreeBSD с source tee или любая система с NetFlow.

  2. Разделение российского и зарубежного траффика на базе файла префиксов
    Для начала необходимо пояснить суть проблемы и рассказать, зачем такой учет вообще необходим.
    Зачастую бывает, что ваш провайдер выставляет вам счет за пользование интернетом, состоящий из двух цифр: стоимость российского траффика и стоимость зарубежного, т.е. результат обмена информацией с зарубежными серверами. Дело в том, что сам провайдер каким-либо образом покупает траффик у более крупных, магистральных провайдеров которые не связываются с мелкими клиентами. При этом, обмен данными с российскими серверами ведется по одним каналам связи, а для общения с зарубежными серверами используются немногочисленный зарубежные каналы. Надо сказать, что суммарная полоса пропускания данных всех российских провайдеров "за рубеж" составляет всего несколько сот мегабит на всю страну, и таких каналов не так и много (десяток, наверное). Естественно, аренда этих каналов стоит существенно дороже по сравнению с внутрироссийскими и внутримосковскими каналами. Представьте на секунду, сколько стоит проложить трансатлантический подводный оптоволоконный кабель на несколько тысяч километров? Это вам не витую пару через этаж кинуть! :) Вот почему зарубежный траффик стоит дороже российского. Вообще, процентов 80 российского траффика прокачивается через АТС номер 9, что на ул.Губкина, в Москве.
    Теперь надо определить, как отличить "российский" и "зарубежный" траффик, и как это делает ваш провайдер. Все основано на глобальной маршрутизации в Интернете, которая осуществляется по протоколу BGP. Грубо говоря, все сети, подключенные к интернету, принадлежат некоей Автономной Системе (AS), которая представляет собой набор IP-сетей (адресных пространств), находящихся под единым управлением. Владелец и руководитель автономной системы определяет политику маршрутизации своих подсетей через своих соседей-провайдеров или крупных организаций, имеющих свои автономные системы. Все такие системы соединены логическими связями друг с другом так, что любая машина в интернете может быть связана с любой другой машиной посредством нескольких (3-7) автономных систем, каждая из которых образована несколькими маршрутизируемыми сетями. Более того, протокол позволяет выбирать оптимальный путь пользуясь большим количеством передаваемой между автономными системами вспомогательной информации, и т.д. Возвращаясь к нашему случаю, ваш провайдер определил маршрутизацию российского траффика (т.е. сетей, принадлежащих российским AS, их список известен) через один канал, а всего остального - через другой, и за другие деньги. Соответственно, и со своих клиентов взимается разная плата.
    Теперь, если вы хотите у себя учитывать разделение траффика так, как это делает у себя ваш провайдер, вам по-хорошему надо бы поднять у себя маршрутизатор (Cisco, FreeBSD/Zebra,...), поднять на нем сессию iBGP с провайдером, получать от него таблицу роутинга (она часто меняется) и импортировать ее в вашу программу учета траффика. Это реально, но тяжело, в NeTAMS такая функциональность будет встроена только в случае существенного спонсирования проекта. Вместе с тем, существует возможность пользоваться менее точной, но более короткой базой ru-networks.txt, построенной на основании таблицы выделенных организациям блоков IP-адресов, которую у себя поддерживает RIPE. В настоящий момент она содержит в себе список около 400 сетей, которые можно назвать "Российскими". Никто не гарантирует, что ваш провайдер будет получать траффик от некоторых таких сетей не через зарубежные каналы, однако я надеюсь, что точность такого разделения будет вполне приемлемой. Если вы сможете предоставить мне ваши статистические данные - я буду рад.


    Некоторые разъяснения о том, что же на самом деле считается
    Unit
    MATCH_NONE
    Unit
    MATCH_SRC
    Unit
    MATCH_DST
    Unit
    MATCH_BOTH
    Prefix
    MATCH_NONE
    ----
    Prefix
    MATCH_SRC
    --++
    Prefix
    MATCH_DST
    -+-+
    Prefix
    MATCH_BOTH
    -+++
    + означает выполнение действия.
    Например:
    для fw-policy + означает блокировку пакета, а для acct-policy - подсчет данного пакета.
    Чтобы подсчитать RU траффик необходимо прописать:
    policy acct oid 146EFF name russian target file /usr/home/anton/netams/ru-networks.txt
    unit host oid 022EB1 name myhost ip 192.168.1.10 acct-policy russian

    ВНИМАНИЕ!!! C версии 1516 изменилась логика работы с политикой префиксов.

  3. Зачем нужно no-local-pass
    Этот параметр при конфигурировании юнита был сделан для того, чтобы предотвратить ненужную маркировку пакета как "локального", если по замыслу он таковым не является. Рассмотрим случай, когда у вас есть некая локальная сеть с непрерывным диапазоном адресов, но вы хотите разрешить пользоваться сервером только тем компьютерам сети, которые определены в конфигурационном файле. При этом хочется считать траффик для всей подсети вцелом. Вот типичная конфигурация:

    service processor
    policy fw name all-ip target ip
    restrict all drop local pass
    unit net name LAN ip 192.168.1.0 mask 255.255.255.0 acct-policy all-ip
    unit host name USER1 ip 192.168.1.10
    unit host name USER2 ip 192.168.1.12
    unit host name USER3 ip 192.168.1.13

    В таком случае, машина из локальной сети с адресом 192.168.1.20 сможет пройти наружу, так как она попадает в сеть LAN (unit net name LAN) и пакеты маркируются локальными (restrict local pass). Вы можете избежать этого, создав группу и пометив все указанные компьютеры из этой подсети как принадлежащие группе, однако есть более красивое решение:

    unit net name LAN ip 192.168.1.0 mask 255.255.255.0 no-local-pass acct-policy all-ip

  4. Зачем нужен break flag [%] при описании fw-policy:
    Если вы задаете последовательность из нескольких политик фильтрации траффика подряд, то по умолчанию их действие суммируется, т.е. в случае

    service processor
    policy fw name all-ip target ip
    policy fw name tcp target tcp
    unit host name HOST1 ip 192.168.1.5 fw-policy !tcp all-ip


    вы все равно не сможете открыть для этой машины ТОЛЬКО TCP-траффик, на следующем совпавшем правиле all-ip пакет зарежется. Для того чтобы после совпадения политики дальнейший поиск прекратился, поставьте

    unit host name HOST1 ip 192.168.1.5 fw-policy !%tcp all-ip

    Зачем нужен break flag [%] при описании acct-policy:
    Если вы задаете последовательность из нескольких политик подсчета траффика подряд, то по умолчанию подсчет ведется для каждой политики, т.е. в случае

    service processor
    policy fw name ip target ip
    policy fw name tcp target tcp
    policy fw name tcp target udp
    unit host name HOST1 ip 192.168.1.5 acct-policy tcp udp ip


    вы все равно не сможете явно посчитать для этой машины весь не udp и не tcp траффик, так как пакет все равно посчитается по политике ip. Чтобы при совпадении политики дальнейший подсчет прекратился, поставьте

    unit host name HOST1 ip 192.168.1.5 acct-policy %tcp %udp ip

  5. Примеры использования и настройки в различных окружениях
    А) Анализ и учет проходящего через UNIX-роутер траффика

    Наверное, это наиболее часто использующийся способ. Он основан на том, что проходящие через ваш UNIX-маршрутизатор пакеты проходят по цепочке правил ipfw/iptables, в которой можно поставить специальное правило, перенаправляющее пакеты внутрь программы. Если NeTAMS их выпускает обратно, то процесс обработки пакетов ядром продолжается. На базе этого и можно фильтровать траффик по заданным критериям. Настройка проста: вы должны подготовить систему к работе с "заворачиванием" пакетов (см. выше), и настроить соответствующий сервис data-source:

    service data-source 1
    type ip-traffic
    source divert 199
    rule 100 "ip from any to any via fxp0"

    После этого ваш вывод ipfw list (FreeBSD) будет содержать строку
    100 divert 199 ip from any to any via fxp0

    Помните, что при некорректном завершении программы (через kill -9 или из-за внутренней ошибки) правило остается висеть в системе, что блокирует доступ к машине по сети.

    В) Анализ и учет потока NetFlow от маршрутизатора Cisco Systems

    Маршрутизаторы производства Cisco Systems, в современных версиях операционной системы IOS, поддерживают новый метод управления маршрутизацией пакетов, называемый NetFlow. Помимо всего прочего, это дает возможность собирать информацию о статистике и передавать ее внешнему устройству для обсчета. Более подробная информация о NetFlow содержится тут. Маршрутизатор посылает UDP-пакеты со статистикой на некий IP-адрес/порт, где NeTAMS может собрать информацию и обработать ее. Фильтрация траффика в таком случае невозможна, так как пересылку данных осуществляет внешнее устройство. О конкретной настройке netflow export можно почитать тут. Приведем пример команд маршрутизатора:

    ip flow-cache timeout inactive 60
    ip flow-cache timeout active 10
    !
    interface FastEthernet0/0
    ip address 192.168.1.1 255.255.255.0
    ip route-cache flow
    !
    ip flow-export version 5
    ip flow-export destination 192.168.1.254 20001


    Обработчик data-source настраивается следующим образом:

    service data-source 1
    type netflow
    source 192.168.1.1 20001

    Предполагается, что UDP-пакеты NetFlow идут с маршрутизатора, имеющего IP-адрес 192.168.1.1, и поступают на локальный UDP-порт номер 20001 (его и слушает NeTAMS)

    ВАЖНО!
    По определению, NetFlow учитывает только входящий на роутер траффик. Это вызывает проблемы учета при использовании трансляции адресов. Действительно, пакеты от машин внутренней сети приходят на роутер и учитываются верно, но обратные ответы извне поступают с адресом dst внешнего интерфейса. Поскольку трансляция адресов происходит после учета, то статистика всего входящего траффика будет содержать сумму всего траффика, пришедшего на адрес внешнего интерфейса, и нули для адресов внутренней локальной сети. Для корректного учета, вам необходимо использовать policy routing. Установленная на роутере операционная система должна поддерживать эту функцию. Вот пример конфигурации для Cisco 2514:

    interface Loopback0
    ip address 192.168.10.1 255.255.255.0
    ip route-cache policy
    ip route-cache flow
    !
    interface Ethernet0
    ip address 195.200.200.1 255.255.255.0
    ip nat outside
    ip route-cache policy
    ip route-cache flow
    ip policy route-map MAP
    !
    interface Ethernet1
    ip address 192.168.1.1 255.255.255.0
    ip nat inside
    ip route-cache policy
    ip route-cache flow
    !
    ip nat inside source list 1 interface Ethernet0 overload
    ip classless
    ip flow-export version 5
    ip flow-export destination 192.168.1.254 20001
    !
    access-list 1 permit 192.168.1.0 0.0.0.255
    access-list 101 permit ip any 192.168.1.0 0.0.0.255
    route-map MAP permit 10
    match ip address 101
    set interface Loopback0

    ВАЖНО!
    На практике возник один тяжелый случай, который хотелось бы разобрать.
    Дана конфигурация, в которой два маршрутизатора Cisco, находящиеся по разные стороны Serial канала, должны присылать свою статистику NetFlow на юникс-сервер с работающей программой NeTAMS, который находится в ethernet-сегменте одного из маршратизаторов. Первоначально конфигурационные файлы были таковыми:
    NETAMS: netams.cfg (фрагмент)CISCO: running-config (фрагмент)
    service data-source 1
    type netflow
    source 212.xxx.xxx.1 20001
    
    service data-source 2
    type netflow
    source 212.xxx.xxx.2 20001
    
    interface Loopback0
     ip address 212.xxx.xxx.1 255.255.255.252
    ip flow-export source Loopback0
    ip flow-export version 5
    ip flow-export destination 212.xxx.xxx.59 20001
    interface Loopback0
     ip address 212.xxx.xxx.2 255.255.255.252
    ip flow-export source Loopback0
    ip flow-export version 5
    ip flow-export destination 212.xxx.xxx.59 20001
    Это приводило к появлению в лог-файле множественных сообщений вида:
    13.06.2002 15:12:05.1944 data-source-4: NF awaited seq 7791483 mismatch received 52066956 (44275473 flows are lost)
    13.06.2002 15:12:05.6004 data-source-4: NF awaited seq 52067106 mismatch received 7791483 (-44275623 flows are lost)
    13.06.2002 15:12:06.1998 data-source-4: NF awaited seq 7791543 mismatch received 52067136 (44275593 flows are lost)
    13.06.2002 15:12:06.2013 data-source-4: NF awaited seq 52067166 mismatch received 52067106 (-60 flows are lost)
    13.06.2002 15:12:06.2073 data-source-4: NF awaited seq 52067136 mismatch received 52067166 (30 flows are lost)
    13.06.2002 15:12:06.2085 data-source-4: NF awaited seq 52067196 mismatch received 52067226 (30 flows are lost)
    13.06.2002 15:12:06.2144 data-source-4: NF awaited seq 52067256 mismatch received 52067196 (-60 flows are lost)
    13.06.2002 15:12:06.6014 data-source-4: NF awaited seq 52067226 mismatch received 7791543 (-44275683 flows are lost)
    Причина явления в том, что каждый из маршрутизаторов шлет в пакетах netflow порядковый номер записи. Поскольку сервис data-source один, то он не может распознать от какого из маршрутизаторов пришли данные, и ругается. Необходимо было добавить еще один сервис и изменить конфигурационные файлы:
    NETAMS: netams.cfg (фрагмент)CISCO: running-config (фрагмент)
    service data-source 1
    type netflow
    source 212.xxx.xxx.1 20001
    
    service data-source 2
    type netflow
    source 212.xxx.xxx.2 20002
    
    interface Loopback0
     ip address 212.xxx.xxx.1 255.255.255.252
    ip flow-export source Loopback0
    ip flow-export version 5
    ip flow-export destination 212.xxx.xxx.59 20001
    interface Loopback0
     ip address 212.xxx.xxx.2 255.255.255.252
    ip flow-export source Loopback0
    ip flow-export version 5
    ip flow-export destination 212.xxx.xxx.59 20002
    Фактически, каждый роутер присылает поток netflow своему собственному сервису, каждый из которых слушает на своем UDP-порту. Однако проблему это не решило:
    18.06.2002 14:00:57.6291 data-source-4: NF:2 awaited seq 86683836 mismatch received 86683776 (-60 flows are lost)
    18.06.2002 14:00:57.6319 data-source-4: NF:2 awaited seq 86683806 mismatch received 86683866 (60 flows are lost)
    18.06.2002 14:00:57.6352 data-source-4: NF:2 awaited seq 86683896 mismatch received 86683836 (-60 flows are lost)
    18.06.2002 14:00:58.5939 data-source-4: NF:2 awaited seq 86683866 mismatch received 14644284 (-72039582 flows are lost)
    18.06.2002 14:00:58.6269 data-source-4: NF:2 awaited seq 14644314 mismatch received 86683896 (72039582 flows are lost)
    18.06.2002 14:00:59.5948 data-source-4: NF:2 awaited seq 86684016 mismatch received 14644314 (-72039702 flows are lost)

    Видно, что ошибку создает поток, приходящий на сервис data-source:2 с удаленной части сети. При этом четко выражены две особенности: небольшой сбой в последовательности, и большой сбой.
    Первый факт, как оказалось, связан с тем что последовательность UDP-пакетов, приходящих в программу, меняется из-за низкой скорости канала и работы средств обработки очередей пакетов на выходе из удаленного маршрутизатора. На этот факт можно не обращать внимания.
    Более детальный анализ приходящих пакетов выявил следующую особенность:
    21.06.2002 13:22:32.2210 data-source-4: NF:2 awaited seq 108867336, received 108867366 from 00 (30 flows are lost)
    21.06.2002 13:22:32.2253 data-source-4: NF:2 awaited seq 108867396, received 108867336 from 00 (-60 flows are lost)
    21.06.2002 13:22:32.2268 data-source-4: NF:2 awaited seq 108867366, received 108867396 from 00 (30 flows are lost)
    21.06.2002 13:22:32.8192 data-source-4: NF:2 awaited seq 108867426, received 19232583 from 02 (-89634843 flows are lost)
    21.06.2002 13:22:33.2718 data-source-4: NF:2 awaited seq 19232613, received 108867426 from 00 (89634813 flows are lost)
    21.06.2002 13:22:33.8377 data-source-4: NF:2 awaited seq 108867576, received 19232643 from 02 (-89634933 flows are lost)
    21.06.2002 13:22:33.8394 data-source-4: NF:2 awaited seq 19232673, received 19232613 from 02 (-60 flows are lost)
    21.06.2002 13:22:34.2750 data-source-4: NF:2 awaited seq 19232643, received 108867576 from 00 (89634933 flows are lost)
    21.06.2002 13:22:35.2897 data-source-4: NF:2 awaited seq 108867816, received 108867846 from 00 (30 flows are lost)

    Указанные номера (from 00 и 02)- это не что иное как engine_id, т.е. номер выполняющей процесс экспорта NetFlow железки в пределах одного роутера. Разбирательство показало, что на удаленной стороне установлен маршрутизатор Cisco 7505, который наряду с Cisco 12000 характеризуется т.н. распределенной архитектурой. Процесс свитчинга (пересылки) пакетов в нем выполняют интерфейсные процессоры независимо друг от друга (dCEF), и отсылают потоки о траффике через NetFlow тоже независимо. Естественно, номера последовательностей будут разными.
    После выяснения данных обстоятельств было решено, что в конечном итоге, несмотря на неправильную последовательность прихода данных, суммарная информация о статистике собирается верно, и следует просто отключить вывод предупреждающей информации комментированием соответствующей строки в файле ds_netflow.c и пересборкой программы.

    С) Анализ и учет проходящего мимо/через интерфейс траффика

    NeTAMS может использоваться как программа, собирающая проходящий "мимо" траффик, пользуясь библиотекой libpcap. Через эту библиотеку работают многие программы, например tcpdump. Она позволяет "перехватывать" в пользовательскую программу проходящие через сетевой интерфейс пакеты, при этом передается также link level заголовок, т.е. все содержимое ethernet-кадра. Как вы понимаете, фильтрация траффика в этом случае исключается, так как не NeTAMS принимает решение о пропуске или блокировке IP-пакета, а другое устройство. Такое решение может быть полезным, если маршрутизацию осуществляет другое устройство, не поддерживающее само по себе выдачу статистики, например программный маршрутизатор на основе Windows. Вы должны каким-либо образом перенаправить весь поток данных, проходящих по сети, на сетевой интерфейс, на котором работает service data-source типа libpcap. Для этого вы можете использовать хаб (концентратор), который копирует все пакеты между портами без разбора. Правда, в этом случае производительности сети будет сильно ограничена суммарной производительностью хаба (10 мегабит), в такой сети будет плохо с распределением нагрузки и безопасностью. Гораздо более приемлемым решением может стать применение на опорном узле сети коммутатора (свитча) производства Cisco, с использованием технологии мониторинга портов и виртуальных сетей (SPAN). Фактически, это позволяет копировать весь траффик между портами или внутри одного VLAN'а в некий ethernet-порт, к которому подключена сетевая плата сервера NeTAMS. Учтите, что этот порт работает только на запись, т.е. вы не сможете управлять сервером через него.

    Для начала, рекомендую прочитать обзор технологии Cisco Catalyst Switched Port Analyzer (SPAN). Для ее настройки применительно к конкретным коммутаторам, обращайтесь: серия Catalyst 2900xl и 3500xl, серия Catalyst 2950 и 3550, серия Catalyst 6000. Для настройки NeTAMS необходимо определить сервис data-source (в этом примере захват пакетов действует аналогично команде tcpdump -i fxp1 net 192.168):

    service data-source 1
    type libpcap
    source fxp1 # interface name
    rule 1 "net 192.168"

    ВАЖНО!
    При использовании данного метода захвата траффика (data-source libpcap) вы можете встретиться с двумя побочными явлениями:
    1. Из-за встроенной в libpcap буферизации пакеты могут приходить в программу не сразу, а через некоторое время, по мере наполнения буфера. Иногда задержка может составлять несколько секунд, а количество пакетов в буфере - несколько сотен. Причина такого плохого поведения мне не известна.
    2. В данный момент поддерживается только первое правило в списке rule для этого data-source; это ограничение библиотеки.

  6. Применение мониторинга траффика
    Начиная с версии 1120.5 NeTAMS поддерживает мониторинг заданных юнитов для сбора информации по относящемуся к ним траффику. и начиная с версии 1490 мониторинг реализован как сервис.
    Для включения этой функции необходимо задать сервис monitor и направление вывода статистики. Она может сохраняться как в текстовом файле, так и в базе данных, определенной одним из сервисов storage. Для включения мониторинга необходимо задать команду
    service monitor NN
    monitor to file /path/to/output/file
    или
    monitor to storage N, где N - номер соответствующего сервиса storage
    После этого задайте список юнитов, траффик которых вы хотите записывать. Можно указывать как имя юнита, так и его номер (OID), каждый юнит определяется отдельной командой на своей строке. Например:
    monitor unit server_1
    monitor unit net_real
    monitor unit 02ffad
    В результате мониторинга с выводом в текстовый файл создаются записи вида:
    29.04.2002 22:27:27.4898 user_1 041BEF 06 s:172.16.0.1:2174 d:172.16.13.1:23 60
    29.04.2002 22:27:30.4800 user_1 041BEF 06 s:172.16.0.1:2174 d:172.16.13.1:23 60
    30.04.2002 10:37:55.9553 user_1 041BEF 01 s:172.16.13.2 d:172.16.0.1 84
    30.04.2002 10:39:43.4137 user_1 041BEF 17 s:172.16.13.2:1031 d:212.69.119.4:53 59
    30.04.2002 10:39:43.4146 user_1 041BEF 17 s:212.69.119.4:53 d:172.16.13.2:1031 145
    30.04.2002 10:39:43.4424 user_1 041BEF 06 s:172.16.13.2:1032 d:213.180.194.129:80 48
    30.04.2002 10:39:43.4512 user_1 041BEF 06 s:213.180.194.129:80 d:172.16.13.2:1032 44
    
    Первое - второе поля: дата и время, после точки - доли секунды
    Третье - четвертое поля: имя юнита и его OID
    Пятое поле - номер протокола (01-icmp, 06 - tcp, 17 - udp)
    Шестое - седьмое поля: IP-адрес и номер порта src и dst полей пакета
    Восьмое поле: длина пакета в байтах

    Вы можете использовать NeTAMS как сборщик детальной информации о траффике или записей NetFlow, применив упрощенную для этого случая конфигурацию:
    # configuration file example 3 begin
    debug none
    user name admin real-name Admin email root@localhost password 123 permit all
    
    service server 0
    login any
    listen 20001
    max-conn 6
    
    service processor 0
    lookup-delay 20
    flow-lifetime 120
    policy acct name ip target ip
    unit net name u_all ip 0.0.0.0 mask 0.0.0.0 acct-policy ip
    
    service data-source 1
    type netflow
    source 192.168.0.254 20001
    
    service monitor 1
    monitor to file /var/netflow.log
    monitor unit u_all
    
    # configuration file example 3 end

    Вы также можете записывать данные о проходящем траффике в SQL-базу. Для этого вы должны указать направление вывода мониторига командой monitor to storage N. Если вы уже используете NeTAMS к моменту реализации этой функции (версия программы 3.1(1142), 31 мая 2002г.), то вам необходимо будет вручную создать таблицу monitor в вашем MySQL-сервере:
    unix_router# mysql netams
    mysql> CREATE TABLE monitor (
    		time TIMESTAMP NOT NULL KEY, 
    			# время прохождения пакета, в формате unix timestamp, секунды с начала 1970 года
    		msec INT UNSIGNED, 
    			# то же для миллисекунд, первые 4 значащие цифры
    		name VARCHAR(32), 
    			# имя юнита
    		oid INT UNSIGNED, 
    			# OID юнита
    		proto TINYINT UNSIGNED, 
    			# IP-протокол пакета, от 0 до 255 (1:icmp, 6:tcp, 14:udp), /etc/protocols
    		src INT UNSIGNED NOT NULL, 
    			# IP-адрес источника пакета, в формате long int. для перевода в человеческий формат 
    			# с точками используйте функцию MySQL INET_NTOA()
    		srcport SMALLINT UNSIGNED, 
    			# локальный порт источника пакета, /etc/services , для ICMP не имеет смысла
    		dst INT UNSIGNED NOT NULL, 
    			# IP-адрес получателя пакета
    		dstport SMALLINT UNSIGNED, 
    			# локальный порт получателя пакета, 
    		len SMALLINT UNSIGNED 
    			# длина пакета в байтах
    		);
    

  7. OID, автоматическая генерация и перезагрузки
    Ко мне поступил такой вопрос:
    Хотел узнать по поводу БД, в таблице хранится oid пользователя, будет ли он после reboot сервера другим? Если да, то как мне присвоить oid пользователям, в смысле номер случайный или есть какая-то система?
    А вот и ответ:
    При создании конфига вручную oid можно не указывать. При этом значение oid генерируется автоматически, так что если после старта набрать show config, значения oid там уже будут. Естественно, в базу пишутся записи именно с этими oid. Чтобы после рестарта программы oid остались теми же, необходимо после редактирования конфига или любых изменений в нем через интерфейс программы набирать save, тогда конфигурационный файл перезапишется на тот, что выполняется в данный момент, вместе со значениями oid, и после рестарта статистика продолжит собираться и суммироваться правильно.

  8. Системные политики
    Для обеспечения работы внутренних сервисов программы, таких как квоты, контроль MAC-адресов, веб-логина и т.д. начиная с версии 3.1(1182.281) был реализован механизм так называемых "системных политик". Их действие фактически эквивалентно установке fw-policy для указанного юнита, при этом если системная политика установлена, то происходит полное блокирование траффика невзирая на остальные установленные значения fw-policy (как будто применена политика all-ip и установлен break flag). Собственно само значение (название) системной политики роли не играет, оно лишь помогает администратору понять, по какой причине программа установила данную политику. Исключения составляют политики sys-allow и sys-allow-auth.

    Возможны системные политики вида sys-XXX и sys-XXX-YYY. При этом значение XXX определяет действие и может быть:
    • allow - данная политика пропускает траффик. при этом YYY или отсутствует, или принимает значение auth
    • deny - данная политика блокирует траффик
    • local - данная политика пропускает траффик, только если данный юнит общается с любым другим юнитом из конфигурационного файла
    • NNNNNN - данная политика пропускает траффик, только если данный юнит общается с юнитом, имеющим OID=NNNNNN (например это локальная группа, или юнит, соответствующий локальному вебсерверу)
    Значение YYY определяет причину и может быть:
    • (отсутствие) - причина блокировки не указана
    • money - кончились деньги на счету клиента
    • quota - превышена квота
    • macviol - юнит нарушил предписания систему контроля MAC-адресов
    • auth - юнит требует процесса внешней аутентификации (логина)

    Надо отметить, что в настоящий момент используются только sys-allow (что соответствует отсутствию системной политики вообще, по умолчанию) и sys-deny-quota

    Пример использования: контроль квот. Предположим, что юнит HOST1 имеет право скачивать не более 10 мегабайт в день, и не более 100 мегабайт за месяц. При превышении лимита хост может работать только с локальным сервером. Для этого вам надо установить сервис quotactl:
    ...
    service processor
    policy acct name all-ip target ip
    unit host name SRV oid 0246E8 ip 192.168.0.1 
    unit host name HOST1 oid 0246EF ip 192.168.0.100 acct-policy all-ip
    ...
    service quotactl 1
    quota QU1 policy all-ip set sys-0246E8-quota day 10M in month 100M in
    bind quota QU1 to HOST1
    ...
    

    Когда квота для этого хоста превысится, вывод команды show config покажет:
    unit host name HOST1 oid 0246EF sys-0246E8-quota ip 192.168.0.100 acct-policy all-ip
    При сохранении конфига, равно как и без сохранения, и перезапуске NeTAMS, даже если изначально системная политика для квот будет установлена неверно, при очередном просмотре своих таблиц сервисом quotactl правильное значение системной политики будет восстановлено.

  9. API для работы с NeTAMS через Perl-скрипты и CGI-вебинтерфейс
    NeTAMS представляет собой достаточно гибкий инструмент учета траффика и установки некоторых органичений на работу пользователей. Круг задач, которые можно решить с использованием данной программы, чрезвычайно широк, и у каждого администратора есть свои пожелания по организации работы программы и тому, как она взаимодействует с пользователями. Для облегчения задачи настройки и использования NeTAMS под ваши конкретные задачи был создан интерфейс в виде ряда функций, который позволяет управлять программой и получать от нее данные из ваших написанных самостоятельно Perl-скриптов и CGI-программ.
    Для применения интерфейса вы должны включить в начало вашей программы строку:
    require "netams_api.pl"

    Вот список функций, которые определены в этом интерфейсе:
    • $result=netams_login($hostname, $port, $username, $password); - осуществляет соединение с программой, используя указанные параметры. Если $result начинается со слов "Welcome", то соединение прошло успешно
    • netams_send($command); - отправляет команду $command на исполнение
    • $result=netams_read(); - считывает в переменную $result результат выполнения команды
    • $result=netams_readline(); - то же самое, но программа ожидает вывода признака конца строки (перевод строки, "\n"). использовать не рекомендуется
    • netams_logout(); - осуществляет разрыв соединения.
    Вот список идущих с прогаммой скриптов, которые можно применять на практике или рассматривать как примеры программирования общения с NeTAMS:
    netams_example.cgi - выводит результат выполнения команды show version в виде cgi-программы. после небольшой модификации превращается в утилиту командной строки.

    weblogin.cgi - интерфейс к сервису weblogin. рассмотрен в разделе 6.10

    netams_graph.cgi - программа, динамически создающая картинки в формате PNG с графическим отображением статистики для заданного юнита и всех его политик учета, за последние неделю или месяц. параметры вызова (метод GET):
           unit=UNIT_NAME - обязательный параметр, определяет имя юнита, для которго будет рисоваться картинка
           policy=POLICY_NAME - имя политики, которая будет отображаться. при отсутствии параметра policy будут отрисованы все активные политики.
           prefix=PREFIX - буква, определяющая временной период графика, W (неделя) или M (месяц) соответственно, по умолчанию =W
           nolegend=FLAG - при любом установленном значении запрещает отрисовку легенды с отображением цвета, которым будет отрисовываться данные о политике.
    Данный скрипт использует модули GD.pm и библиотеку libgd. Для FreeBSD вам надо выполнить что-то вроде cd /usr/ports/graphics/p5-GD ; make install. В текущем каталоге необходимо иметь файл lucon.ttf, это TrueType-шрифт Lucida Console из дистрибутива WindowsXP, который включен в дистрибутив NeTAMS: без него не будет надписей на картинке.

  10. Применение сервиса веб-логинов
    Это сервис был разработан для того, чтобы дать возможность клиентам в локальной сети открывать доступ к своим машинам извне/доступ за пределы сети на базе процедуры "логина" в некую систему через веб-интерфейс. Это сделано для предотвращения несанкционированного доступа, более точного учета работы пользователей в сети и разграничении полномочий. Надо отметить, что данная реализация является только пробной и наверняка не учитывает ваших конкретных потребностей. Если вам необходима какая-то другая (но близкая) функциональность от данного сервиса, обращайтесь к разработчику (т.е. ко мне :))

    Как настроить этот сервис? Пусть, для примера, в вашей подсети есть пять компьютеров и пять пользователей. Необходимо обеспечить доступ следующим образом:
    • Пользователи user1, user2, user3, user4 и user5 могут работать только с хостов host1, host2, host3, host4 и host5 соответственно
    • Пользователь user1 имеет право при помощи своего логина и пароля открывать доступ (сидя за любым активным хостом) для любого другого хоста
    • Для пользователя user1 установлен тайм-аут неактивной работы в 10 минут (если за 10 минут хост не проявил активности, он отключается)
    • Для остальных пользователей установлен таймаут в 4 часа (по истечении этого времени процедуру логина надо проходить заново)
    • При всех условиях пользователи всегда имеют доступ к серверу server, на которов установлен NeTAMS и веб-сервер
    Вот пример соответствующего конфигурационного файла (не относящиеся к рассматриваемому вопросу строки не показаны):
    user oid 01643C name web password WebLoginPWD permit sysaction
    user name user1 password USER1PWD permit weblogin
    user name user2 password USER2PWD permit weblogin
    user name user3 password USER3PWD permit weblogin
    user name user4 password USER4PWD permit weblogin
    user name user5 password USER5PWD permit weblogin
    
    service processor
    policy acct name all-ip target ip
    unit host name server oid 020000 ip 192.168.0.1 
    unit host name host1 oid 020001 ip 192.168.0.11 sys-020000-auth acct-policy all-ip
    unit host name host2 oid 020002 ip 192.168.0.12 sys-020000-auth acct-policy all-ip
    unit host name host3 oid 020003 ip 192.168.0.13 sys-020000-auth acct-policy all-ip
    unit host name host4 oid 020004 ip 192.168.0.14 sys-020000-auth acct-policy all-ip
    unit host name host5 oid 020005 ip 192.168.0.15 sys-020000-auth acct-policy all-ip
    
    service weblogin 1
    user user1 inact 10min set sys-020000-auth multi open host1 host2 host3 host4 host5  
    user user2 time 4hour set sys-020000-auth open host2
    user user3 time 4hour set sys-020000-auth open host3
    user user4 time 4hour set sys-020000-auth open host4
    user user5 time 4hour set sys-020000-auth open host5
    

    Далее, на сервере 192.168.0.1 в каталоге, для которого разрешено исполнение CGI-скриптов (с расширением .cgi), должны быть установлены три файла, weblogin.cgi, weblogin.tem и netams_api.pl. Первый является собственно самим скриптом веблогина, второй - это текстовый файл шаблона html-страницы (его можно редактировать под свои нужды) и третий - общий для всех Perl-скриптов интерфейс (API) работы с NeTAMS по сети (подробнее про Perl API см. 6.9).

    В начале скрипта weblogin.cgi вы должны определить пользователя, под именем которого будет осуществляться вход в программу собственно самим скриптом. В нашем случае это пользователь web с паролем WebLoginPWD.

    Каждый из пользователей на каждой из машин должен иметь на своем рабочем столе Windows (или в закладках internet explorer) ссылку на скрипт:
    http://192.168.0.1/cgi-bin/weblogin.cgi
    При переходе на эту ссылку клиент увидит страницу вроде этой:
    Web Login
    calling from: 192.168.0.11

    Username:     Password:

    Возможны два варианта: пользователи user2 ... user5 имеют возможность только ввести свой логин и пароль, при этом доступ для данного хоста (откуда они осуществляют логин) будет открыт автоматически при совпадении прав (логин-пароль-имя_хоста). Например:
    user user2 is opening unit host2
    calling from: 192.168.0.12

    Username:     Password:

    host2 (020002) opened 0 sec. ago, last used -1 sec. ago
       absolute timeout at 14400 sec, inactivity at -1 sec.
    

    В случае пользователя user1, который имеет право открыть доступ любому хосту, вид окна буде другим:
    Please specify a host
    calling from: 192.168.0.12

    Username:     Password:
    Host: host2 host3 host4 host5 host1


    После выбора необходимого хоста и нажания кнопки login процедура будет завершена.

    Вы также в любой момент можете просмотреть список действующих в данный момент таймаутов, он всегда выводится внизу таблички веб-логина. Это делается командой show timeout (см. 5.4.15)

7. Как сообщить об ошибках и откуда они могут возникнуть

Ошибки могут возникнуть и проявиться на стадии:

      А) распаковки, конфигурирования, сборки, первого старта
      Б) в процессе эксплуатации

Причинами ошибок являются:

      А) ошибки в моей программе и скриптах
      Б) ошибки сисадмина вследствие его кривых рук

Я сразу предупреждаю, что НЕ ЗАНИМАЮСЬ БЕСПЛАТНЫМИ КОНСУЛЬТАЦИЯМИ ПО НАСТРОЙКЕ ВАШЕГО ЮНИКСА, СЕНДМАИЛА, ТРАНСЛЯЦИИ АДРЕСОВ И ПРОЧЕГО. Я буду отвечать только на письма, непосредственно связанные с моей программой. Если вы не уверены в своих способностях по администрированию вашего сервера, по всей видимости, грамотно поставить и настроить мою программу самостоятельно вам не удастся. В то же время, я оказываю КОММЕРЧЕСКУЮ поддержку и консультации. Поймите меня правильно: эту программу я пишу в свободное от других дел время, один, и у меня НЕТ ФИЗИЧЕСКОЙ ВОЗМОЖНОСТИ помочь всем сразу с их бедами.

Если вы абсолютно уверены в том, что нашли баг в работе моей программы, и что проблема вызвана не опечаткой в конфиге, присылайте мне:
  1. Подробное описание проблемы
  2. Версию программы
  3. Файл конфигурации
  4. Ключи запуска
  5. Лог-файл
  6. Результат gdb netams netams.core , если core-файл создался, не удаляйте его!!!
  7. Тип и версию операционной системы (uname -a)
  8. Вывод ipfw show (iptables -l для линукса)
  9. ifconfig -a
  10. netstat -rn и правила трансляции адресов, если есть.
Отсутствие подобной информации будет восприниматься как личное неуважение ко мне, ведь я не шаман, чтобы по подземному стуку и невнятным объяснениям догадаться, в чем же проблема. Однако при четко сформулированной проблеме я очень постараюсь помочь вам. Шлите письма на адрес anton@inorg.chem.msu.ru

8. Настройка операционной системы для бесперебойной работы NeTAMS

В дистрибутиве находится стартап-скрипт, netams-startup.sh. В качетсве параметров он воспринимает ключи start и stop, запуск без параметров эквивалентен start. В первых строчках скрипта необходимо определить параметры и пути:

debug=1 # выводить ли отладочную информацию?
log=1  # создавать ли лог-файл?
configfile=/usr/home/anton/netams/netams.cfg   # путь до конфигурационного файла
appfile=/usr/home/anton/netams/netams   # путь до исполняемого файла
logfile=netams.log   # имя лог-файла
path=/tmp   # путь, в котором будет создаваться log-файл, core-файл и результат обработки core отладчиком

Поместите этот скрипт в /usr/local/etc/rc.d/ для FreeBSD или в /etc/init.d для Linux, с соответствующими ссылками из /etc/rcX.d/

9. Безопасность

Поскольку NeTAMS запускается с правами root, и отвечает за подсчет небесплатного траффика, безопасность всей системы является очень важным фактором. Существует несколько потенциально небезопасных направлений:
  1. Взлом всей системы через программу
  2. Взлом защиты самой программы
  3. Действия, приводящие к неверному учету траффика
Автор программы не несет никакой ответственности за ее использование и за тот ущерб, который (явно или неявно) может быть нанесен кому-либо в результате работы этой программы или ее компонентов. Если вы несогласны с этим утверждением, деинсталлируйте программу и все ее компоненты немедленно!

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

Несанкционированный доступ к программе может быть получен путем узнавания пароля и присоединения к программе через telnet. Это особенной актуально при использовании генератора статистики HTML. Для уменьшения риска:
Неправильный учет траффика возможен при неверном расположении правил ipfw/iptables и при получении статистики netflow от неизвестного источника. Для избежания этого:

999. Разное


2. Формат базы данных
  Для начала я расскажу, почему мне не очень хочется говорить о том, в каком виде данные присутствуют в базе. Дело в том, что aaa+fw и NeTAMS изначально задумывались как гибкие программы, где пользователь не был бы ограничен операционной системой, методом сбора траффика, его природой, и базой данных в которой лежала бы статистика. Кому-то нравится MySQL, кому-то Postgres, кто-то хочет только попробовать программу в работе и с БД связываться не хочется (тогда ему прямая дорога использовать unix hash). Привязка к БД привела бы к невозможности все это реализовать более-менее прозрачно. Я придерживаюсь мнения, что весь обмен данными о статистике между "внешним миром" и собственно хранилищем должен производиться через саму программу, которая выступает в роли слоя абстракции. Тем самым ваш PHP-скрипт логина в систему или отображения статистики одинаково работал бы независимо от типа реально БД, более того он бы и не знал о нем и легко переносил возможные в будущем изменения формата базы и ее принципа работы. Однако жестокая реальность не дает мне времени грамотно реализовать такой слой абстракции и снабдить потенциальных писателей расширений к моей программе неким API, по которому бы и велась работа с базой. Поэтому я расскажу о структуре данных, которые программа пишет в БД, на примере MySQL, наиболее широко используемой в данной задаче СУБД.

Вся информация помещается в таблицы raw и summary:
mysql> describe raw;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| unit_oid   | int(10) unsigned    |      | MUL | 0       |                |
| policy_oid | int(10) unsigned    |      | MUL | 0       |                |
| t_from     | int(10) unsigned    | YES  |     | NULL    |                |
| t_to       | int(10) unsigned    | YES  |     | NULL    |                |
| bytes_in   | bigint(20) unsigned | YES  |     | NULL    |                |
| bytes_out  | bigint(20) unsigned | YES  |     | NULL    |                |
| id         | bigint(20) unsigned |      | PRI | NULL    | auto_increment |
| hostname   | varchar(32)         | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
mysql> describe summary;
+------------+---------------------------+------+-----+---------+-------+
| Field      | Type                      | Null | Key | Default | Extra |
+------------+---------------------------+------+-----+---------+-------+
| prefix     | enum('T','M','W','D','H') |      |     | T       |       |
| unit_oid   | int(10) unsigned          |      | MUL | 0       |       |
| policy_oid | int(10) unsigned          |      | MUL | 0       |       |
| t_from     | int(10) unsigned          |      | MUL | 0       |       |
| bytes_in   | bigint(20) unsigned       | YES  |     | NULL    |       |
| bytes_out  | bigint(20) unsigned       | YES  |     | NULL    |       |
+------------+---------------------------+------+-----+---------+-------+

В таблице raw сохраняются сырые данные в виде потоков траффика, для каждого конкретного юнита и политики учета, с указанием времени начала (t_from) и конца (t_to) потока. Это время задается в стандартном формате UNIXTIME, т.е. числа секунд, прошедших с начала 1970 года. Вы можете преобразовать эти числа в нормальное человеческое время и наоборот:
mysql> select UNIX_TIMESTAMP('2002-03-20 22:31:48');
+---------------------------------------+
| UNIX_TIMESTAMP('2002-03-20 22:31:48') |
+---------------------------------------+
|                            1016652708 |
+---------------------------------------+
mysql> select FROM_UNIXTIME(1016652708);
+---------------------------+
| FROM_UNIXTIME(1016652708) |
+---------------------------+
| 2002-03-20 22:31:48       |
+---------------------------+
В таблице summary сохраняются суммарные данные о траффике для заданного юнита и политики, приведенные для конкретного периода времени. Префикс (prefix) определяет, что это за период:
T	total, "всего", т.е. с момента заведения данной комбинации unit+policy в базе
M	month, с начала месяца
W	week, с начала недели
D	day, с начала дня
H	hour, с начала часа
при этом поле (t_from) определяет момент, с которого начался подсчет для соответствующей записи. Например, если в базе содержится строка
+--------+----------+------------+------------+----------+-----------+
| prefix | unit_oid | policy_oid | t_from     | bytes_in | bytes_out |
+--------+----------+------------+------------+----------+-----------+
| D      |   149240 |    1339391 | 1016139600 |   579459 |    475384 |
+--------+----------+------------+------------+----------+-----------+
и select FROM_UNIXTIME(1016139600) выдает "2002-03-15 00:00:00"
то она описывает суммарный траффик для данного unit+policy за день, который начался 15 марта 2002 года.

3. Ссылки (с комментариями)
  http://www.atlant-inform.ru
"АТЛАНТ"
Продукт предназначен для корпоративных пользователей Интернет, использующих выделенный канал связи. Использование системы позволяет контролировать трафик Интернет с необходимой степенью детализации. Биллинговая система может быть полезна как крупным компаниям, имеющим несколько выделенных линий для доступа к Интернет от разных провайдеров, так и небольшим организациям, пользующимся линиями других фирм. Система может оказаться весьма удобной при ее совместном использовании компаниями, имеющими выход в Интернет через общий выделенный канал. "АТЛАНТ-ВК" представляет собой клиент-серверную информационную систему. Серверная часть системы функционирует на платформе Sybase Adaptive Server Anywhere (ASA) или Sybase Adaptive Server Enterprise (ASE) под ОС Linux, Windows 9х, 2000, NT.

http://www.servocomp.ru
"АСР Абсолют"
Интегрированная автоматизированная система для учета услуг и расчетов с клиентами компаний, предоставляющих услуги доступа к сети Интернет. "Абсолют" обрабатывает потоки учетных данных в режиме реального времени. Гибкий учет дифференцированного трафика с настраиваемой функцией агрегации предоставляют широкие возможности провайдеру для моделирования и развития новых видов услуг. Конфигурируемые модули сбора трафика обеспечивают оптимизацию нагрузки по тарификации и управления услугами в зависимости от состояния лицевого счета клиентов. Встроенные функции формирования наборов услуг и правил тарификации позволяют легко конструировать многочисленные и сложные схемы тарификации. "Абсолют" производит генерацию, печать и рассылку клиентских счетов. Обеспечивается взаиморасчеты Интернет - провайдеров с поставщиками конечных услуг PSTN при оказании уcлуг VoIP. Дружественные графические интерфейсы пользователя и позволяют операторам и администраторам быстро приобретать необходимые навыки, чтобы справляться с возрастающими рабочими нагрузками. Модули телекоммуникаций, биллинга и управления услугами Интернет интегрированы в одну систему, что позволяет строить развитую распределенную систему на различных платформах.

http://www.ietf.org/rfc/rfc2722.txt
Traffic Flow Measurement: Architecture
Это явно составляли теоретики, а не практики.

http://ing.ctit.utwente.nl/WU5/D5.2/index.html
The Internet NG Project/Work Unit 5/Internet Accounting/Internet Accounting Architecture
Теоретическое изложение того, каким должен быть аккаунтинг в сети. Неплохие примеры, но документ выложен неполностью.

http://www.anr.mcnc.org/~divert/index.shtml
Divert Sockets for Linux
Divert sockets enable both IP packet interception and injection on the end-hosts as well as on routers. Interception and injection happen at the IP layer. The intercepted packets are diverted to sockets in the user space, thus they will not be able to reach their destination unless they are reinjected by the user space sockets. This allows different tricks (e.g., routing and firewall) to be played, outside the operating system kernel, in between the packet interception and reinjection. for 2.0.x, if you need a 2.2.x example, see HOWTO, 2.4.х не поддерживается

http://sbilling.lrn.ru
Simple Billing System
Простая биллинговая система. Предназначена для подсчета сетевого трафика. Выполнена в виде биллинг сервера с которым взаимодействуют клиенты (proxy сервера или специальные демоны передающие информацию о проходящем трафике) . Сервер биллинга хранит все данные в базе mysql. На данный момент sbilling сервер работает только с socks proxy сервером.

http://skycat.pp.ru/projects/fdcd.html
FDCD
Маленький UNIX демон для сбора NetFlow информации.

http://www.netfilter.org
Netfilter
The netfilter/iptables project is the Linux 2.4.x / 2.5.x firewalling subsystem.It delivers you the functionality of packet filtering (stateless or stateful), all different kinds of NAT (Network Address Translation) and packet mangling. If you are running a recent Linux system (Kernel 2.4.x or above) on a router, you can use netfilter/iptables for all kinds of firewalling, NAT or other advanced packet processing. The major part of netfilter/iptables (doing all the hard work) is included in the standard Linux Kernel. In order to do your runtime configuration of the firewalling subsystem, you will need the iptables userspace command, which can be downloaded from here. Note that in most cases, the vendor of your Linux distirbution (Debian, RedHat, SuSE, Conectiva, Mandrake, ...) will already provide you with a pre-built version of this tool.

http://www.snort.org

The Open Source Network Intrusion Detection System
Наилучшая из существующих бесплатных систем обнаружения сетевых атак. Анализирует проходящий через UNIX/Windows маршрутизатор или мимо него траффик, сопоставляя его с обширной и все время пополняющейся базой данных известных атак. Требует (как и любая другая IDS-система) очень тщательной настройки, но результат оправдывает себя. Очень бы хотелось интегрировать обработку траффика, проходящего через NeTAMS, с помощью компонентов Snort.

http://www.agarev.pp.ru/billing.html
Система учета трафика клиентов сегмента сети через шлюз
Система предназначена для учета трафика клиентов сети, проходящего через шлюз на базе Unix FreeBSD машины. Cостоит из нескольких программых модулей. Часть из них запускается на сервере. Написаны они на С/C++. Есть оболочка администратора системы, написанная на Дельфи для Windows. И, наконец, на данный момент имеется единственный пока модуль cgi служащий для просмотра пользователями своей статистики через WWW. Пользователь системы идентифициется по его IP адресу, в соответствие которому ставится его nick-name. Таким образом любителям dhcp ЭТО не подойдет. В системе можно "жестко" привязать MAC адрес карточки клиента к его IP адресу. Однако это, как заметит просвященный читатель, не является панацеей от "умных узеров", которые умеют его менять. Однако, в большинстве случаев этого вполне достаточно. В систему встроены механизмы квотирования. Возможно задание "тотального" (то есть на все время существования данного клиента) и месячного лимитов входящего к клиенту трафика. По превышению оных клиент выключается. Система пока не оперирует с денежными единицами и не ведет "счетов" клиентов. В случае, если учета MAC адресов вести физически не возможно (сервер и клиенты находятся в разных сетях и статические arp записи не спасут положения) то разумнее всего предложить клиентам работать через VPN. Для этого на сервере настраивается и поднимается pptpd , использующий user-lever ppp и несколько видоизменяется политика учета таких пользователей (об этом позднее). Пользователи авторизуются в системе по логину и паролю, получают назначенный IP (прописывается каждому VPN пользователю в качестве адреса VPN адаптера). Из предыдущего пункта следует, что с неменьшим успехом система может учитывать трафик удаленных пользователей, подключенных через user - level ppp по модемам. Отчеты могут генерироваться системой как в оболочке администратора, так и с использованием cgi приложения. Последнее предназначено исключительно для пользователей. Управление же пользователями ведется пока только из оболочки администратора

http://www.nf.ru/billing/
NF Billing
Система NF Billing представляет собой программный комплекс, ориентированный на сбор данных о проходящем через Linux/Free BSD/OpenBSD маршрутизатор трафике, на котором установлено ПО NF Billing. Система предоставляет администратору статистику об использовании канала интернет потребителями внутренней сети (или сетей) организации в количественном выражении.

http://www.unixfaq.ru/cgi-bin/showq.pl?id=330
Каким софтом можно считать траффик под FreeBSD?
ipfw count (в составе ОС). Кто-то (либо руками) генерирует кучу правил типа ipfw add 100 count ip from any to ${local_ip_1} in , условие in желательно, поскольку без него траффик будет считаться 2 раза.
trafd aka bpft, Vladimir Vorobyev. Оно использует bpft для считания траффика, умеет работать в promisc mode, поэтому подходит для считания траффика не проходящего непосредственно через роутер
ipacctd, Roman V. Palagin. ipacctd слушает на каком-нибудь порту. Весь траффик надо туда либо дивертить (divert), либо тиить (tee).
ng_ipacct, Roman V. Palagin. Подгpужаемый модуль ядpа, pаботает чеpез netgraph
ipcad, Lev Walkin. Еще есть в портах ipcad, работает через bpf/pcap, выдает свои данные через rsh в виде совместимым с cisco ip accounting. Умеет сохранять и восстанавливать свою базу аккаунтинга в/из файлов

http://robert.cheramy.net/ipfm/
ipfm
IP Flow Meter is a bandwidth analysis tool, that measures how much bandwidth specified hosts use on their Internet link.

http://www.haskell.ru/~pooh/netfltools.html
Netflow processing tools
Набор утилит для сбора и отображения статистики NetFlow, приходящей от маршрутизаторов Cisco. К сожалению, не поддерживает сохранение информации в БД.

http://www.tcpdump.org/
libpcap
Библиотека, обеспечивающая перехват (точнее, копирование) пакетов (вместе с data-link level заголовком) в пользовательскую программу для дальнейшего анализа. Пример программы, которая ее использует - tcpdump. Данная библиотека используется в data-source libpcap

http://traflinux.sourceforge.net
talinux


http://www.netup.ru
NetUP UserTrafManager
Биллинговая система NetUP UserTrafManager v.3.0 предназначена для сбора информации о трафике, прошедшем через PC- или Cisco-роутер и ведения личных счетов пользователей. Система производит снятие денег со счета в соответствии с выбранным тарифным планом. Можно создавать любые тарифные планы. Есть возможность определять трафик в различные классы, что позволяет разделять его по сетям и задавать различную стоимость. Например, можно определить в отдельный класс трафик с провайдером, с которым у вас есть пиринговое соглашение. Можно задавать любое количество классов трафика. Наличие т. н. Агента Безопасности (UTM Secure Agent), позволяеющего отключать интернет пользователю, который потерял связь с сервером. Это нужно для предотвращения воровства трафика. Оптимизированная база данных позволяет хранить и обрабатывать детальную статистику за большие промежутки времени (многие месяцы). Интерфейс системы полностью построен на темплейтах, что позволяет изменять его вид под нужды конкретного дизайнера. Его можно "заточить" под любой сайт. Поддержка любого количества языков. Множество других функций.

http://www.univ.kiev.ua/~roman/soft/flowc
Flowc
Flowc is a tool for gathering, storing and analyzing traffic accounting for CISCO routers with NetFlow enabled switching (version 5). This package could be used by ISP for planning, analysis and billing procedures.