Настройка системы учета трафика на основе NeTAMS
17.01.2005 | admin

Начну с описания ситуации в которой я оказался. Один мой хороший знакомый подключил себе ADSL, а т.к. подключение данного удовольствия штука муторная и недешевая (1400р модем+ 600р. подключение), его соседи решили подрубиться к нему в сетку, с возможностью выхода в интернет. О чем вопрос – сказано сделано.
Итак постановка задачи: есть три клиентских компа, есть гейт на линуксе, к которому подключен adsl модем на интерфейс eth1. Соответственно внутренняя сеть висит на eth0. Топология сети такая:

Топология сети

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

1. Установка netams

Как показала практира правильность работы netams как никогда зависит от правильной его установки!

Прежде всего скачайте последнюю версию!!! Взять ее можно на официальном сайте NeTAMS.
Кроме того вам понадобится установленный и работающий Веб-сервер (чтобы клиенты могли смотреть статистику), Mysql (или postgreSQL) для хранения статистики.

Обязательно проверьте наличия библиотеки libipq.a в каталоге /usr/lib (поставляется вместе с iptables, но у меня почему то была не установлена) – без нее нельзя будет настроить квотирование. Если ее нет, то скачайте iptables, установите и вручную скопируйте файлы libipq/libipq.a в /usr/lib, а также include/libipq/libipq.h в /usr/lib.
Также желательно иметь библиотеку libpcap.

Если у вас mysql установлен в нестандартной папке, то придется добавить <mysql>/lib и <mysql>/include каталог в переменную paths файла configure.sh. <mysql>/bin желательно тоже добавить в configure.sh в переменную PATH. От этого зависит вообще будет ли netams работать c mysql (<mysql> – это префикс куда установлен mysql). Если при запуске configure.sh он все нашел, то можно запускать make.
У меня почему то не захотела компилится поддержка RADIUS, поэтому пришлось ее отключить, в Makefile достаточно для этого убрать строчку «DEFINE += -DUSE_LIBRADIUS»

Вот так должен выглядеть вывод скрипта configure.sh

##########################################################
## Configuring NeTAMS for build targets...              ##
Linux operating system...
Will have LIBIPQ support
Will have MYSQL support
        [ /opt/mysql/lib/mysql  /opt/mysql/include/mysql ]
Will have BILLING service
Will have DEBUG flag set
Will have RADIUS support
## Configuration file was built.                        ##
##########################################################

После этого пишем make && make install. И надеемся что все скомпилилось правильно :)

Для настройки квотирования вам также понадобится модуль ядра ip_queue для заворачивания пакетов из правил iptables. В ядре сие чудо называется
«Userspace queueing via NETLINK (EXPERIMENTAL)» в настройках netfilter.

2. Первый запуск NeTAMS

Само конфигурирование netams можно делать как напрямую через /etc/netams.cfg, так и через подключение через telnet. Через telnet настраивать намного удобней, т.к. все изменения происходят в реальном времени без остановки системы. Для первого запуска возьмите конфиг с сайта NeTAMS. Для запуска достаточно набрать

# netams

Если все прошло успешно то в списке процессов (ps -A) вы должны увидеть netams.

3. Настрока Mysql для работы с NeTAMS

Для того чтобы netams мог сохранять статистику в базе, необходимо завести аккаунт в mysql.
Подключаемся к mysql пользователем root

mysql -u root -p

Выполняем следующие команды:

mysql>create database netams;

mysql>GRANT ALL ON netams.* TO netams@localhost IDENTIFIED BY 'password';

mysql>flush privileges;

mysql>exit;

где password это пароль для пользователя netams в базе netams

4. Конфигурирование NeTAMS

Подключитесь к netams через телнет командой

# telnet localhost 20001

