Модуль для подсчета трафика в локальной сети.
Модуль получает данные о трафике от внешних коллекторов (trafd, ipcad, Cisco Netflow).
Получив данные от коллектора, система просматривает таблицу активных сессий (/ Monitoring/ Dialup / VPN/) и для них проводит подсчет трафика в зависимости от тарифного плана клиента. Модуль использует тарифные планы, описанные в модуле Dv (Dialup/VPN). Если данные о трафике не принадлежат ни одной из активных сессий, то они складываются в файл /usr/abills/abills2/var/log/ipn/unknown_ip.log при включённой опции UNKNOWN_IP_LOG.
Для получения данных и их подсчёта и складывания в базу используются следующие программы:
traffic2sqlСистема периодически запускает их из cron.
Авторизация пользователей: При открытии страницы браузером пользователи автоматически попадают на страницу авторизации и только после успешной авторизации могут пользоваться интернетом.
(В качестве примера используется машина под управлением FreeBSD)
# cd /usr/abills/libexec/ # ln -s ../Abills/modules/Ipn/trafdstats trafdstats # ln -s ../Abills/modules/Ipn/traffic2sql traffic2sql
Создать таблицы в базе.
# mysql -D abills < db/Ipn.sql
abills/libexec/config.pl
@MODULES = (
'Ipn'
);
Опции:
| $conf{IPN_DETAIL}=1; | Вести детальную статистику. |
|---|---|
| $conf{IPN_DETAIL_MIN_SIZE}=1024; | Задаёт минимальный размер пакета который будет попадать в детализацию. Данная опция предохраняет от замусоривания |
| $conf{IPN_STATIC_IP}=1; | Использовать только статические адреса. Система проверяет статические адреса клиентов и присваивает им траффик. Исключая таким образом потери из за переподключений при использовании динамических адресов авторизации. |
| $conf{IPN_FILTER}=»/usr/abills/libexec/ipn_filter.sh»; | Полный путь к программе, которая запустится, если у клиента заполнено поле Filter ID. Программе передаются следующие аргументы %STATUS (ONLINE_ENABLE,ONLINE_DISABLE,HANGUP) %LOGIN %IP %FILTER_ID в виде аргументов. Не забывайте, что при ручной активизации пользователя программа может выполняться с правами веб-сервера, поэтому лучше её запускать через sudo. Пример: abills/misc/ipn_filter.sh |
| $conf{IPN_DETAIL_CLEAN_PERIOD}=30; | Чистить лог детализации каждых 30 дней |
| $conf{IPN_USERMENU}=1; | Включить в пользовательском интерфейсе меню открытия доступа |
| $conf{IPN_CLUBMONITOR}=1; | Включить клуб монитор. Упрощённый интерфейс мониторинга активных сессий и меню создания карточек доступа |
| $conf{IPN_DEPOSIT_OPERATION}=1; | Снимать деньги модулем IPN. При включении этой опции деньги со счёта снимаются в реальном времени после каждого обновления статистики. |
| $conf{IPN_FW_FIRST_RULE}=20000; | Номер первого правила в брандмауэре |
| $conf{IPN_FW_START_RULE}=»« | Правила для открытия доступа. Программе всегда передаются следующие параметры: %IP - ип адрес %MASK - маска %NUM - номер правила ($conf{IPN_FW_FIRST_RULE} + (PORT или последняя цифра IP адреса) ) %LOGIN - Логин Примеры: FreeBSD »/usr/local/bin/sudo /sbin/ipfw -q delete %NUM; /usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from %IP to any; /usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from any to %IP»; Пример с шейпером $conf{IPN_FW_START_RULE}=»/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn up fxp1 %LOGIN %IP». ' > /dev/null 2>&1;'. »/usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from %IP to any; /usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from any to %IP»; Linux »/usr/bin/sudo /sbin/iptables -t nat -I PREROUTING 1 -s %IP/%MASK -j ACCEPT; /usr/bin/sudo iptables -I FORWARD 1 -s %IP -d 0/0 -j ACCEPT; /usr/bin/sudo iptables -I FORWARD 1 -s 0/0 -d %IP -j ACCEPT»; |
| $conf{IPN_FW_STOP_RULE}=»« | Правила для закрытия доступа. FreeBSD »/usr/local/bin/sudo /sbin/ipfw -q delete %NUM; /usr/local/bin/sudo /sbin/ipfw -q add %NUM deny ip from %IP to any; /usr/local/bin/sudo /sbin/ipfw -q add %NUM deny ip from any to %IP»; Пример с шейпером $conf{IPN_FW_STOP_RULE}=»/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn down fxp1 %LOGIN %IP». ' > /dev/null 2>&1;'. »/usr/local/bin/sudo /sbin/ipfw -q delete %NUM»; Linux »/usr/bin/sudo /sbin/iptables -t nat -D PREROUTING -s %IP/%MASK -j ACCEPT; /usr/bin/sudo iptables -D FORWARD -s 0/0 -d %IP -j ACCEPT; /usr/bin/sudo iptables -D FORWARD -s %IP -d 0/0 -j ACCEPT»; |
| $conf{IPN_FW_RULE_UID}=1; | Использовать UID (ID пользователя в системе) как префикс для создания правил разрешения доступа. Правила создаются следующим образом $conf{IPN_FW_FIRST_RULE} + UID. По умолчанию система в качестве префикса использует 4 байт IP адреса: для 192.168.10.23 - $conf{IPN_FW_FIRST_RULE} + 23. |
Для ОС FreeBSD обязательно включите следующие опции в ядро:
options IPFIREWALL options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_FORWARD options DUMMYNET options IPFIREWALL_VERBOSE options IPDIVERT
/ System configuration/ NAS/
| Type | ipcad |
|---|
/ System configuration/ NAS/ IP POOLs/
Нужно внести пул адресов, с которых можно авторизоваться.
Модуль использует тарифную логику модуля Dv (DialUp/VPN), соответственно для работы модуля нужно прописать тарифные планы в / System configuration/ Dialup / VPN/ Tarif plans/ . Не забудьте указать, какие сети считать, в противном случае траффик не будет попадать в счётчики.
/ Customers/ Logins/ Information/ Services/ IP Net/
| IP: | IP адрес клиента |
|---|---|
| NAS: | Сервер доступа. Автоматически выбирается из списка, если IP адрес клиента находится в пуле адресов NAS |
Программы сбора статистики для последующей ее обработки биллингом
http://bpft4.sourceforge.net/ Коллектор трафика для FreeBSD
# cd /usr/ports/net-mgmt/trafd/ # make # make install
/etc/rc.conf
trafd_enable="YES" trafd_ifaces="rl0"
/etc/crontab
*/5 * * * * root /usr/abills/libexec/trafdstats 1 rl0
http://www.splintered.net/sw/flow-tools/
Пакет утилит для работы с NetFlow потоками отправляемыми маршрутизаторами Cisco или Juniper.
# cd /usr/ports/net-mgmt/flow-tools # make # make install
Запускаем
flow-capture -S 5 -n 287 -N 0 -d 5 -w /usr/abills/var/log/ipn/ 0/0/9996
Параметры:
-S 5 - каждые 5 минут коллектор будет скидывать статистику о своей работе в лог. Самое интересное там - это количество потерянных посылок, которые не дошли до коллектора
-n 287 - количество ротаций файлов с записями о соединениях в сутки. 287 означает создание нового файла с данными netflow каждые 5 минут.
-N 0 - так называемый nesting_level; определяет структуру директорий которая, будет создаваться при записи файлов с соединениями, 0 - файл с данными netflow в каталоге.
-d 5 - Уровень отладки. Используется только для теста или выявления аномалий. Можно не указывать.
-w /usr/abills/var/log/ipn/ - Каталог, в котором сохраняются файлы с данными netflow.
0/0/9995 - по порядку: адрес, на котором коллектор будет принимать netflow, адрес с которого коллектор будет принимать netflow и порт, на который коллектор будет принимать netflow. Если первый заменить на 0, то коллектор будет принимать на любой адрес из доступных интерфейсов, если второй заменить на 0, то коллектор будет принимать netflow данные с любых адресов. Этого делать не рекомендуется по одной простой причине: netflow не имеет никаких средств авторизации, поэтому если адрес, на котором коллектор принимает netflow, доступен кому-то еще, то злоумышленник может послать ложные данные. Учитывая то, что данные netflow могут использоваться как для расчетов, так и выявления сетевых проблем и аномалий, лучше обезопаситься и задать все жестко.
Кроме того, можно запустить несколько коллекторов на разных адресах и/или портах, так же один колектор может работать с несколькими роутерами одновременно и различать их по полю engine-id.
Автоматический старт при загрузке в FreeBSD:
# chown flowtools /usr/abills/var/log/ipn/
/etc/rc.conf
flow_capture_enable="YES" flow_capture_datadir="/usr/abills/var/log/ipn/" flow_capture_port="9996" flow_capture_flags="-S 5 -n 287 -N 0 -d 5"
Иногда возникают ситуации когда нужно запустить несколько процессов flow_capture для получения flow потоков от разных серверов доступа. /etc/rc.conf
flow_capture_enable="YES" flow_capture_profiles="r1 r2" # описание первого демона на порту 9997 flow_capture_r2_datadir="/usr/abills/var/log/ipn/" flow_capture_r2_port="9997" flow_capture_r2_flags="-S 5 -n 1400 -N 0 -d 5" # описание второго демона 9996 flow_capture_r1_datadir="/usr/abills/var/log/ipn2/" flow_capture_r1_port="9996" flow_capture_r1_flags="-S 5 -n 287 -N 0 -d 5"
http://sourceforge.net/projects/ipcad/ Демон, собирающий статистику по трафику на компьютере под управлением Linux или FreeBSD, с возможностью экспортирования её по NetFlow.
# cd /usr/ports/net-mgmt/ipcad/ # make # make install
Правим /usr/local/etc/ipcad.conf
# Интерфейс для сбора статистики
interface fxp0;
# детализация по портам
#capture-ports enable;
# Агрегировать порты, уменьшает размер базы детализации
#aggregate 1024-65535 into 65535; /* Aggregate wildly */
#aggregate 3128-3128 into 3128; /* Protect these ports */
#aggregate 150-1023 into 1023; /* General low range */
# Експортирование статистики на адрес 127.0.0.1 порт 9996
netflow export destination 127.0.0.1 9996;
netflow export version 5; # NetFlow export format version {1|5}
netflow timeout active 30; # Timeout when flow is active, in minutes
netflow timeout inactive 15; # Flow inactivity timeout, in seconds
netflow engine-type 73; # v5 engine_type; 73='I' for "IPCAD"
netflow engine-id 1; # Useful to differentiate multiple ipcads.
dumpfile = ipcad.dump;
chroot = /var/ipcad/
pidfile = ipcad.pid;
rsh enable at 127.0.0.1;
memory_limit = 16m;
Запуск скрипта обработки статистики
/etc/crontab
*/5 * * * * root /usr/abills/libexec/traffic2sql 8 flowdir=/usr/abills/var/log/ipn/
Если у Вас несколько NAS-серверов (коллекторов траффика), то для каждого нужно создать отдельную папку для логов.
(aka kir)
no ip rcmd domain-lookup ip rcmd rsh-enable ip rcmd remote-host firewall 192.168.0.1 root enable ! ip flow-export source FastEthernet0/1 ip flow-export version 5 ip flow-export destination 192.168.0.1 9996 ! access-list 100 permit 172.19.80.0 0.0.0.255 192.168.0.1 - Разрешаем прохождение пакетов на сервер статистики access-list 100 dynamic ABILS permit IP any any - Динамические правила будут добавляться тут access-list 100 deny ip any any Если правила нет, доступ пользователю по умолчанию закрыт! ! interface FastEthernet0/1.21 ip address 192.168.0.1 255.255.255.0 ip access-group 100 in Не забываем привязать группу правил к интерфейсу! !
192.168.0.1 - Адрес коллектора для потока Netflow (flow-tools)
Для блокировки и открытия доступа можно использовать скрипт
# /usr/abills/misc/cisco_access ACTION - Allow/Deny IP - Client IP debug - Make debug log
/usr/local/etc/sudoers
www ALL = NOPASSWD: /usr/abills/misc/cisco_access
В качестве шейпера удобно использовать /usr/abills/libexec/linkupdown.
fxp0 - Интерфейс к которому подключаются пользователи.
config.pl
$conf{IPN_FW_START_RULE}="/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn up getif %LOGIN %IP". ' > /dev/null 2>&1';
$conf{IPN_FW_STOP_RULE}="/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn down getif %LOGIN %IP". ' > /dev/null 2>&1';
При использовании шейпера ipfw система по умолчанию использует правила с номера 20000 по 40000. Для изменения номера начального правила можно воспользоваться опцией $conf{IPN_FW_FIRST_RULE}.
/usr/local/etc/sudoers
#Allow ABillS shapper www ALL = NOPASSWD: /usr/abills/libexec/linkupdown
Скрипт которые подготавливает интерфейс для использования шейпера. /etc/rc.d/init.d/shaper.sh
#!/bin/sh
INTERFACE='eth0';
TC="/sbin/tc"
TCQA="${TC} qdisc add dev ${INTERFACE}"
TCQD="${TC} qdisc del dev ${INTERFACE}"
$TCQD root &>/dev/null
$TCQD ingress &>/dev/null
$TCQA root handle 1: htb
$TCQA handle ffff: ingress
echo "Shaper UP"
eth0 - Интерфейс к которому подключаются пользователи.
config.pl
$conf{IPN_FW_START_RULE}="/usr/bin/sudo /usr/abills/libexec/linkupdown ipn up eth0 %LOGIN %IP". ' > /dev/null 2>&1';
$conf{IPN_FW_STOP_RULE}="/usr/bin/sudo /usr/abills/libexec/linkupdown ipn down eth0 %LOGIN %IP". ' > /dev/null 2>&1';
/etc/sudoers
#Allow ABillS shapper apache ALL = NOPASSWD: /usr/abills/libexec/linkupdown
Настройка sudo, для запуска правил фаервола от имени пользователя, под которым работает WEB сервер.
# cd /usr/ports/security/sudo
# make # make install
/usr/local/etc/sudoers
Для FreeBSD:
#Allow ipfw operation without password for webserver user www ALL = NOPASSWD: /sbin/ipfw
Для линукса:
#Allow iptables operation without password for webserver user www ALL = NOPASSWD: /sbin/iptables
# Доступ к странице авторизации ipfw add 10 allow tcp from any to 192.168.0.1 9443 via rl0 ipfw add 11 allow tcp from 192.168.0.1 9443 to any via rl0 #Перенаправить все запросы неавторизированых клиентов на авторизатор ipfw add 64000 fwd 192.168.0.1,9443 tcp from any to any dst-port 80,443 via rl0 # Разрешить ping к серверу доступа ipfw add 64100 allow icmp from any to me via rl0 ipfw add 64101 allow icmp from me to any via rl0 # Разрешить ДНС запросы к серверу ipfw add 64400 allow udp from any to 192.168.0.1 53 ipfw add 64450 allow udp from 192.168.0.1 53 to any # Закрыть доступ неактивизированым хостам ipfw add 65000 deny ip from any to any via rl0
| 192.168.0.1 | Ваш сервер доступа |
|---|---|
| rl0 | Интерфейс в локальную сеть |
# Доступ к странице авторизации iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 9443 iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 9443 # Закрыть доступ неактивизированым хостам iptables -A FORWARD -j DROP
| eth0 | интерфейс в локальную сеть |
|---|---|
| eth1 | интерфейс наружу |
| 192.168.0.1 | локальный IP сервера |
| 192.168.0.0/255.255.255.0 | локальная сеть |
Управление удалённым сервером доступа.
Задача: открывать доступ пользователям на удалённом NAS.
При выполнении правил шейпера и фильтра в переменные среды передаются дополнительные параметры:
| NAS_IP_ADDRESS | IP адрес сервера доступа |
|---|---|
| NAS_MNG_USER | Логин для управления сервером доступа |
| NAS_MNG_PASSWORD | Пароль для управления сервером доступа |
На сервере билинга
abills/libexec/config.pl
$conf{IPN_FW_START_RULE}='/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_dsa.$NAS_MNG_USER $NAS_MNG_USER@$NAS_IP_ADDRESS '.
'"/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn up %INTERFACE% %LOGIN %IP %DEBUG > /dev/null 2>&1;'.
'/usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from %IP to any; /usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from any to %IP" ';
$conf{IPN_FW_STOP_RULE}='/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_dsa.$NAS_MNG_USER $NAS_MNG_USER@$NAS_IP_ADDRESS '.
'"/usr/local/bin/sudo /usr/abills/libexec/linkupdown ipn down %INTERFACE% %LOGIN %IP %DEBUG > /dev/null 2>&1;'.
' /usr/local/bin/sudo /sbin/ipfw -q delete %NUM "';
# abills/misc/certs_create.sh ssh abills_admin
# chown www abills/Certs/id_dsa.abills_admin
На удалённом сервере
/usr/local/etc/sudoers
#Allow ABillS shapper abills_admin ALL = NOPASSWD: /usr/abills/libexec/linkupdown abills_admin ALL = NOPASSWD: /sbin/ipfw
В конфиг веб-сервера Apache внесите следующие параметры
ErrorDocument 404 “/abills/” DirectoryIndex "/abills" index.cgi
Упрощёный интерфейс управления траффиком компьютерного клуба.
Для включения.
config.pl
$conf{IPN_CLUBMONITOR}=1;
ABillS IPN Traffic collector
Анализатор трафика для модуля IPN
Параметры:
traffic2sql [NAS_IDS] [Options]
Опции:
| NAS_IDS | ID (NAS) серверов доступа. Формат: 1,2,3 или 1-100 |
|---|---|
| log | Расположение файла траффика для trafd |
| INTERFACE | Интерфейс для trafd |
| flowdir | Каталог в который складываются файлы работы flow-capture |
| FLOWTOOLS_IP_AGGREGATION | Агрегация потоков по IP адресам. Поднимает скорость анализа. |
| FLOWTOOLS_FT_BACKUP=dir | Переносить проанализированные файлы в бекапный каталог. Используется для отладки. |
| debug | Режим отладки (1..6) |
| DETAIL_ONLY | Складывать в базу только детализацию для активных клиентов (присутствующих в /Monitoring). |
| UNKNOWN_IP_LOG | Включить учёт адресов, не относящихся к активным пользователям |
| TCOLLECTOR | Режим глобального коллектора. Складывать весь трафик, полученный от коллектора. |
| AMON_ALIVE | Интервал получения подтверждения активности от AMon. Интервал задаётся в секундах (Значение по умолчанию 120). Если на протяжении 3 интервалов не пришло ни одного пакета активности система закрывает соединение. |
| daemon | Режим демона (пока в разработке) |
| FLOW_CAT | Местоположение Flow tools flow-cat |
| FLOW_PRINT | Местоположение Flow tools flow-print |
| PREPAID_STORE | Использования отдельной таблицы для хранения значений предоплаченного трафика. Поднимает скорость анализа. |
| VIRUS_ALERT=1000 | Опция разрешает отслеживать заражённые хосты которые рассылаю вирусы. В данной опцие указывается количество мелких пакетов до размером 100 байт за единицу времени при котором хост попадает в чёрный список |
| LOG_FILE='…' | Файл ведения лога работы анализатора |
В начале каждого месяца происходит автоматическая переинициализация активных сессий клиентов.
Для ручного режима переинициализации сессий используется команда
# /usr/abills/libexec/periodic monthly MODULES=Ipn SRESTART=1 NO_ADM_REPORT=1 NAS_IDS=1
Параметры:
| NAS_IDS | Идентификаторы серверов доступа. По умолчанию система переинициализирует пользователей на всех серверах доступа с типом 'ipcad' |
|---|
Система разрешает пользоваться интернетом только пользователей у которых активизированы сессии. Активизация сесий пользователей может происходить двумя путями: активизация сессии администратором, активизация сессии из пользовательского кабинета.
Таблица внизу отображает активные сессии пользователя