Netams + Quota

NetamsВ первой части Считаем трафик с помощью Netams я показал как устанавливать и минимально настроить Netams до работоспособного состояния. В этой статье я покажу как к Netams прикрутить сервис квот, а также немного примеров политик учета трафика.
Сервис квот вплотную завязан с firewall системы. Например для freebsd для того, чтобы сервис quota заработал необходимо, чтобы в ядре были включены опции IPFIREWALL и IPDIVERT. Для linux необходим модуль IPQ, который входит в большинстве поставок ядер 2.4.x и 2.6.x и системы iptables.

Правка Netams конфига

Итак, правим конфиг netams, добавляя туда service quota, а также правим service data-source 1, ну и добавляем service monitor (для мониторинга хостов).
1. Service quota + policy


service quota
policy internet
block-policy nonblock
soft-treshold 90
notify soft {owner}
notify hard {owner} admin
notify return {owner}

пояснение:
policy internet – эта политика по которой мы будем блокировать хост. Выглядит в конфиге примерно так:


policy name internet target proto ip

и обозначает сбор всего tcp,udp,icmp трафика прошедшего через интерфейс..

block-policy nonblock – это строчка показывает, что когда наступит квота для хоста, пропускать трафик перечисленный в политике nonblock (трафик, который не попадает под действие квоты). Фактически я бы рекомендовал в эту политику помещать icmp пакеты и очень нужный трафик, например почтовый. Когда квота закончилась почта будет ходить. В конфиге netams.conf запись о политике nonblock выглядит так:


policy name nonblock target policy-or special-sites local-traffic icmp smtp pop

Т.е. nonblock является составной (результирующей) политикой, состоящей из нескольких политик, на это указывает идентификатор policy-or. nonblock состоит из политик special-sites, local-traffic, icmp, smtp, pop. Сами эти политики у меня указаны так


policy name smtp target proto tcp port b25
policy name pop target proto tcp port b110
policy name local-traffic target file /usr/local/etc/local.txt
policy name special-sites target file /usr/local/etc/sites.txt
policy name icmp target proto icmp

Я думаю тут особые пояснения не нужны. Разве что в файлах local.txt и sites.txt перечислены IP сайтов с указанием масок.
Примеры файлов:


$ cat ./local.txt
192.168.0.0/16
$ cat ./sites.txt
74.54.186.226/32
213.180.204.8/32

