Home FreeBSD FreeBSD Траффик
FreeBSD Траффик

ipacctd - подсчёт траффика через IPFW

E-mail Печать PDF

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)

E-mail Печать PDF

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-трафиком (минимальная настройка)

E-mail Печать PDF

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.

  • Вопросы по поводу написанных статей можно обсудить в нашем сообществе в Вконтакте / Questions about written articles can be discussed in our community in Vkontakte Вопросы по поводу написанных статей можно обсудить в нашем сообществе в  Вконтакте / Questions about written articles can be discussed in our community in Vkontakte
Яндекс.Метрика