Модуль для подсчета трафика в локальной сети.
Схема авторизации
Модуль получает данные о трафике от внешних коллекторов (trafd, ipcad, Cisco Netflow).
Получив данные от коллектора, система просматривает таблицу активных сессий (/ Monitoring/ Dialup / VPN/) и для них проводит подсчет трафика в зависимости от тарифного плана клиента. Модуль использует тарифные планы, описанные в модуле Dv (Dialup/VPN). Если данные о трафике не принадлежат ни одной из активных сессий, то они складываются в файл /usr/abills/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 --default-character-set=utf8 -D abills < db/Ipn.sql
abills/libexec/config.pl
@MODULES = ( 'Ipn' );
Опции:
$conf{IPN_DETAIL}=1; | Вести детальную статистику. на сервере где traffic2sql работает |
---|---|
$conf{IPN_DETAIL_MIN_SIZE}=1024; | Задаёт минимальный размер пакета который будет попадать в детализацию. Данная опция предохраняет от замусоривания |
$conf{IPN_DAILY_LOG_ROTATE}=1; | Ротация детализации и логов статистики каждый день. При включённой опции не работает подсёчет пред оплаченного трафика |
$conf{IPN_STATIC_IP}=1; | Использовать только статические адреса. Система проверяет статические адреса всех имеющихся клиентов и присваивает им траффик. Исключая таким образом потери из за переподключений при использовании динамических адресов авторизации. При даной схеме работы трафик в журнал / Monitoring / Online не попадает он складывается непосредственно в статистику пользователя |
$conf{IPN_FILTER}=«/usr/abills/libexec/ipn_filter.sh»; | Полный путь к программе, которая запустится, если у клиента заполнено поле Filter ID. Данная программа запускается после командіпрописанной в $conf{IPN_FW_START_RULE} и $conf{IPN_FW_STOP_RULE}. Программе передаются следующие аргументы %STATUS (ONLINE_ENABLE,ONLINE_DISABLE,HANGUP) %LOGIN %IP %FILTER_ID %PORT %UID в виде аргументов. Также передаются переменные окружения: NAS_IP_ADDRESS NAS_MNG_USER NAS_MNG_IP_PORT Не забывайте, что при ручной активации пользователя программа может выполняться с правами веб-сервера, поэтому лучше её запускать через sudo. Пример: abills/misc/ipn_filter.sh |
$conf{IPN_DETAIL_CLEAN_PERIOD}=30; | Чистить лог детализации каждых 30 дней |
$conf{IPN_USERMENU}=1; | Включить в пользовательском интерфейсе меню открытия доступа |
$conf{IPN_CLUBMONITOR}=1; | Включить клуб монитор. Упрощённый интерфейс мониторинга активных сессий и меню создания карточек доступа |
$conf{IPN_DAILY_RESTART}=1; | Рестартовать сессии каждый день |
$conf{IPN_DEPOSIT_OPERATION}=1; | Снимать деньги модулем IPN. При включении этой опции деньги со счёта снимаются в реальном времени после каждого обновления статистики. |
$conf{IPN_FW_FIRST_RULE}=20000; | Номер первого правила в брандмауэре |
$conf{IPN_FW_START_RULE}=«« | Правила для открытия доступа. Программе всегда передаются следующие параметры: %IP - ип адрес %MASK - битная маска (32,24) %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 (Internet).
/ 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
Установка на FreeBSD и Debian
Запуск скрипта обработки статистики
/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
При включении сессии выполняется правило указанное в конфигурационном файле (config.pl) $conf{IPN_FW_START_RULE} при завершении $conf{IPN_FW_STOP_RULE}. Система данным командам передаёт следующие атрибуты
%IP | IP адрес клиента |
%MASK | битная маска (32,24) |
%NUM | номер правила ($conf{IPN_FW_FIRST_RULE} + (PORT или последняя цифра IP адреса) ) |
%LOGIN | Логин |
%SPEED_IN | входящая скорость |
%SPEED_OUT | исходящая скорость |
а также переменные окружения
NAS_IP_ADDRESS | IP адрес сервера доступа |
NAS_MNG_USER | Пользователь для управления сервером доступа |
NAS_MNG_IP_PORT | IP:PORT управления сервером доступа |
NAS_ID | Номер сервера доступа |
NAS_TYPE | Тип сервера доступа |
В качестве шейпера удобно использовать /usr/abills/libexec/linkupdown.
abills/libexec/config.pl
$conf{IPN_FW_START_RULE}='SUDO=/usr/local/bin/sudo; CMD="${SUDO} /usr/abills/libexec/linkupdown ipn up getif %LOGIN %IP %DEBUG > /dev/null 2>&1"; if [ "${NAS_TYPE}" = "mikrotik" ]; then CMD="/usr/abills/libexec/linkupdown mikrotik up - %LOGIN %IP NAS_HOST=${NAS_MNG_IP_PORT} NAS_ADMIN=${NAS_MNG_USER}"; elif [ "${NAS_MNG_IP_PORT}" != "" ]; then CMD="/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_rsa.${NAS_MNG_USER} ${NAS_MNG_USER}@${NAS_MNG_IP_PORT} \"${CMD}\""; fi; eval "${CMD}"'; $conf{IPN_FW_STOP_RULE}='SUDO=/usr/local/bin/sudo; CMD="${SUDO} /usr/abills/libexec/linkupdown ipn down getif %LOGIN %IP %DEBUG > /dev/null 2>&1"; if [ "${NAS_TYPE}" = "mikrotik" ]; then CMD="/usr/abills/libexec/linkupdown mikrotik down - %LOGIN %IP NAS_HOST=${NAS_MNG_IP_PORT} NAS_ADMIN=${NAS_MNG_USER}"; elif [ "${NAS_MNG_IP_PORT}" != "" ]; then CMD="/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_rsa.${NAS_MNG_USER} ${NAS_MNG_USER}@${NAS_MNG_IP_PORT} \"${CMD}\""; fi; eval "${CMD}"';
Для типа сервера - mikrotik-dhcp:
$conf{IPN_FW_START_RULE}='SUDO=/usr/local/bin/sudo; CMD="${SUDO} /usr/abills/libexec/linkupdown ipn up getif %LOGIN %IP %DEBUG > /dev/null 2>&1"; if [ "${NAS_TYPE}" = "mikrotik_dhcp" ]; then CMD="/usr/abills/libexec/linkupdown mikrotik up - %LOGIN %IP NAS_HOST=${NAS_MNG_IP_PORT} NAS_ADMIN=${NAS_MNG_USER}"; elif [ "${NAS_MNG_IP_PORT}" != "" ]; then CMD="/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_rsa.${NAS_MNG_USER} ${NAS_MNG_USER}@${NAS_MNG_IP_PORT} \"${CMD}\""; fi; eval "${CMD}"'; $conf{IPN_FW_STOP_RULE}='SUDO=/usr/local/bin/sudo; CMD="${SUDO} /usr/abills/libexec/linkupdown ipn down getif %LOGIN %IP %DEBUG > /dev/null 2>&1"; if [ "${NAS_TYPE}" = "mikrotik_dhcp" ]; then CMD="/usr/abills/libexec/linkupdown mikrotik down - %LOGIN %IP NAS_HOST=${NAS_MNG_IP_PORT} NAS_ADMIN=${NAS_MNG_USER}"; elif [ "${NAS_MNG_IP_PORT}" != "" ]; then CMD="/usr/bin/ssh -o StrictHostKeyChecking=no -i /usr/abills/Certs/id_rsa.${NAS_MNG_USER} ${NAS_MNG_USER}@${NAS_MNG_IP_PORT} \"${CMD}\""; fi; eval "${CMD}"';
Также внизу указано настройка дополнительных параметров для разных операционных систем и удалённых серверов доступа
Управление доступом, шейпером и переинициализация сессий при перезагрузке сервера осуществляется программой /usr/local/etc/rc.d/shaper_start.sh
параметры /etc/rc.conf
abills_shaper_enable=«YES» | Поднятие правил шейпера при перезапуске системы |
---|---|
abills_ipn_nas_id=«Номер IPN наса» | Номер сервера доступа. Обязательный параметр |
abills_ipn_if=«интерфейс к которому подключаются пользователи» | Интерфейс к которому подключаются клиенты |
abills_ipn_allow_ip=«разрешённые ип адреса» | Разрешённые без авторизации IP адреса. Разделяются запятой |
abills_nat=«xx.xx.xx.xx:10.0.0.0/16:interface» | Если нужно использовать NAT |
При использовании шейпера ipfw система по умолчанию использует правила с номера 20000 по 40000. Для изменения номера начального правила можно воспользоваться опцией $conf{IPN_FW_FIRST_RULE}.
Установка sudo, для запуска правил фаервола от имени пользователя, под которым работает WEB сервер. freebsd:
# cd /usr/ports/security/sudo # make # make install
/usr/local/etc/sudoers
#Allow ABillS shapper www ALL = NOPASSWD: /usr/abills/libexec/linkupdown www ALL = NOPASSWD: /sbin/ipfw
Скрипт которые подготавливает интерфейс для использования шейпера и устанавливает контроль доступа .
/etc/rc.d/init.d/shaper_start.sh
/etc/rc.conf
abills_shaper_enable="YES" abills_ipn_if="eth0,eth2" abills_nat_enable=":192.168.0.0/24:eth1"
eth0,eth2 | интерфейс в локальную сеть к которому подключены пользователи |
---|---|
eth1 | интерфейс наружу |
192.168.0.1 | локальный IP сервера |
192.168.0.0/255.255.255.0 | локальная сеть |
или альтернативный скрипт
#!/bin/sh # При использовании нескольких интерфейсов указываем их через пробел INTERFACES='eth0 eth2'; TC="/sbin/tc" for INTERFACE in ${INTERFACES}; do 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 ${INTERFACE}" done # Доступ к странице авторизации /sbin/iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 80 /sbin/iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 80 # Закрыть доступ неактивизированым хостам /sbin/iptables -A FORWARD -j DROP
/etc/sudoers
#Allow ABillS shapper apache ALL = NOPASSWD: /usr/abills/libexec/linkupdown apache ALL = NOPASSWD: /sbin/iptables
Управление удалённым сервером доступа.
Задача: открывать доступ пользователям на удалённом NAS.
При выполнении правил шейпера и фильтра в переменные среды передаются дополнительные параметры:
NAS_IP_ADDRESS | IP адрес сервера доступа |
---|---|
NAS_MNG_IP_PORT | адрес управления сервером доступа |
NAS_MNG_USER | Логин для управления сервером доступа |
NAS_MNG_PASSWORD | Пароль для управления сервером доступа |
NAS_TYPE | Тип сервера доступа |
NAS_ID | Тип сервера доступа |
система автоматически определяет по переменной окрежения NAS_MNG_IP_PORT при старте сесии выполнять данную команду локально или на удалённом сервере
На сервере биллинга
# abills/misc/certs_create.sh ssh 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
Запуск скрипта обработки статистики /etc/crontab
*/5 * * * * root /usr/abills/libexec/traffic2sql [NAS_IDS] flowdir=/usr/abills/var/log/ipn/
Параметры:
traffic2sql [NAS_IDS] [Options]
Пример вызова для серверов с ID 1,2,3:
/usr/abills/libexec/traffic2sql 1,2,3 flowdir=/usr/abills/var/log/ipn/
Опции:
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) режим 5 и 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 | Опция разрешает отслеживать заражённые хосты которые рассылаю вирусы. В данной опцие указывается количество мелких пакетов до размером 150 байт за единицу времени при котором хост попадает в чёрный список |
LOG_FILE='…' | Файл ведения лога работы анализатора |
TRANSACTION=1 | Вносить все даные одной транзакцией (ускоряет работу) |
# /usr/abills/libexec/periodic monthly MODULES=Ipn
Дополнительные параметры:
IPN_SKIP_SESSION_RESTART=1 | Не переинициализировать сессии при месячном периодике. Данная опция полезна при работе с удалёнными серверами доступа чтобы биллинг не тратил время на переинициализацию сессии. На удалённых серверах стоит сделать /etc/crontab /etc/crontab 1 2 * * * root /usr/abills/libexec/periodic monthly MODULES=Ipn SRESTART=1 NO_ADM_REPORT=1 NAS_IDS=xxx |
---|---|
SRESTART=1 | Переинициализировать активных абонентов |
LOGON_ACTIVE_USERS=1 | Активировать активных пользователей |
NAS_IDS=1,2 | Список серверов доступа |
LOGIN= | Логины |
DEBUG= | Режим отладки |
В начале каждого месяца происходит автоматическая переинициализация активных сессий клиентов.
Для ручного режима переинициализации сессий используется команда
# /usr/abills/libexec/periodic monthly MODULES=Ipn SRESTART=1 NO_ADM_REPORT=1 NAS_IDS=1
Параметры:
NAS_IDS=1,2 | Идентификаторы серверов доступа. По умолчанию система переинициализирует пользователей на всех серверах доступа с типом 'ipcad' |
---|---|
TP_ID=3,6 | Номера тарифных планов для активации. По умолчанию все |
LOGIN=test,test3 | Логины пользователей. По умолчанию все |
GID=1 | Группы пользователей |
IP=xx.xx.xx.xx | IP активной сессии |
Данная команда автоматически включает всех пользователей с положительным депозитом и правами получать сервис (статус услуги активно). Активируются только те пользователи у которых прописан IP адрес сервиса Internet. Также обязательно на IPN серверах доступа прописать пулы адресов для таких пользователей чтобы система знала на каких серверах доступа активировать абонентов. Данную команду стоит запускать через crontab с промежутком раз в 5 минут.
# /usr/abills/libexec/periodic monthly MODULES=Ipn LOGON_ACTIVE_USERS
Параметры:
NAS_IDS=1,2 | Идентификаторы серверов доступа. По умолчанию система переинициализирует пользователей на всех серверах доступа с типом 'ipcad' |
---|---|
TP_ID=3,6 | Номера тарифных планов для активации. По умолчанию все |
LOGIN=test,test3 | Логины пользователей. По умолчанию все |
GID=1 | Группы пользователей |
DEBUG=… | Дебаг режимы 1-4 Детализация процесса 5 - Отображать команды на выполнение 6 - Отображать команды но не выполнять |
config.pl
$conf{IPN_DHCP_ACTIVE}=1; | Включать сервис для всех IP адресов прописанных в IP (DHCP) секции абонента. С начало включаются адреса Internet сервиса если они не равны 0.0.0.0, а потом адреса IP сервиса. |
---|
Система разрешает пользоваться интернетом только пользователей у которых активизированы сессии. Активизация сесий пользователей может происходить двумя путями: активизация сессии администратором, активизация сессии из пользовательского кабинета.
Таблица внизу отображает активные сессии пользователя