soft-treshold 90- срабатывание “мягкой” квоты, по которой должно отсылаться email сообщение пользователю. Пока эта функция в режиме теста, сообщение как-то замечено не было :(. А вот сообщения по жесткой квоте и обнулении квоты приходят точно по указанному в юните email.

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


notify soft {owner}
notify hard {owner} admin
notify return {owner}

Теперь задаем сами квоты в Netams. В сомом конфигурационном файле квоты не указываются, их надо задавать при подключении через telnet к порту на котором слушает Netams.
Итак, порядок действий для задания квоты:

  • На компьютере с установленной и запущенной netams сделать telnet port_netams (по умолчанию 20001)
  • Ввести логин, пароль, по умолчанию admin, aaa
  • Перейти в режим ввода команд – configure terminal (только если у вас версия Netams выше 3.4.0)
  • Набрать команду service quota
  • Далее уже из подменю quota, например дать команду set name rokada policy internet active month 1536M in

Обязательно в команде указать правильно название юнита и политики по которой будет считаться квота.. Политики квот можно выставить, на час, день, неделю, месяц. Квота может считаться входящей (in), исходящей (out), а также суммарная (sum) – это сумма in+out. В данной примере мы задали квоту юниту с названием rokada, по политике internet с входящим трафиком 1,5Gb в месяц на скачку.
Как это выглядит в консоле


# telnet localhost 20001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
NeTAMS 3.4.5 (3490.1) mik@m1k / Mon 26 Jul 2010 11:08:53 +0400

Username: admin
Password:

# conf t

(config)# service quota
switching to service quota:0 for configuring

(config-quota:0)# set name rokada policy internet active month 1536M in
Creating quotadata to unit rokada, policy internet
unit 009752 quota is set to ACTIVE

(config-quota:0)#
# exit
Connection closed by foreign host.

2. service data-source 1
Теперь внесем изменения в netams.conf в data-source 1. Это тот интерфейс, который у нас смотрит в интернет. Суть изменений в том что статистика собираемая по типу libpcap не может работать с квотами. Поэтому надо вмешиваться в правила firewall системы, иначе никак.
Для freebsd правим service data-source 1 так:


service data-source 1
type ip-traffic
source divert 199
rule 39 "ip from any to any out via bge0"
rule 52 "ip from any to any in via bge0"
layer7-detect urls

пояснение:
type ip-traffic – данные берутся путем перехвата ip-пакетов из ядра через divert socket
source divert 199 – это будет номера правил divert для Netams
rule 39 “ip from any to any out via bge0” и rule 52 “ip from any to any in via bge0” это правила для IPFW с обязательным указанием номеров правил. Номера правил поставьте свои. Смотрятся через команду ipfw show.
И помните это важно – правила netams divert должны обрамлять правила IPFW сети, которую мы натим в инет.
Вот как в этом примере


# ipfw sh
skip....
00039 23956855  3073717745 divert 199 ip from any to any out via bge0
00040 19841411  1821416308 divert 8668 ip from 192.168.0.0/24 to any out via bge0
00050 54066670 19207383192 divert 8668 ip from any to me in via bge0
00052 27848384  9602053191 divert 199 ip from any to any in via bge0
skip....

В примере обратите внимание на номера правил 39 и 52, видите, они обрамляют 2 (40 и 50) правила для NAT сети в интернет.

Нельзя останавливать netams убиванием его процессов, т.к. правила 199 останутся в ipfw, и это грозит последствиями отпадания инета или вообще потери связи с сервером. Использовать надо только скрипт корректной остановки netams, который убирает обрамляющие правила 39 и 52.

Если у вас linux, правим правила service data-source 1 так:


service data-source 1
type ip-traffic
source ipq
layer7-detect urls

Здесь type ip-traffic – данные берутся путем перехвата ip-пакетов из ядра через netfilter.
source ipq говорит о том, что пакеты будут заворачиваться в программу Netams и она может отдать или не отдать их системе обратно. Используется библиотека libipq.
Для работы должен быть загружен модуль ip_queue. Проверить стоит ли этот модуль в системе достаточно просто, выполните от root или sudo команды


# modprobe ip_queue
# lsmod | grep queue
ip_queue               11024  0

Надеюсь модуль у вас есть, а иначе пересобирать ядро или компилировать модуль.
Если для freebsd c firewall достаточно все просто, то в linux я приведу его конфиг. Чтобы вы знали в какое место в конфиге вставлять queue обработку
Примерный конфиг firewall в linux – fw-queue.txt

layer7-detect urls – это строка для сервиса monitor. Для проведения тестов ее лучше убрать..
В принципе можно пробовать запускать netams с новым конфигом и для начала проверить как будет обрабатываться подсчет трафика.
Потом зайти в админскую консоль нажав на

При необходимости активировать квоту. В разных версиях netams этот процесс может отличаться. Раньше при задании квоты она активировалась автоматом, в версии 3.4.5 почему-то у меня квота была неактивна. А после активации пришлось заново вбивать квоту 1,5Gb, но уже через web админскую консоль. Смотрите скриншоты.

Нажмите кнопку Activate It для активации квоты

Укажите квоту после активации и нажмите Apply

Если все правильно работает, то на страничке статистики netams будет ссылки на текущий конфиг и остатки текущих квот для юнитов.

3. service monitor
Сервис нужен для мониторинга посещения хостов. Может показывать строки заголовков http.
Как было сказано выше , добавить строку layer7-detect urls в service data-source.
Затем в конфиге созать секцию монитор.


service monitor 0
monitor to file /var/log/netams_monitor.log
monitor unit 009780
monitor unit 009790
monitor unit 009800

пояснение:
monitor to file /var/log/netams_monitor.log – пишет лог в указанный файл. Если трафик большой, то лучше сделать ротацию файла чтоб не пух. Также можно заносить данные в базу mysql, а потом делать выборки с помощью admin скриптов, которые идут в поставке netams.
Далее идут id юнитов, за которыми мы хотим следить.

Хочу привести полный конфиг моего netams на одном из серверов. В конфиг внесены изменения насчет паролей и реальных ip, email. Поэтому бездумный copy+past не сработает, меняйте под себя. показать


Обратите внимание в политике по умолчанию restrict all drop local pass все юниты, которые не указаны в конфиге нетамс будут отрезаны от интернет. Netams будет блокировать их доступ.

Некоторые моменты подсчета трафика в netams

Что-то я никак не понимал работу политик netams. Но что надо понимать обязательно.

К примеру есть политики


policy oid 0DE24F name internet target proto ip
policy oid 0DE25F name smtp target proto tcp port b25

и есть описание юнита


unit host oid 009750 name mail ip 62.152.xxx.xxx acct-policy %smtp internet

По идее под политику internet попадает и политика smtp, но здесь знак % означает, что как только сработает политика smtp то политика дальше не пойдет по цепочке и трафик в internet уже не попадет. А вот если знак % не поставить, то в политику internet попали бы и smtp и все остальное. Т.е. в политике interent был бы фактически весь трафик.
Если указать только


unit host oid 009750 name mail ip 62.152.xxx.xxx acct-policy internet

то счетчик будет учитывать все tcp, udp, icmp на этом хосту..

Т.е надо внимательно следить за очередностью применения политик на юните.

Замечания

Если у вас не работают все функции web админки netams надо доставить необходимы модули в систему. В данном случае установлены следующие perl модули:


bsdpan-Crypt-GeneratePassword-0.03
p5-DBD-mysql50-3.0007
p5-DBI-1.52 
p5-Net-Daemon-0.39
Запись опубликована в рубрике Netams, Считаем трафик с метками , , , , , . Добавьте в закладки постоянную ссылку.

15 комментариев Netams + Quota

  1. Lerk говорит:

    Есть какие-то подводные камни в настройке?

    У меня при конфиге:


    policy oid 006DF3 name all-ip target proto ip
    policy oid 049E5D name www target proto tcp port 80 81 8080 3128
    policy oid 0D8C31 name mail target proto tcp port 25 110
    policy oid 08698A name ftp target proto tcp port 21
    policy oid 03C4BD name urls target layer7-detect
    policy oid 0F3EAB name FTG target policy-or ftp mail
    restrict all pass local pass
    unit group oid 0D39E9 name NETWORK acct-policy all-ip www mail
    unit net oid 042FC7 name LAN ip 192.168.32.0/24 no-local-pass acct-policy all-ip www mail
    unit user oid 051935 name Laptop ip 10.0.1.11 parent NETWORK acct-policy all-ip www ftp mail urls fw-policy FTG

    service data-source 1
    type ip-traffic
    source ipq
    layer7-detect urls
    rule 90 "INPUT -p all -j QUEUE"
    rule 100 "FORWARD -p all -j QUEUE"

    service monitor 1
    monitor to storage 1
    monitor unit Laptop

    service quota
    soft-treshold 85
    policy www
    block-policy FTG
    notify soft owner
    notify hard owner
    notify return owner

    Есть сервер, который раздает по WiFi инет через заранее поднятый NAT.
    Задумка была такая: чтобы при наступлении квоты обрубался www трафик и оставался разрешенным только ftp и почта, тем не менее наступает квота и блокируется весь траф. В iptables за исключением NATa и строк из конфига с очередью ничего не прописывал. В чем может быть проблема?

    • mik говорит:

      Давайте попробуем разобраться…
      Из описания конфига netams и описания схемы сети, я не совсем понял вот что:
      192.168.32.0/24 – эта сеть стоит за NAT, а это 10.0.1.11 что за сеть?
      На какой из unit применена квота?
      Далее я предполагаю что на laptop..
      Вот это fw-policy FTG в строке описания unit laptop я так понимаю, что эту политику нужно пропускать при достижении квоты, а зачем же указывать в acct-policy политики mail и ftp?

      предлагаю поэкспериментировать 🙂 Оставить в подсчете только общую политику без fw-policy у меня так работает.. Вот примерно так
      unit user oid 051935 name Laptop ip 10.0.1.11 parent NETWORK acct-policy all-ip
      Остальное можно все так и оставить, вроде проблем нет..
      И еще важный момент, не важно что вы пишите в конфиге, важно как это понимает netams, поэтому сделайте на сервере
      telnet localhost 20001
      пройдите авторизацию и выведите конфиг в консоле, или ждите когда статистика запишется и запишится текущий конфиг. Это я к тому что сравните как ваш netams.cfg понимает netams. У меня много раз было, вроде и правильно пишу в cfg, а в самом netams что-то не хватает. Обязательно дайте конфиг, который выводит netams.

      И для linux НЕ надо писать

      rule 90 "INPUT -p all -j QUEUE"
      rule 100 "FORWARD -p all -j QUEUE"

      напишите просто перед строками NAT в самом конфиге firewall
      FORWARD -p all -j QUEUE
      Input цепочку лучше не трогать..
      Посмотрите мой пример конфига firewall для linux, там кое-что можно опустить, но в целом он простой и короткий.
      Также советую сделать в netams цепочку icmp и поставить ее в разрешения трафика при наступлении квоты. Просто отлаживать командой ping проще.

      Если что, то спрашивайте

      • Lerk говорит:

        # show config
        #NeTAMS 3.4.5 (3490.1) root@lerk-laptop / Wed 10 Nov 2010 13:19:08 +0300
        #configuration built Mon Jan 31 11:32:31 2011
        #begin
        #global variables configuration
        debug none
        language ru
        user oid 00D668 name admin real-name "Lerk" crypted $1$$s60wMoB19BVx6Fpu41bLA1 email root@localhost permit all
        #services configuration


        service server 0
        login local
        listen 20001
        max-conn 6

        service processor
        lookup-delay 20
        flow-lifetime 120
        policy oid 006755 name ip target proto ip
        policy oid 0B9291 name www target proto tcp port 80 81 8080 3128
        policy oid 006058 name icq target proto tcp port 5190
        policy oid 025EC3 name icmp target proto icmp
        policy oid 026D24 name nonblock target policy-or icmp icq
        policy oid 00B7AF name urls target layer7-detect
        restrict all pass local pass
        unit group oid 024919 name NETWORK acct-policy ip www
        unit net oid 0004EE name LAN ip 10.0.1.0/24 no-local-pass acct-policy ip www
        unit host oid 0FDD86 name server ip 10.0.1.1 parent NETWORK acct-policy ip www
        unit user oid 062755 name E52 ip 10.0.1.15 parent NETWORK acct-policy ip fw-policy nonblock

        service data-source 1
        type ip-traffic
        source ipq
        layer7-detect urls
        rule 10 "FORWARD -p all -j QUEUE"

        service monitor 1
        monitor to storage 1
        monitor unit E52

        service quota
        policy ip
        block-policy nonblock
        notify soft owner
        notify hard owner
        notify return owner

        Добрый день. Спасибо за комментарий, помогло. С таким конфигом квотирование корректно заработало. Соответсвенно квотирование включено на E52.

        Тем не менее остались вопросы:
        1. acct-policy влияет только на подсчет трафика? То есть допустим acct-policy ip www mail ftp icq будет считать траффик по соответствующим политикам, а acct-policy ip %www mail ftp icq будет считать ip и www(в случае, если www траф есть)?
        2. Если указана политика restrict all drop local drop, то тогда уже надо для каждого юнита в частности прописывать fw-policy, который будет указывать на пропускаемые типа траффика?

        Если еще что вспомню, спрошу)
        Спасибо)

        • mik говорит:

          И вам спасибо за коммент рад что помог

          Отвечаю на вопросы.
          1. И так acct-policy ip www mail ftp icq
          и так acct-policy ip %www mail ftp icq
          будет считаться трафик по всем политикам в вашем конкретном случае. Различие вот в чем (кстати в статье я это писал).
          Все что попало в политику %name дальше уже не пойдет и не будет считаться. У вас трафик в политике www уникальный с определенных портов, поэтому он не будет пересекаться с политиками mail, ftp, icq, поэтому такой оборот в “%” особого смысла не имеет в данном случае.
          В политике ip, когда она идет первой по списку собирается весь трафик используемой этой машиной, т.е. в это число будет входить и www и mail, ftp, icq.
          А вот если поставить ip последней, а все остальное завернуть в “%”
          acct-policy %www %mail %ftp %icq ip то в счетчик ip попадет лишь то, что не забрали предыдущие политики. Если хоть у одной политики не будет знака %, то в ip это просуммируется.
          Надеюсь разжевал 🙂

          На второй вопрос, судя по документации Netams так как вы и сказали, надо прописывать fw-policy. Но я честно признаюсь с этим не игрался..

  2. Павел говорит:

    Спасибо огромное за статью!!!
    Вопрос родился следующий:
    Такая ситуёвина… в сервисе квот описана

    block-policy nonblock,

    как и у тебя в статье… и соответственно сама политика тоже описана…
    так вот запускаю, допустим, видео “вконтакте”…
    но оно продолжает грузиться даже при наступлении квоты юнита, но при этом другие сайты уже не открываются….

    а если закоментировать в конфиге саму политику nonblock то при наступлении квоты видео грузиться перестает сразу же…

    Был бы признателен, если есть возможность, пнуть, в какую сторону копать…

    • mik говорит:

      без примера конфига относящегося к данным блокируемых policy, а также какой URL пытаетесь открыть я не смогу ответить на вопрос.
      Если как у меня в конфиге, то у меня есть special-sites в файле котором занесены ip сайтов.
      Вконтакте закрыть или открыть будет сложновато таким образом, т.к. надо знать целую кучу ip этого домена.
      Так что приведи конфиг и если есть, то и данный файлов например таких как sites.txt.

  3. Павел говорит:

    Да, прошу прощения…

    
    #NeTAMS 3.4.5 (3490.1) root@laptop.localhost.ru / Sat 07 May 2011 01:54:08 +0400
    
    #begin
    #global variables configuration
    debug none
    language ru
    user oid 02BFD3 name admin real-name "Admin" crypted $1$$ce6VbS/F9wwQE4T5NXsoh0
    
    #services configuration
    
    service server 0
    login local
    listen 20001
    max-conn 6
    
    service processor
    lookup-delay 2
    flow-lifetime 5
    policy oid 066610 name ip target proto ip
    policy oid 006292 name www target proto tcp port 80 81 8080 3128 443
    policy oid 06FEE8 name ftp target proto tcp port 20 21
    policy oid 0EEAC7 name pop3 target proto tcp port 110
    policy oid 00AD47 name smtp target proto tcp port 25
    policy oid 011A84 name ipsec target proto esp
    policy oid 05AA61 name rdp target proto tcp port 3389 5589 3390 5590 5593 37777
    policy oid 0B6897 name ssh target proto tcp port 22
    policy oid 0B6898 name icmp target proto icmp
    policy oid 0B6899 name nonblock target policy-or icmp smtp pop3
    restrict all drop local pass
    unit group oid 0DDC25 name IT acct-policy ip www ftp pop3 smtp rdp ssh ipsec
    unit host oid 056B75 name WAN1 ip 192.168.0.125 acct-policy ip www ftp pop3 smtp rdp ssh ipsec
    unit net oid 0A1C69 name LAN ip 172.17.5.0/24 acct-policy ip www ftp pop3 smtp rdp ssh ipsec
    unit user oid 08D6F1 name user1 ip 172.17.5.20 parent IT acct-policy ip www ftp
    unit user oid 08D6F2 name user2 ip 172.17.5.21 parent IT acct-policy ip www ftp
    unit user oid 08D6F3 name user3 ip 172.17.5.22 parent IT acct-policy ip www ftp
    
    service storage 0
    type mysql
    user root
    password _password_
    accept all
    
    service quota
    soft-treshold 90
    policy ip
    block-policy nonblock
    notify soft owner
    notify hard owner
    notify return owner
    
    service data-source 1
    type ip-traffic
    source divert 199
    layer7-detect urls
    rule 100 "ip from any to any out via em0"
    rule 400 "ip from any to any in via em0"
    
    service monitor 0
    monitor to storage 0
    monitor unit WAN1
    monitor unit LAN
    
    service alerter 0
    report oid 06100 name rep1 type traffic period day detail simple
    smtp-server localhost
    
    service html
    path /usr/local/www/netams/stat
    run 5min
    url http://172.17.5.1/netams/stat
    htaccess yes
    client-pages all
    account-pages none
    
    service scheduler
    oid 08FFFF time 5min action "html"
    
    #end
    

    Дело даже не именно “вконтакте”, а в том что потоковое видео !продолжает! грузиться и воспроизводиться даже при наступлении квоты, будь-то яндекс, вконтакте, ютуб и т.д.
    а если в конфиге закоментировать(удалить) строчку

    policy oid 0B6899 name nonblock target policy-or icmp smtp pop3

    то такого не происходит, т.е. при наступлении квоты интернет обрезается мгновенно и полностью…

    • mik говорит:

      хм.. действительно загадка 🙂 быстренько ограничил тестовую машину этими же правилами как у тебя в конфиге и испытания показали, что потоковое видео и видео с роликов не блокируется при достижении квоты! А новые соединения уже не создаются.. Почта, пинги работает как и должны по nonblock.
      Выкинул nonblock из конфига, видео отсохло по достижении квоты, но если честно сказать тоже не сразу как за квоту перевалило, но довольно быстро.
      Думаю надо идти на сайт netams.com и спрашивать там, думаю баг 🙂
      Кстати, а какая версия у тебя? я смотрю там уже 4 вовсю тестят.. Надо бы попробовать..
      Спасибо что написал сюда об этом, было интересно. Если что-то прояснится по этому вопросу дай знать.

  4. Павел говорит:

    Версия 3.4.5 из стандартных портов FreeBSD
    Ок… буду ковырять… наковыряю – непременно отпишусь…

    И тебе спасибо за участие 😉

  5. Alm говорит:

    Еще раз спасибо за статью…!
    У меня возникло не много вопросиков.
    1. Вы случайно не знаете почему появляется ошибка:
    ds_ipq:1 [INFO]: service ds_ipq:1 thread start failed
    ds_ipq:1 [INFO]: service ds_ipq:1 thread cancelled
    В файл правил iptables была добавлена строчка – modprobe ip_queue
    Что самое странное после перезапуска сервиса Netams ошибка пропадает.
    Если не добавить строчку modprobe ip_queue, то появляется ошибка –
    data-source [ERR]: ipq_set_mode failed: Failed to send netlink message

    2. Я взял за основу ваш файл правил iptables, подправив его немного.
    Там вот есть правило NAT, хотелось бы узнать, после применения правил, Интернет на клиентских компьютерах локальной сети должен ли быть?
    Или доступ в Интернет уже будет задаваться в самом NetAMS?

    • mik говорит:

      по 2 вопросу. Доступ будет задаваться в Netams если стоит политика ограничения restrict all drop local pass, если restrict all pass local pass тогда Netams будет пропускать всех кто указан в правилах NAT iptables.

  6. Alm говорит:

    Все заработало )))

  7. Alm говорит:

    А как можно сделать так, чтобы например NeTAMS не пускал ни кого в Интернет кроме тех у кого есть квоты?

    • mik говорит:

      Вы немного невнимательно прочли статью ))
      Строчка “restrict all drop local pass” как раз для вас. В конфиге прописываете только тех кому можно в инет + на каждый unit прописываем квоты.

  8. Alm говорит:

    Спасибо mik, все заработало…=)

Добавить комментарий

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