ipacctd - подсчёт траффика через IPFW
11.10.2006 04:12
Администратор
ipacctd - подсчёт траффика через IPFW
Автор: lissyara. Оригинал: http://www.lissyara.su/articles/freebsd/traffic_count/ipacctd/
Купили новый сервант, на AMD64 - (AMD - форева!) - под архивацию пользовательских документов, и прочего подобного хламу. Накатил на него, разумеется, фряху - 6-ю версию, платформа - x64. В-общем-то всё хорошо, но, как оказалось некоторые злостные программеры пишут строго под определённую архитектуру - x86 и всё тут... Первым таким приложением стал trafd - он компилился, запускался, но вот вместо статистики в файлы сохранялся какой-то бред... Пересобрал - бесполезно... Тогда собрал пакет на другой машине, тоже 6-я FreeBSD, но x86. Раскатал на AMD64 - не запускается... Что и ожидал (однако где-то в глубине души копошилась надежда - вдруг поднимется :))). Полез в порты - искать чем считать. Нашёл - bpft, сайт проекта мёртв, но вещщь родственная trafd. К сожалению родство оказалось слишком близким - у них одна наследственная болезнь - бред в логах. Снёс, полез дальше. Нашёл - ipacctd - сайт не указан.... Фомат логов очень похож на тот, что у trafd - потому переделки будут мелкими. Ставим из портов:/usr/home/lissyara/>cd /usr/ports /usr/ports/>make search name=ipacctd Port: ipacctd-1.46_1 Path: /usr/ports/net-mgmt/ipacctd Info: IP accounting using divert socket Maint:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
B-deps: R-deps: WWW:
/usr/ports/>cd /usr/ports/net-mgmt/ipacctd /usr/ports/net-mgmt/ipacctd/>make && make install && make clean
Программа абсолютно копеечного размера (15кб), но самый главный плюс оказался не в этом - если у Вы удосужились прикрутить русский язык к консоли, то сможете лицезреть ман по этой программе на русском :) Собственно по этой причине не буду расписывать ключи, и прочее. Работает через IPFW - пришлось пересобрать ядро и поднять файрволл. Извращаться особо не стал, забил совсем немного правил - машина с одним интерфейсом, смотрящим в локалку: /etc/rc.firewall#!/bin/sh -xv
# переменные FwCMD="/sbin/ipfw"
${FwCMD} -f flush
${FwCMD} add divert 10001 ip from any to any via sk0 ${FwCMD} add divert 10002 ip from any to any via lo0 #${FwCMD} add deny ip from not 192.168.0.0/16 to me ${FwCMD} add allow ip from any to any
Учтите, что правила надо добавлять в самом верху файрволла до остальных (сразу после -f flush). Также добавляем следующие строки в /etc/rc.conf (для двух интерфейсов - lo0 и sk0)ipacctd_enable="YES" ipacctd_flags="-v" ipacctd_rules="sk0 lo0" ipacctd_rule_sk0_flags="-p 10001 -f /var/log/traffic_sk0.log" ipacctd_rule_sk0_pid="/var/run/ipacctd.sk0" ipacctd_rule_lo0_flags="-p 10002 -f /var/log/traffic_lo0.log" ipacctd_rule_lo0_pid="/var/run/ipacctd.lo0"
После чего запускаем ipacctd:/usr/local/etc/rc.d/>./ipacctd.sh start
и перезагружаем правила файрволла:/usr/local/etc/rc.d/>sh /etc/rc.firewall > /dev/null & [1] 16480 /usr/local/etc/rc.d/> [1] Done sh /etc/rc.firewall > /dev/null /usr/local/etc/rc.d/>
Всё. Траффик считается. Осталось привенуть скрипт, который, будет всё это складывать в БД. Я чуть-чуть модифицировал свой скрипт, написанный для trafd:#!/bin/sh -xv # # ########## Вводим данные для подключения к MySQL серверу ################## # IP адрес MySQL сервера IP_MySQL_servera="localhost" # Имя пользователя для доступа к БД в которой храниться траффик username="ipacctd" # Пароль пользователя MySQL user_passw="ipacctd" # Имя базы данных db_name="ipacctd"
##########
# Сегодяшний день day="`date +%Y-%m-%d`" # Текущий год year="`date +%Y`" # Текущий месяц month="`date +%m`" # Текущее время (секунды специально сделаны 00 - иногда cron запускает скрипт не # в 00 секунд а позже (максимум что я видел - в 13), если машина очень загружена - # как итог в логах начинает фигурировать разное число секунд. # Мне это непонравилось :) curr_time="`date +%H:%M:00`" # Директория в которой будут храниться текстовые файлы с логами trafd NewDir="/var/traffic/${year}/${month}" # Пытаемся создать эту самую директорию на случай если это первый запуск # или произошла смена месяца (года) mkdir -p ${NewDir} # Ну и топаем туда cd ${NewDir}
# Местоположение исполняемого файла клиента MySQL mysql="/usr/local/bin/mysql" # Префикс для команд (лень же каждый раз набивать параметры подключения) sql_preffix="${mysql} --host=${IP_MySQL_servera} \ --user=${username} --password=${user_passw} --database=${db_name}"
# Считываем все переменные из файла /etc/rc.conf с целью извлечь оттуда # строчку с названиями интерфейсов по которым работает trafd # (У меня три сетевых платы и lo0 - просто интереса ради) . /etc/rc.conf
# Сохраняем статистику по всем интерфейсам # sleep введён по причине, что иногда не успевает траффик # в текстовый файл сохраниться - подумываю ещё sync воткнуть killall -1 ipacctd && sleep 1
# Для всех интерфейсов выковырнутых из rc.conf (висят в ${trafd_ifaces}) # выполняем один и тот же набор действий по разбору логов и запихиванию # их в базу данных for iface in ${ipacctd_rules} do
# Дозаписываем логи в текстовый файл (пусть лежат на всякий случай...) echo '' >> /var/log/traffic_${iface}.log cat /var/log/traffic_${iface}.log >> ${NewDir}/summary.${iface} # Далее - загоняем траффик в БД # ${sql_preffix} --execute="CREATE TABLE \`traffic_tmp\` \ (\`date\` DATE NOT NULL, \`time\` TIME NOT NULL, \ \`from_IP\` CHAR(16) NOT NULL, \`port_from_IP\` CHAR(8) NOT NULL, \ \`to_IP\` CHAR(16) NOT NULL, \`port_to_IP\` CHAR(8) NOT NULL, \ \`protocol\` ENUM('icmp','tcp','udp') NOT NULL, \`bytes\` CHAR(16) NOT NULL, \ \`paketov\` CHAR(16) NOT NULL) TYPE=MyISAM COMMENT='tmp_table'" 2>/dev/null
########### Лопатим данные для интерфейса ${iface} ##################### # Очищаем временную таблицу ${sql_preffix} --execute="DELETE FROM \`traffic_tmp\`" # Построчно превращаем файл со статистикой в набор переменных cat /var/log/traffic_${iface}.log | { while read stroka do from_IP=`echo "${stroka}" | awk '{print $1}'` port_from_IP=`echo "${stroka}" | awk '{print $2}'` to_IP=`echo "${stroka}" | awk '{print $3}'` port_to_IP=`echo "${stroka}" | awk '{print $4}'` protocol=`echo "${stroka}" | awk '{print $5}'` bytes=`echo "${stroka}" | awk '{print $6}'` paketov=`echo "${stroka}" | awk '{print $7}'` # Загоняем полученный набор во временную таблицу ${sql_preffix} --execute="insert into \`traffic_tmp\` (date, time, from_IP, \ port_from_IP, to_IP, port_to_IP, protocol, bytes, paketov) \ values ('${day}', '${curr_time}', '${from_IP}', \ '${port_from_IP}', '${to_IP}', '${port_to_IP}', \ '${protocol}', '${bytes}', '${paketov}')" done } # Стираем пустые строки (а вот откуда они вылазиют я так и непонял....) ${sql_preffix} --execute="DELETE FROM \`traffic_tmp\` WHERE from_IP='' AND \ port_from_IP='' AND to_IP='' AND port_to_IP='' AND protocol=''" # Стираем строки в которых полное число байт (вместе с технической инфой) # равно нулю (тоже непойми откуда берутся - раз в статистику trafd попали - # значит соединение было и байты должны были б быть...) ${sql_preffix} --execute="DELETE FROM \`traffic_tmp\` WHERE paketov='0'" # Создаём таблицу для окончательного хранения траффика # (на тот случай если она не создана - хотя конечно тоже дурацкий вариант - # пытаться создать таблицу при каждом запуске скрипта, но другой вариант - # проверять существование и если нету её - то создавать. А какая разница? Так # как сделано сейчас - проще и менее ресурсоёмко) ${sql_preffix} --execute="CREATE TABLE \`${iface}_${year}\` \ (\`date\` DATE NOT NULL, \`time\` TIME NOT NULL, \ \`from_IP\` CHAR(16) NOT NULL, \`port_from_IP\` CHAR(8) NOT NULL, \ \`to_IP\` CHAR(16) NOT NULL, \`port_to_IP\` CHAR(8) NOT NULL, \ \`protocol\` ENUM('icmp','tcp','udp') NOT NULL, \`bytes\` CHAR(16) NOT NULL, \ \`paketov\` CHAR(16) NOT NULL) TYPE=MyISAM COMMENT='База \ данных траффика по (${iface}) интерфейсу за ${year} год'" 2>/dev/null # Перекидываем траффик из временной таблицы в окончательную, при этом # объединяем строки в которых совпадает ВСЁ кроме числа байт. ${sql_preffix} --execute="INSERT INTO \`${iface}_${year}\` (date, time, from_IP, \ port_from_IP, to_IP, port_to_IP, protocol, bytes, paketov) \ SELECT date, time, from_IP, port_from_IP, to_IP, port_to_IP, \ protocol, sum(bytes) as bytes, sum(paketov) as paketov FROM \ traffic_tmp GROUP BY date, time, from_IP, port_from_IP, to_IP, \ port_to_IP, protocol"
# Очищаем файл c логами о том когда и по какому интерфейсу сохранялась статистика cat /dev/null > /var/log/traffic_${iface}.log
done
Доработки минимальны - изменилась команда сохранения траффика, и одна колонка сменилась - вместо `all_bytes` стало `paketov`... После чего пихаем скрипт в планировщик - я всунул его на запуск раз в минуту (все звёздочки, кроме команды)...
P.S. По прошествии нескольких дней обратил внимание, что в моменты пиковой загрузки (когда всех припёрло лезть в инет) скрипт работает долго - 20-30 секунд на нененагруженной машине... Пару раз, когда машина была загруженна, даже не успевал отработать. Причина нашлась быстро - сильно возросло число строк в логах - trafd все порты больше 10000 обзывал client а ipacctd честно их писал... Подумавши, настругал такой скрипт на перл:#!/usr/bin/perl -w
# вводим переменные # MySQL - хост где БД $db_host = 'localhost'; # MySQL юзер $db_user = 'ipacctd'; # MySQL пароль $db_password = 'ipacctd'; # MySQL база данных $db_database = 'ipacctd'; # подрубаем модуль для работы с MySQL use Mysql; # время - тока чтоб год достать... use Time::localtime;
# достаём время # Год $year = localtime->year() + 1900; # Месяц (идиотский язык, чтобы достать месяц в виде # двузначного числа приходиться изгаляться через жопу...) # Если знаете способ лучше - подскажите, поменяю... $month = `date '+%m'`; $month = substr($month,0,2);
# Коннектимся к MySQL $dbh = Mysql->Connect($db_host,$db_database,$db_user,$db_password);
# Вызываем внешние программы по сохранению траффика system("killall -1 ipacctd && sleep 2");
#use strict; if(open(RC_CONF,"/etc/rc.conf")){ my @data = reverse <RC_CONF>; chomp @data; close RC_CONF; foreach my $str (@data) { # разбираем rc.conf next if $str =~ /^#/ or $str =~ /^\s*$/; $str =~ /^\s+/; $str =~ /\s+$/; my($var_name,$var_value) = split(/=/, $str); if($var_name eq 'ipacctd_rules') { $var_value =~ s#^\s*(['"]?)(.*)\1#$2#; foreach my $interface (split (/\s+/, $var_value)) { # шуршим по интерфейсам # Создаём таблицу для постоянного хранения траффика # строим кверю к MySQL $MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "`( `unic_id` INT(16) NOT NULL auto_increment, `date` DATE NOT NULL, `time` TIME NOT NULL, `unix_time` INT(12) NOT NULL, `from_IP` CHAR(16) NOT NULL, `port_from_IP` INT(8) NOT NULL, `to_IP` CHAR(16) NOT NULL, `port_to_IP` INT(8) NOT NULL, `protocol` CHAR(12) NOT NULL, `bytes` INT(16) NOT NULL, `paketov` INT(8) NOT NULL, PRIMARY KEY (`unic_id`), KEY `date`(`date`), KEY `unix_time`(`unix_time`) ) ENGINE=MyISAM COMMENT='Traffic for " . $interface . "-interface'"; # Делаем запрос к БД, если неудачный - помираем с ошибкой $dbh->Query("$MySQL_query") or die $Mysql::db_errstr; # строим путь к файлу с траффиком $file_path = "/var/log/traffic_" . $interface . ".log"; # открываем файло open TRAFFIC,"$file_path"; # Разбираем построчно while (<TRAFFIC>) { # убираем лишние пробелы #tr/\s+/ /s; # Разбиваем по пробелам на переменные ($from_IP,$port_from_IP,$to_IP,$port_to_IP,$protocol, $bytes,$paketov) = split(/\s+/,$_); # пихаем траффик в БД
$MySQL_query = "INSERT INTO `" . $interface . "_" . $year . "` (`date`,`time`,`unix_time`,`from_IP`,`port_from_IP`,`to_IP`, `port_to_IP`,`protocol`,`bytes`,`paketov`) VALUES (DATE(NOW()), TIME(NOW()),UNIX_TIMESTAMP(),'" . $from_IP . "', '" . $port_from_IP . "','" . $to_IP . "','" . $port_to_IP . "', '" . $protocol . "','" . $bytes . "','" . $paketov . "')"; # Делаем запрос к БД, если неудачный - помираем с ошибкой $dbh->Query("$MySQL_query") or die $Mysql::db_errstr; } # создаём директории system("mkdir -p /var/traffic/" . $year . "/" . $month); # переносим траффик $otkuda = "/var/log/traffic_" . $interface . ".log"; $kuda = "/var/traffic/" . $year . "/" . $month . "/summary." . $interface; system("cat $otkuda >> $kuda"); # очищаем файло system("cat /dev/null > $otkuda");
# создаём таблицу, где будет храниться траффик
} } } }
# выходим 1;
Он прекрасно заменяет тот же шелловый скрипт. Тока работает раз в 10-15 быстрей :))) Также есть и нововведения (колонка unix_time и unic_id) - понадобились для работы. Если заменять существующий shell скрипт колонку unix_time надо добавить, а если с нуля - то сам всё создаст. Также убрана временная таблица. Тут она не нужна.
P.S. Ненавижу перл.
Обновлено 28.05.2010 12:34
|
NeTAMS - продолжение (login, bandwith, quota)
11.10.2006 02:15
Администратор
N
NeTAMS - продолжение (login, bandwith, quota)
Автор: schizoid. Оригинал: http://www.lissyara.su/articles/freebsd/traffic_count/netams_bad_3/
Итак, продолжим про НеТАМС. 1. Ограничение скорости в НеТАМС. При установки нетамса, появляется примерно такое окошко#make install Options for netams 3.4.0.r2 [ ] DEBUG Build with debug symbols [ ] BW Build with bandwidth limitation functionality [ ] HASH Build with HASH support
Здесь ставим галочку на против строки BW Build with bandwidth limitation functionality . Если честно, то я так не пробовал. Когда я ставил на сервак, этой опции еще не было, а пересборка производилась таким путем:make distclean && FLAGS=-DHAVE_BW make
Но думаю, что с включенной опцией оно уже умеет делать правильно. Итак нетамс собрался. (Более подробно по начальной настройке нетамса читайте в предыдущей статье).
Из всего конфига нас интересует сервис processor. !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!!service processor lookup-delay 30 flow-lifetime 180 policy oid 0B4940 name ip target proto ip restrict all drop local pass [unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip] unit host oid 033333 name server ip 193.16.хх.хх [unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.20" email
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
password 123 bw 256.000K acct-policy ip] [unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.141" password 123 bw 256.000K acct-policy ip] [unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.21" password 123 bw 256.000K acct-policy ip] [unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.2" password 123 bw 256.000K acct-policy ip] [unit host oid 000005 name TEAC ip 10.0.0.5 description "ip 192.168.10.18" password 123 bw 256.000K acct-policy ip]
Как видим, ограничение скорости включается весьма просто, простым добавлением bw 256.000K. Так же есть возможность организации асинхронного канала ([bw { speed in speed out | speed } ]). Например: !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!![unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.20" email
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
password 123 bw 256.000K in 128.000K out acct-policy ip]
Вот собственно и все.
2. Сервис квота в НеТАМС.Основные свойства: 1. Хранение информации о квотах клиентов в базе SQL. В настоящий момент поддерживается MySQL и Postgres. 2. Возможность задания политики учета (контроля), параметров оповещения по умолчанию. 3. Возможность задания всех параметров квот по трафику индивидуально для каждого юнита. Это величины входящего, выходящего и суммарного трафика начиная с момента начала часа, дня, недели и месяца. 4. Возможность задания порога "мягкого срабатывания" в процентах от "жесткой" квоты индивидуально для каждого юнита. 5. Возможность гибкого управления параметрами оповещения при срабатывании и возвращении квоты.
Сервис квота в конфиге включается строчками:service quota policy ip notify soft {owner} notify hard {owner} username notify return {owner}
Опишем опции. policy ip - Задает политику учета (acct-policy), которая будет использоваться при проверке квот. Это политика по умолчанию для всех, существует возможность переопределить ее для конкретного юнита. Если не указано, используется первая политика из определенных policy XXX сервиса processor. Секции notify задают кому будет слаться оповещение о превышении квоты (soft - мягкая квота, hard - жестакая квота,return - восстановление работы, когда период действия квоты закончился). Нужно что бы в описании юнита присутствовал его e-mail (опция email
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
). Здесь {owner} - владелец юнита, username - имя или OID пользователя (администратора). Далее, задаем квоту:netamsctl "service quota && set name eugene policy ip day 5M sum && exit"
Здесь мы задали юниту eugene суммарную дневную квоту в 5Мб при полиси ip. Здесь я не все опции показал, многие из них установлены по-умолчанию:soft_treshold 80 - порог мягкой квоты delay 10 - Интервал времени между периодическими проверками всех юнитов на наступление момента рабатывания квоты. Задается в секундах. notify_soft 1 - сообщение шлется владельцу юнита notify_hard 1 - сообщение шлется владельцу юнита notify_return 1 - сообщение шлется владельцу юнита
Также можно указать и другие временные интервалы ([hour ... ], [day ...], [week ...], [month ...]), amount - значение квоты (в байтах, но можно использовать модификаторы K, M, G), {in|out} - направление квотируемого трафика, {sum} - суммарный трафик (в обоих направлениях).
Просмотреть установленную квоту можно либо на страничке статистики (только для админа), либо командой netamsctl "show quota".
Отменить установленную квоту можно так:netamsctl "service quota && set name eugene poliсy ip day 0 sum && exit"
Вот и все.
3. Сервис login. В кратце - это веб-морда для пользователя, с помощью которой он может заблокировать/разблокировать свой аккаунт. Настраивается так:service login storage 1 set no name eugene password 123456 inact 3000 abs 0 relogin yes
При рестарте нетамса, создастся еще одна таблица в базе netams. Здесь опции: unit_oid - Идентификатор (OID) юнита, является уникальным ключом к базе данных password - Пароль пользователя. Никогда не пытайтесь поменять его извне программы путем прямой записи в SQL. inact - Величина таймаута неактивности для данного пользователя abs - Величина абсолютного таймаута для данного пользователя last_changed - Время (в формате UNIXTIME) последнего изменения записи last_opened_time - Время (в формате UNIXTIME), когда был в последний раз предоставлен доступ юниту last_opened_ip - IP-адрес, с которого был предоставлен доступ юниту last_opened_mac - MAC-адрес, с которого был предоставлен доступ юниту def_state - Режим доступа этого юнита по умолчанию (например, сразу после старта программы). 0 означает отсутствие доступа, 1 означает разрешения доступа. curr_state - Текущий режим доступа этого юнита. 0 означает отсутствие доступа, 1 означает разрешения доступа. К сожалению, по наступлении таймаута не сбрасывается (баг).
Теперь настраиваем апач для понимания cgi скриптов:LoadModule cgi_module libexec/apache2/mod_cgi.so ... ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory "/usr/local/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> ... AddHandler cgi-script .cgi AddHandler cgi-script .pl
Перегружаем апач. Далее идем в /usr/ports/net-mgmt/netams/work/netams-х.х.х/cgi-bin (правда если не делали clean при установке, иначе нуно будет залезть внуть пакета). Тут нам понадобятся 3 файла:-rwxr-xr-x 1 root wheel 479 16 фев 02:13 config.cgi -rwxr-xr-x 1 root wheel 3707 16 фев 02:30 login.cgi -rwxr-xr-x 1 root wheel 3267 21 июн 2005 netams_api.pl
Копируем все это счастье в /usr/local/www/cgi-bin-dist, и подправляем под свою конфигурацию. А именно:# #----------------------------------------------------------------------------- # $Id: config.cgi,v 1.5 2005/04/06 16:21:49 anton Exp $
# Data required to do a script login, change this # login to netams $sc_host="localhost"; $sc_port=20001; $sc_user="LOGIN"; $sc_passwd="PASSWORD";
#login to database $mysql_host="localhost"; $mysql_login="netams"; $mysql_password="PASSWORD"; $mysql_dbname="netams";
#log events $log_to_events="yes";
#URL to statistic $statistic_url="/stat";
Ну в прнципе и все. Еще в login.cgi есть описание картинки, которая отображается в веб-морде. Там можно изменить путь к любой своей картинке, подходящей по размеру ;). Я заменил на свою:<tr align=center><td width=100%><img src="/stat/images/logo_sm.jpg" width="376" height="60" alt="" border="0" align=left>
Ну вот вроде и все, пробуем заходить по адресу http://my.domen.ru/cgi-bin/login.cgi с логином/паролем, что указаны в set no name eugene password 123456 inact 3000 abs 0. Т.е. логин admin, пароль 123456.
Должно все получиться, иначе смотрим логи апача :)
P.s.: есть мысль сделать доступ к веб-морде по протоколу https, но пока не доходят руки. Когда дойдут - опишу ;)
P.p.s: выяснилось, что веб-мордие от версии 3.4.0 не работоспособно, берите или от версии 3.3.5 или 3.4.1. P.p.p.s: Синтаксис выше приведенных команд касается NeTAMS версии 3.3.5. Для 3.4.х он немного отличается.
Обновлено 28.05.2010 18:18
NeTAMS, многофункциональная программа по учету и управлению IP-трафиком (минимальная настройка)
30.09.2006 17:06
Администратор
NeTAMS, многофункциональная программа по учету и управлению IP-трафиком (минимальная настройка)
Автор: schizoid. Оригинал: http://www.lissyara.su/articles/freebsd/traffic_count/netams/
Итак. Вступление. Начало возьмем с оф. сайта данной программы, а именно http://www.netams.com
NeTAMS (Network Traffic Accounting and Monitoring Software) - многофункциональная программа по учету и управлению IP-трафиком для маршрутизаторов Cisco или компьютеров под управлением Unix (Linux/FreeBSD/Solaris). Поддерживаются различные методы сбора статистики (tee/divert/ip_queue/ulog/libpcap/netflow v5 и v9/netgraph), хранения в базе данных (BerkleyDB/MySQL/PostgresSQL/Oracle/Radius), агрегирования, отображения, оповещения и пр. Возможно проводить блокировку на базе квот, авторизации, исчерпании баланса (биллинг); управлять полосой пропускания, контролировать подмену MAC-адреса, делать связь с RADIUS, создавать гибкие политики учета и фильтрации.
Хочу описать минимальную настройку этой программы, потому что часто после ее упоминания на форуме, народ в аське просит помочь ее настроить. Хотя есть и оф. доки...им этого мало. Ладно, приступим.
Еще раз повторюсь - это пример минимальной настройки! На самом деле прога может много, о чем можно почитать тут: http://netams.com/doc/index.html.
Еще один нюанс. У меня Нетамс стоит уже более 2-х лет, и версия 3.3.5, на сайте же уже доступна последняя стабильная версия: 3.4.1rc1. Т.к. момент установки я уже не помню, то я поднял виртуальную машину, на которую поставил минимум чего нужно для установки нетамса, поднял его на ней, а уже конфиг и т.д. беру со своего боевого сервака. Т.к. настройка минимальна, то конфиг от более старой версии программы прокатит и на новую.
В качестве базы данных я использую mysql, для заворота трафика на нетамс использую divert в ipfw, поэтому у вас должен быть настроено ядро как минимум с такими опциями:options IPFIREWALL options IPDIVERT
Итак, mysql-server5.0 и клиент поставились, попробуем начать установку нетамса...чего ему не хватит... Идем в cd /usr/ports/net-mgmt/netams/ # cat distinfo MD5 (netams-3.4.0rc2.tar.gz) = 3093e50f8ee7a297cb8c2bc6bacd0666 SHA256 (netams-3.4.0rc2.tar.gz) = 7cbfdefa94f075a5dab40613d25738c0e2e40652638338b52632a0efdbc4f68e SIZE (netams-3.4.0rc2.tar.gz) = 375729
Ага, в портах версия 3.4.0rc2. Ну да Бог с ним. У мну то на самом деле еще моложе :) #make install Options for netams 3.4.0.r2 [ ] DEBUG Build with debug symbols [ ] BW Build with bandwidth limitation functionality [ ] HASH Build with HASH support
Среди прочих присутствует опция BW Build with bandwidth limitation functionality
С ее помощью можно будет ограничивать скорость пользователям самим нетамсом. Раньше я ее использовал, потом отказался в сторону pipe в ipfw. Далее, ставим по-умолчанию. Что-то долго не мог найти пакет. Но в итоге нашел и все установил:The NeTAMS package has been successfully installed.
Check /usr/local/share/netams and http://www.netams.com for examples.
A sample configuration file has been installed to /usr/local/etc as "netams.cfg.sample". This may be renamed to "netams.cfg" and edited.
In order to use the netamsctl programs, you may copy /usr/local/share/netams/.netamsctl.rc to your home directory and edit it.
By default, CGI scripts are NOT installed, as well as web server is NOT configured. You should do it yourself, and then copy entire /usr/local/share/netams/cgi/ directory to appropriate place.
And PLEASE READ THE DOCUMENTATION FIRST! http://www.netams.com
-------------------------------------------------------------------------- ===> Installing rc.d startup script(s) ===> Compressing manual pages for netams-3.4.0.r2 ===> Registering installation for netams-3.4.0.r2 ===> SECURITY REPORT: This port has installed the following files which may act as network servers and may therefore pose a remote security risk to the system. /usr/local/libexec/netams /usr/local/sbin/ipfw2netflow
This port has installed the following startup scripts which may cause these network services to be started at boot time. /usr/local/etc/rc.d/netams
If there are vulnerabilities in these programs there may be a security risk to the system. FreeBSD makes no guarantee about the security of ports included in the Ports Collection. Please type 'make deinstall' to deinstall the port if this is a concern.
For more information, and contact details about the security status of this software, see the following webpage: http://www.netams.com/
Ну что ж далее по-порядку.[root@ /usr/ports/net-mgmt/netams]# cd /usr/local/etc/ [root@ /usr/local/etc]# cp netams.cfg.sample netams.cfg [root@ /usr/local/etc]# ee netams.cfg
Конфиг по-умолчанию такой: !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!!#NeTAMS version 3.4.0 (template config) #begin #global variables configuration debug none user name admin real-name Admin password aaa email root@localhost permit all
#services configuration
service server 0 login local listen 20001 max-conn 6
service processor 0 lookup-delay 60 flow-lifetime 180 policy name ip target proto ip policy name www target proto tcp ports 80 81 8080 3128 policy name mail target proto tcp ports 25 110 restrict all pass local pass unit group name CLIENTS acct-policy ip www mail unit host name server ip 192.168.0.1 acct-policy ip www mail [unit user name client1 ip 192.168.0.10 parent CLIENTS email
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
acct-policy ip www mail] unit net name LAN ip 192.168.0.0/24 acct-policy ip www mail storage 1 all
service storage 1 type mysql
service data-source 1 type libpcap source eth0 rule 11 "ip"
service quota 0 policy ip notify soft {owner} notify hard {owner} admin notify return {owner} storage 1
service alerter 0 report oid 06100 name rep1 type traffic period day detail simple smtp-server localhost
service html 0 path /usr/local/www/stat run 10min htaccess yes client-pages all url http://192.168.0.1/stat/ language ru
service scheduler oid 08FFFF time 10min action "html"
# $Id: netams.cfg,v 1.12 2006-12-29 18:44:52 anton Exp $ #end
Я пока оставил его таким, ничего не меняя. Далее делаемecho "netams_enable=\"YES\"" >> /etc/rc.conf
стартуем и проверяем нетамс[root@ /usr/local/etc]# /usr/local/etc/rc.d/netams start Starting netams. [root@ /usr/local/etc]# sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root netams 15866 4 tcp4 127.0.0.1:20001 *:* mysql mysqld 15154 10 tcp4 *:3306 *:* root sendmail 631 3 tcp4 127.0.0.1:25 *:* root sshd 625 4 tcp4 *:22 *:* root syslogd 500 7 udp4 *:514 *:*
и того у нас все гут. Далее делаем все по документации. Мы видим, что нетамс у нас слушается на 20001-м порту. В конфиге выше была строка:user name admin real-name Admin password aaa email root@localhost permit all
из нее видно что админ нетамса у нас пользователь по имени admin, и пароль его aaa. заходим телнетом на 20001-й порт[root@ /usr/local/etc]# telnet 127.0.0.1 20001 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. NeTAMS 3.4.0 (3146.1) root@ / Mon Feb 25 01:38:51 UTC 2008
Username: admin Password:
Далее как гласит дока, пробуем выполнить команды "html", "save", "show version", "show config". > html
> save
> show version NeTAMS 3.4.0 (3146.1) root@ / Mon Feb 25 01:38:51 UTC 2008 Run time 1 mins 51.1777 secs System time: 1 mins 0.3991 secs Average CPU/system load: 0.36% Process ID: 15866 RES: 3868K Memory allocated: 597212 (108), freed (22) (0 NULL) [86 used] Total objects: Oids used: 9 NetUnits: 4 Policies: 3 Services: 10 Users: 1 Connections: 1 active, 1 total
Services info: Storage ID=1 type mysql wr_q 0/7 rd_q 0/0 Data-source ID=1 type LIBPCAP source eth0:0 loop 0 average 0 mcsec Perf: average skew delay 0 mcsec, PPS: 0, BPS: 0 Alerter 0 queue max: 255, current: 0 Scheduled tasks: 1
> show config #NeTAMS 3.4.0 (3146.1) root@ / Mon Feb 25 01:38:51 UTC 2008 #configuration built Mon Feb 25 01:45:38 2008 #begin #global variables configuration debug none language ru user oid 06260D name admin real-name "Admin" crypted $1$$HpXmjtul/3i1.bf.B27bU. email root@localhost permit all
#services configuration
service server 0 login local listen 20001 max-conn 6
service processor lookup-delay 60 flow-lifetime 180 policy oid 00D9B2 name ip target proto ip policy oid 09DC4B name www target proto tcp port 80 81 8080 3128 policy oid 07A20C name mail target proto tcp port 25 110 restrict all pass local pass unit group oid 099818 name CLIENTS acct-policy ip www mail unit host oid 03C6A3 name server ip 192.168.0.1 acct-policy ip www mail unit user oid 02D10B name client1 ip 192.168.0.10 email
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
parent CLIENTS acct-policy ip www mail unit net oid 01988F name LAN ip 192.168.0.0/24 acct-policy ip www mail
service storage 1 type mysql accept all
service data-source 1 type libpcap source eth0 rule 11 "ip"
service quota policy ip notify soft owner notify hard owner notify return owner
service alerter 0 report oid 06100 name rep1 type traffic period day detail simple smtp-server localhost
service html path /usr/local/www/stat run 10min url http://192.168.0.1/stat/ htaccess yes client-pages all account-pages none
service scheduler oid 08FFFF time 10min action "html"
#end
>
если все так как у меня, то ура, мы установили нетамс :) Далее я на всякий случай проверил, создал ли он базу.[root@ /usr/local/etc]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.0.51a FreeBSD port: mysql-server-5.0.51a
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | netams | | test | +--------------------+ 4 rows in set (0.01 sec)
mysql> use netams; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
Database changed mysql> show tables; +------------------+ | Tables_in_netams | +------------------+ | events | | oids | | quota | | summary | +------------------+ 4 rows in set (0.01 sec)
все хорошо. ну что ж , тогда можно вернуться на реальный сервак и продолжить на нем.
Кроме mysql нам понадобится еще настроенный web-server, я использую apache. С его помощью пользователи смогут смотреть статистику. Теперь выкладываю свой конфиг и рассказываю что и зачем. !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!!#NeTAMS version 3.3.5 (build 2916.1) compiled by
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
#configuration built Thu Nov 16 21:50:15 2006 #begin #global variables configuration debug none language ru [user oid 02A6F4 name admin real-name "Eugene" crypted $1$$1CXSo9ZU3rRh4yE2MnSlV0 email root@localhost permit all]
#services configuration
service server 0 login local listen 20001 max-conn 6
service processor lookup-delay 30 flow-lifetime 180 policy oid 0B4940 name ip target proto ip restrict all drop local pass [unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip ] unit host oid 033333 name server ip 193.16.хх.хх [unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.5" email eugene@localhost password 123 acct-policy ip ] [unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.18" password 123 acct-policy ip ] [unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.7" password 123 acct-policy ip ] [unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip ] [unit host oid 000005 name TEAC ip 10.0.0.5 description "ip 192.168.10.40" password 123 acct-policy ip ]
service storage 1 type mysql host localhost user LOGIN password PASSWORD accept all
service data-source 1 type ip-traffic source divert 199 layer7-detect urls
service login
storage 1 set no name eugene password 123456 inact 3000 abs 0 relogin yes
service monitor 0 monitor to file /usr/tmp/mon_netams.log monitor unit 000001 monitor unit 000002 monitor unit 000003 monitor unit 000004 monitor unit 000005
service quota policy ip notify soft {owner} notify hard {owner} 02A6F4 notify return {owner}
service alerter 0 report oid 06100 name rep1 type traffic period day detail simple smtp-server localhost
service html path /usr/local/www/data/stat run 5min url http://192.168.10.100/stat/ htaccess yes client-pages all account-pages all
service scheduler oid 08FFFF time 5min action "html"
#end
Итак, по-порядку. сперва меняем логин/пароль админа нетамса. !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!![user oid 02A6F4 name admin real-name "Eugene" password SUPERPASS email root@localhost permit all ]
пока он в открытом виде, после рестарта нетамса, но закриптуется. Также oid можно не ставить, Нетамс его сам поставит. Далееservice server 0 login local listen 20001 max-conn 6
Сильна расписывать не буду, т.к. все есть в доке. В кратце: нетамс слушает 20001-й порт, висит на локалхосте и имеет максимальное число одновременно открытых подключений к процессу 6.
Дальше: !!! Строки взятые в квадратные скобки [...] - нужно писать в одну строку !!!service processor lookup-delay 30 flow-lifetime 180 policy oid 0B4940 name ip target proto ip restrict all drop local pass [unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip ] unit host oid 033333 name server ip 193.16.хх.хх [unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.5" email eugene@localhost password 123 acct-policy ip ] [unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.18" password 123 acct-policy ip ] [unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.7" password 123 acct-policy ip ] [unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip ] [unit host oid 000005 name TEAC ip 10.0.0.5 description "ip 192.168.10.40" password 123 acct-policy ip ]
Основное, это сервис policy, определяет правило, или политику, по которой для данного объекта (NetUnit) будет производиться фильтрация или подсчет трафика. Т.к. я описываю минимальную конфигурацию, то я использую policy ip, т.е. подсчет всего трафика, не разбивая его по протоколам и портам (нетас это умеет). Строка restrict all drop local pass, говорит о том, что трафик с ИП-адресов не описанных в конфигурации нетамса пропускаться не будет. По-этому нужно включить и внешний ИП-самого сервера. далее, я создал один unit, описывающий сеть, а также описал каждого пользователя. Тут подсчет трафика идет по ip из сети 10.0.0.0/24. Опция description позволяет задать любое описание юнита, в моем случае, это ИП-машины пользователя (у меня пользователи имеют статический Ип из сети 192.168.10.0/24, а при подключении по впн им выдается ИП из диапазаона 10.0.0.0/24). Далее идет пароль доступа к страничке со статистикой, ну и указание каким policy мы ограничиваем пользователя, у меня всех ограничиваем полиси ip.
далее.service storage 1 type mysql host localhost user LOGIN password PASSWORD accept all
тут описывается собственно хранилище данных. Указываем, что мы используем базу данных mysql, что она находится на этом же хосте, что и нетамс (localhost), а так же указываем логин/пароль к базе нетамса (ведь от рута работать это не есть гут ;) )
Что бы установить логин/пароль для базы нетамса, заходим в mysql и даем команду:grant all privileges on netams.* to 'LOGIN'@'localhost' identified by 'PASSWORD';
дальшеservice data-source 1 type ip-traffic source divert 199 layer7-detect urls
описывается тип и источник данных. В нашем случает тип это ip-traffic, а источник, это divert 199. Т.е. что бы трафик попадал нетамсу, его нужно на него как-то завернуть, я использую правило divert в ipfw. Правила НАТа на НЕТАМС должны обязательно обрамлять правила, которым НАТится сеть в интернет. #NeTAMS-NAT-NeTAMS-out ${fwcmd} 1000 add divert 199 ip from 10.0.0.0/24 to any out xmit ${oif} ${fwcmd} 1100 add divert 8668 ip from 10.0.0.0/24 to any out xmit ${oif} #NeTAMS-NAT-NeTAMS-in ${fwcmd} 1195 add divert 8668 ip from any to me in recv ${oif} ${fwcmd} 1200 add divert 199 ip from any to 10.0.0.0/24 in recv ${oif}
далееservice monitor 0 monitor to file /usr/tmp/mon_netams.log monitor unit 000001 monitor unit 000002 monitor unit 000003 monitor unit 000004 monitor unit 000005
сервис monitor, тут я указал размещение файлика mon_netams.log, а так же для каких юнитов ведется сам монитор. Монитор - это лог кто куда ходил. Так же не забудьте описать ротирование этого файла, иначе он может занять все свободное пространство на разделе.
Сервис login и quota, я опишу в следующей статье. И последнийservice html path /usr/local/www/data/stat run 5min url http://192.168.10.100/stat/ htaccess yes client-pages all account-pages all
Сервис html, описывает странички статистики. Здесь мы указываем путь, куда их генерить, переодичность и url к ним. Так же описываем тип доступа, в данном случае, включен механизм htaccess, который позволяет разграничить доступ пользователям только к своим страницам статистики исходя из логина/пароля.
Теперь опишем секцию нетамса в апаче:<Directory "/usr/local/www/data/stat/"> AllowOverride All Options None Order deny,allow Allow from 192.168.10.66 192.168.10.97 192.168.10.45 192.168.10.5 192.168.10.18 Deny from all </Directory>
Тут так же с примером разграничения доступа к статистике по ИП-адресам. Далее делаем stop/start нетамсу, рестартуем апач. И через некоторое время ждем появления статистики по указанному url (http://192.168.10.100/stat/). Тут спросит логин/пароль админа. (если не хочется ждать, можно зайти телнетом и выполнить команду html). Для доступа пользователей к своей страничке идем по адресу: http://192.168.10.100/stat/unit, (где unit - имя пользователя в нетамсе).
Так же есть хорошая примочка у разработчиков. Чтобы каждый раз не ходить телнетом, есть так называемый netamsctl. netamsctl - примитивный telnet-клиент, позволяющий передать одну или несколько команд для работающего netams. Он работает через обычный TCP-сокет. Открывается соединение, отправляется команда, получается и выводится на экран ответ сервера. Итак настроим его.# whereis netamsctl netamsctl: /usr/local/bin/netamsctl /usr/local/man/man8/netamsctl.8.gz /usr/ports/net-mgmt/netams/work/netams-3.3.5/src/netamsctl
Замечательно, присутствует. В своем домашнем каталоге (пользователя, от которого будет выполняться) создаем файл .netamsctl.rc такого содержания:login=LOGIN password=PASSWORD host=localhost
ну и порт, если вы изменили дефолтовый. Далее работать примерно так:# netamsctl "show version" host: localhost port: 20001 login: LOGIN password: PASSWORD cmd: show version NeTAMS version 3.3.5 (build 2916.1)
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
/ Sun Jun 25 18:08:46 EEST 2006 Run time: 10 days 5 hours 57 mins 2.4393 secs System time: 5 hours 57 mins 35.4570 secs Average CPU/system load: 2.42% Process ID: 69168 RES: 3620K Memory allocated: 54495887 (1513554), freed (1503417) (0 NULL) [10137 used]
Total objects: Oids used: 75 NetUnits: 71 Policies: 1 Services: 12 Users: 3 Connections: 2 active, 49 total Scheduled tasks: 1 Alerter 0 queue max: 255, current: 0
Services info: Storage ID=1 type MYSQL wr_q 0/288146 rd_q 0/70 Data-source ID=1 type IP_FILT source divert:199 loop 111323580 average 5 mcsec Perf: average skew delay 115 mcsec, PPS: 154, BPS: 42560
Так же возможно задать на исполнение сразу несколько команд, если разделить их комбинацией " && ". Это крайне полезно, если необходимо передать команду какому-нибудь сервису: netamsctl "service processor && unit host name pupkin sys-deny && exit"
Разработчики рекомендуют все юниты заводить именно с помощью netamsctl, затем делать save. При этом нет необходимости рестартовать нетамс. У меня исторически сложилось так, что я описываю все в конфиге ручками. а затем рестартую нетамс. Мне так удобнее, например для бекапирования, или просто посмотреть предыдущую запись...в общем имхо :)
Обновлено 28.05.2010 12:19
|
|
|
|
Страница 2 из 2. |