Логин для первой сессии – admin, пароль 123 (если вы воспользовались конфигом с сайта netams

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

Итак начнем…

4.1 Сервис main

Это главный сервис netams, который кроме всего прочего отвечает за возможность подключения пользователей (читай «администраторов») через telnet. Можно определить до туевой хучи этих пользователей. Для начала посмотрим что у нас уже настроено:

>show users
   OID | MODE |       NAME |            REAL NAME |     PERMIT
0C531D |    U |      admin |                Admin |        all

Синтаксис команды для добавления пользователя смотрим здесь. Для удаления команда no user.
Команда language позволяет выбрать язык на котором будут формироваться страницы html со статистикой.
Пока доступно только два языка en и ru.

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


>user oid 0C531D name Demige real-name "Zvonilov Mikhail" email mike@fwall password 32167 permit all

parse: user Demige name set: Demige

parse: user Demige real-name set: Zvonilov Mikhail

parse: user Demige email set: mike@fwall

parse: user Demige password set: <>

parse: user Demige permissions set: all

>language ru

parse: output language is ru

Таким образом мы переименовали пользователя с oid 0C531D в Demige с реальным именем Zvonilov Mikhail, адресом почты mike@fwall и паролем 32167. Пароль при сохранении всегда шифруется автоматически. Также мы выставили русский язык для формирования html страничек и писем e-mail. Т.к. администратор сети я единственный, больше пользователей добавлять не надо. Для сохранения настроек в конфиге пишем save.

4.2 Сервис scheduler

Сервис для переодического выполнения определенных команд.
Синтаксис команд.

>show schedule

   OID | INTERVAL   |    LEFT | ACTION
08FFFF | hourly     |    1681 | html

В конфиге по-умолчанию настроено выполнение команды html каждый час (формирования html статистики).


>schedule oid 08FFFF time 10min

parse: task 08FFFF modified

parse: task 08FFFF time set: 10min, exec in 600 sec

Изменяем расписание чтобы html статистика обновлялась каждые 10 минут. Что полезно по-крайней мере при отладке сервера.

4.3 Сервис server

Сервис отвечает за возможность подключения через telnet.
Синтаксис команд. Выполняем:

>service server
parse: switching to service server:0 for configuring

server:0# max-conn 2

server:0# login localhost

Переходим к конфигурации сервиса командой service server и выставляем максимальное число подключений через telnet 2, с возможностью зайти только локально.

4.4 Сервис storage

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

>service storage
parse: creating service storage:0
storage:0# type mysql
parse: storage type is set to MySQL
storage:0# user netams
parse: username is set to netams
storage:0#password netams32167
parse: password is set to netams32167
storage:0#dbname netams
parse: dbname is set to netams
storage:0#socket /mnt/chroot/mysql/tmp/mysql.sock
parse: socket is set to /mnt/chroot/mysql/tmp/mysql.sock
storage:0#port 3306
parse: port is set to 3306
storage:0#accept all
parse: this storage will accept following data: raw summary monitor login quota events oids billing bdata config

Таким образом мы настроили хранилище «0″ для доступа к базе mysql с названием netams под именем пользователя netams с паролем netams32167 (пароль такой же как указывали в команде GRANT при настройке mysql). Доступ осуществляется через сокет /mnt/chroot/mysql/tmp/mysql.sock или через порт tcp 3306. В данном хранилище будет хранится вся информация. Путь для сокета у вас скорее всего отличается, к тому же необходимость его указывать возникает, только если mysql работает с опцией skip-networking, когда он перестает слушать порт. Во всех остальных случаях доступ к базе будет производиться по порту 3306. Также необходимо следить за загруженностью mysql. Netams в полной конфигурации требует 7 коннектов к mysql. Т.о. max_connections в файле /etc/my.conf необходимо выставить по-крайней мере не меньше 8.

4.5 Сервис data-source

Сервис, который получает информацию о траффике из разных источников.
Синтаксис команд

. Настраиваем:

>service data-source 1
parse: switching to service data-source:1 for configuring
data-source:1#type ip-traffic
parse: data-source type is set to ip-traffic
data-source:1#source ipq
parse: source is set to ipq
rule 0 "FORWARD -i eth1 -o eth0 -j QUEUE"
parse: rule 0 set to FORWARD -i ppp0 -o eth0 -j QUEUE
rule 1 "OUTPUT -o eth0 -p tcp --sport 3128 -j QUEUE"
parse: rule 1 set to OUTPUT -o eth0 -p tcp --sport 3128 -j QUEUE

Переходим для конфигурации сервиса data-source с номером 1 (вообще говоря их может быть несколько). Перехват будет делать через ядро системы linux соответственно выбираем ip-traffic. Источником данных будет служить цепочка в правилах iptables (библиотека ipq и модуль ip_queue). Подробнее остановимся на правилах iptables.

Первое важное замечание. NeTAMS считает что iptables находится в /sbin/iptables, поэтому если его там нет создайте линк. Второе важное замечание: Почему не следует определять правила заранее в системных настройках iptables. Дело в том что при запуске netams и соответственно при запуске сервиса data-source, он добавляет правила в начало цепочек iptables, тем самым »заворачивая» весь проходящий траффик в netams и уже NeTAMS определяет – отдавать траффик обратно системе или нет. Т.е. если вы определите правила в системе, а netams случайно закроете, то выхода в интернет не будет! И даже на сервер зайти удаленно вы возможно не сможете! При определении правил через комунду rule, netams сам их добавляет при запуске и убирает при выходе из программы, что намного безопаснее.

Разберем правила, которые netams будет добавлять в iptables:

  • FORWARD -i eth1 -o eth0 -j QUEUE – весь траффик выходящий из интернет и предназначенный для локальной сети eth0 будет проходить через netams.
  • OUTPUT -o eth0 -p tcp –sport 3128 -j QUEUE – траффик проходящий с порта 3128 сервера (порт proxy – у вас может быть другой) вовнутрь сети eth0 тоже будет заворачиваться в netams. Так мы сможем посчитать весь траффик потребляемый пользователем. У данного правила есть небольшой недостаток. Т.к. прокси некоторые странички кэширует, то они не будут сливаться из нета, а траффик несколько «натикает». Т.о. цена траффика будет несколько завышена.
    Но это не очень страшно – главное что не занижена :).
  • 4.6 Сервис processor

    Итак добрались до самого сладкого :). Сервис processor – это ядро системы, которое как раз и определяет что же делать с траффиком который попадает в netams. Он состоит из двух частей – политик и юнитов. С помощью политик определяется к какой группе относится тот или иной траффик. С помощью юнитов определяется пренадлежность данного траффика какому-то компьютеру/пользователю/подсети.
    Синтаксис смотрим здесь. Итак начнем…

    >service processor
    parse: switching to service processor:0 for configuring
    processor:0# lookup-delay 30
    parse: lookup delay is set to 30 seconds
    processor:0#flow-lifetime 300
    parse: flow lifetime is set to 300 seconds

    Выставляем переодичность просмотра юнитов в 30сек, и каждые 300сек накопленные данные будут сохранены в статистику. Чем меньше время flow-lifetime тем чаще обновляется статистика, но тем и база больше.

    processor:0#policy name ip target proto ip
    parse: policy 04643C target set: proto ip

    Создаем политику для учета всего ip траффика (все протоколы).

    processor:0#policy name www target proto tcp port s80 s8080 s8888
    parse: policy 069BA3 created
    parse: policy 069BA3 name set: www
    parse: policy 069BA3 target set: proto tcp port s80 s8080 s8888

    Этой политикой будет учитываться только траффик приходящий с удаленных портов 80,8080,8888, что вообщем то соответствует протоколу http. По ней можно будет отследить сколько траффика мы тратим на просмотр страниц. Чисто для статистики

    processor:0#policy name icq target proto tcp port s5190
    parse: policy 0C7DF4 created
    parse: policy 0C7DF4 name set: icq
    parse: policy 0C7DF4 target set: proto tcp port s5190

    Здесь будем считать траффик icq.

    processor:0#policy name proxy target proto tcp port s3128
    parse: policy 0C2C89 created
    parse: policy 0C2C89 name set: proxy
    parse: policy 0C2C89 target set: proto tcp port s3128

    Весь траффик приходящий от прокси. (здесь важно заметить что необязательно от нашего. Для опознания именно нашего прокси необходимо произвести более точную настройку с применением параметров addr или file). Итак что мы получили в итоге? Траффик сливается из iptables в двух местах (важно здесь чтобы не сливался дважды!) Для netams неважно откуда взялся траффик, мы можем основываясь на правилах его просто посчитать. У нас есть четыре политики ip (которая кстати есть в дефолтном конфиге), www Для протокола http, icq и proxy, чтобы определить сколько траффика прошло через прокси.

    Теперь необходимо настроить объекты учета, а именно юниты. Обратим внимание на важную команду:
    restrict all {drop|pass} local {drop|pass}, команда определяет как мы поступаем с траффиком попавшем в netams.
    Здесь два класса траффика all и local. all – это весь траффик попавший в netams, local – это траффик который описан некоторыми юнитами. Значение по умолчанию restrict all local pass. т.е. траффик, который считается – пропускается дальше по умолчанию (если не определена политика фаервола для юнита), если же есть какой то траффик, который не попал ни под один юнит – он отбрасывается. Согласен трудно понять, но дойдет постепенно :). Вообще в сервисе много интересных команд для автоматизации процесса учета траффика. Аля подключил машину к сети и по ней уже ведется учет траффика. Это можете сами разобрать – подробно написано в доках. По умолчанию уже есть юнит server. крайне не рекомендуется его удалять, т.к. после этого почему то невозможно подулючиться к системе через telnet. Итак создаем юниты

    processor:0#unit host name client1 ip 192.168.1.11 password cl1_pass sys-allow acct-policy ip www icq proxy
    parse: unit host 022175 created
    parse: host 022175 name set: client1
    parse: host 022175 ip set: 192.168.1.11
    parse: Unit host 022175 password set: cl1_pass
    parse: unit 022175 acct policy ip added
    parse: unit 022175 acct policy www added
    parse: unit 022175 acct policy icq added
    parse: unit 022175 acct policy proxy added
    processor:0#unit host name client2 ip 192.168.1.12 password cl2_pass sys-allow acct-policy ip www icq proxy
    processor:0#unit host name clienе3 ip 192.168.1.13 password cl3_pass sys-allow acct-policy ip www icq proxy

    Создаем юнит с именем client1 с привязанным к нему ип 192.168.1.1 паролем cl1_pass с разрешением применять всякие гадости к данному юниту (sys-allow) и политиками учета ip www icq proxy. Аналогично и два других юнита.
    Основную задачу мы выполнили. Начиная с этого момента netams считает траффик.

    4.7 Сервис quota

    Сервис quota занимается обрубание траффика у слишком зарвавшихся юзверей :).
    Синтаксис команд. Пример для настройки

    >service quota
    parse: creating service quota:0
    quota:0#policy ip
    parse: default policy is set to ip
    quota:0#set name client1 policy ip active month 500M in
    parse: Creating quotadata to unit client1 , policy ip
    parse: unit 022175 quota is set to ACTIVE

    Задаем квоту для client1 размером 500мб в месяц входящего траффика. Аналогично и с другими юзерами.
    При достижении им 500 мегабайт интернет у него отвалится (какая жалость :))

    4.8 Сервис html

    Сервис html отвечает за создание страничек html со статистикой.
    Подробная настройка.

    >service html
    parse: switching to service html:0 for configuring
    html:0#path /var/www/traffic
    parse: html path is set to /var/www/traffic
    html:0#htaccess yes
    parse: html service will manage Apache .htaccess and .htpasswd files
    html:0#client-pages all
    parse: html client pages creator: all pages
    html:0#account-pages all
    parse: html account pages creator: all pages
    html:0#display-health yes
    parse: html service will display system health

    Говорим создавать странички со статистиков в папке /var/www/traffic (где обычно они доступны через web-сервер), создавать файлы .htaccess (чтобы каждый клиент смотрел только свой траффик по своему паролю), создавать странички для клиентов, создавать странички для биллинга (он должен быть настроен), и отображать информацию о состоянии системы (ее загрузке). ВНИМАНИЕ!!! для тех у кого apache запущен в chroot’ed среде. путь к файлу паролей для страничек с .htaccess строится абсалютным образом и поэтому апач его находить не будет, что приведет к тому что на статистику не сможет зайти никто. Тут два варианта – или netams запускать в той же chroot что и апач или делать линк на файл .htpasswd

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

    Автор: Demige
    Иллюстрации: gumanoed

    Просмотров новости: 3 136  <, , >


    -->