Посчитаем все! Stargazer как биллинг для небольшой локалки
Имеется: сервер на freebsd 7.2, две безлимитных линии, две группы пользователей
Задача – контролировать платежи пользователей за интернет.
Для начала нам понадобится биллинг – программа, которая будет считать трафик пользователя, осуществлять авторизацию и считать абонку. В моем случае это Stargazer
Для установки нам потребуются оболочка bash и библиотека expat.
Распаковываем архив, идем в projects/stargazer.
Выполняем:
#./build
#gmake install
Если все прошло успешно, то в /etc/stargazer появятся файлы rules, stargazer.conf и скрипты пользователей
Начнем по порядку:
rules содержит список подсетей и направлений. По каждому направлению может быть свой тариф и свои правила подсчета.
ALL 192.168.0.0/16 DIR1 #направление 1 - локалка
ALL 10.0.0.0/8 DIR2 # направление 2 - городская сеть
ALL 0.0.0.0/0 DIR0 # направление 3 - инет
stargazer.conf – основной конфигурационный файл
################################################################################
# Файл настроек сервера stargazer #
################################################################################
# Имя лог-файла куда пишутся события
LogFile = /var/log/stargazer.log
# Имя PID-файла куда пишется идентификатор процесса
# По умолчанию /var/run/pid
# PIDFile = /var/run/stargazer.pid
# Имя файла в котором определяются правила подсчета трафика
Rules = /etc/stargazer/rules
# Время через которое пишется d БД детальная статистика пользователя
# Значения: 1, 1/2, 1/4, 1/6.
# 1 - раз в чаc, 1/2 - раз в пол часа, 1/4 - раз в 15 мин, 1/6 - раз в 10 мин
DetailStatWritePeriod=1/6
# Периодичность записи записи в БД информации о статистике пользователя (минуты)
# При большом кол-ве пользователей эту величину стоит увеличить, т.к.
# запись в БД может занимать длительное время.
# Значения: 1...1440 (минуты)
StatWritePeriod = 10
# День снятия абонплаты
# Значения: 0...31. 0 - Последний день месяца
DayFee = 1
# Абонплата снимается в последний (yes) или первый (no) день учетного периода.
# Это влияет на то, как будет снята абонплата (АП) при переходе на новый тариф.
# Если у пользователя был тариф A с АП=100 и он хочет перейти на тариф B с АП=200,
# то при переходе на новый тариф со счета пользователя снимется 100, если
# DayFeeIsLastDay = yes и 200, если DayFeeIsLastDay = no
DayFeeIsLastDay = yes
# День сброса данных о трафике за месяц и день перехода пользователей на новые тарифы
# Значения: 0...31. 0 - Последний день месяца
DayResetTraff = 1
# "Размазанное" снятие абонплаты. Снятие АП не раз в месяц, а каждый
# день 1/30 или 1/31 части АП
# Значения: yes, no
SpreadFee = no
# Данная опция определяет может ли пользователь получить доступ в интерент
# если у него на счету нет денег, но остался предоплаченный трафик
# Значения: yes, no
FreeMbAllowInet = no
# Эта опция определяет что будет писаться в стоимость трафика в detail_stat.
# Если у пользователя еще есть предоплаченный трафик и WriteFreeMbTraffCost = no,
# то в detail_stat стоимость будет 0. Если у пользователя уже нет
# предоплаченного трафика и WriteFreeMbTraffCost = no, то в detail_stat
# будет записана стоиость трафика. При WriteFreeMbTraffCost = yes стоимость
# трафика будет записана в любом случае.
WriteFreeMbTraffCost = no
# Названия направлений. Направления без названий не будут отображаться в
# авторизаторе и конфигураторе. Названия состоящие из нескольких слов должны
# быть взяты в кавычки
# Я использовал только одно направление - Интернет. (прим. Snake)
DirName0 = Internet
#DirName1 = Город
#DirName2 = Локаль
# Кол-во запускаемых процессов stg-exec.
# Эти процессы отвечают за выполнение скриптов OnConnect, OnDisconnect, ...
# Кол-во процессов означает сколько скриптов могут выполнятся одновременно.
# Значения: 1...1024
ExecutersNum = 1
# Message Key для stg-exec.
# Идентификатор очереди сообщений для выполнятеля скриптов.
# Его изменение может понадобится если есть необходимость запустить несколько
# экземпляров stg. Если вы не понимаете, что это, не трогайте этот параметр!
# Значения: 0...2^32
# Значение по умолчанию: 5555
# ExecMsgKey = 5555
# Путь к директории, в которой находятся модули сервера
ModulesPath = /usr/lib/stg
# Определяет директорию, в которой будут находится файлы "монитора"
# работы сервера. В этой директории будут созданы пустые файлы, время
# модификации которых будет меняться примерно раз в минуту. Если какой-то
# компонент сервера зависнет, файл(ы) перестанет обновлятся, и по этому
# признаку можно определить сбой в работе сервера и при надобности
# перезапустить. Если параметр не указан или пустой, мониторинг производится
# не будет. Параметр не является обязательным, по умолчанию пустой.
# MonitorDir=/var/stargazer/monitor
################################################################################
# Store module
# Настройки плагина работающего с БД сервера
# Выберите нужный модуль хранения статистики (БД или файлы). Должен быть активен только один модуль!
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Т.е. полное имя модуля mod_store_files.so
# Рабочая директория сервера, тут содержатся данные о тарифах, пользователях,
# администраторах и т.д.
WorkDir = /var/stargazer
# Владелец, группа и права доступа на файлы статистики (stat) пользователя
ConfOwner = root
ConfGroup = wheel
ConfMode = 600
# Владелец, группа и права доступа на файлы конфигурации (conf) пользователя
StatOwner = root
StatGroup = wheel
StatMode = 640
# Владелец, группа и права доступа на лог-файлы (log) пользователя
UserLogOwner = root
UserLogGroup = wheel
UserLogMode = 640
# Удалять резервные копии после успешной записи conf/stat
# Значения: yes, no
# По умолчанию: yes
# RemoveBak = yes
# Восстанавливать файлы conf/stat из резервных копий при ошибке чтения
# Значения: yes, no
# По умолчанию: no
# ReadBak = no
#
# # Адрес сервера БД
# server=localhost
#
# # Путь к БД на сервере или ее алиас
# database=/var/stg/stargazer.fdb
#
# # Имя пользователя БД
# user=stg
#
# # Пароль пользователя БД
# password=123456
#
# # Уровень изоляции транзаций (не обязательно, по умолчанию oncurrency):
# # concurrency
# # dirtyRead
# # readCommitted
# # consistency
# isolationLevel=concurrency
#
# # Действия при блокировках (не обязательно, по умолчанию wait):
# # wait
# # noWait
# lockResolution=wait
#
#
# # Адрес сервера БД
# server=localhost
#
# # Имя БД
# database=stargazer
#
# # Имя пользователя БД
# user=stg
#
# # Пароль пользователя БД
# password=123456
#
#
# # Имя пользователя БД
# dbuser = stg
#
# # Пароль пользователя БД
# rootdbpass = 123456
#
# # Имя БД на сервере
# dbname = stg
#
# # Адрес сервера БД
# dbhost = localhost
#
################################################################################
# Прочие модули
# Настройки плагина авторизации Always Online "mod_auth_ao.so"
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Т.е. полное имя модуля mod_auth_ao.so
# Настройки плагина авторизации InetAccess "mod_auth_ia.so"
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Т.е. полное имя модуля mod_auth_ia.so
# Порт на котором принимаются обращения от авторизатора
# Значения: 1...65534
Port = 5555
# Время между посылками запроса пользователю жив ли он
# и обновлением данных статистики (секунды)
# Значения: 5...600
UserDelay = 15
#Таймаут для пользователя. Если в течение этого времени авторизатор
#не отвечает, пользователь будет отключен
# Значения: 15...1200
UserTimeout = 65
# Этот параметр определяет что будет передаваться программе InetAccess от сервера
# как отстаток предоплаченного трафика
# Значения:
# FreeMb = 0 - кол-во бесплатных мегабайт в пресчете на цену нулевого направления
# FreeMb = 1 - кол-во бесплатных мегабайт в пресчете на цену первого направления
# FreeMb = 2 - кол-во бесплатных мегабайт в пресчете на цену второго направления
# FreeMb = 3 - кол-во бесплатных мегабайт в пресчете на цену третьего направления
# ........................
# FreeMb = 9 - кол-во бесплатных мегабайт в пресчете на цену девятого направления
# FreeMb = cash - кол-во денег на которые юзер может бесплатно качать
# FreeMb = none - ничего не передавать
FreeMb = cash
# Модули можно использовать несколько раз с разными параметрами
#
# Port = 7777
# UserDelay = 15
# UserTimeout = 65
# FreeMb = 0
#
# Настройки модуля конфигурации SgConfig "mod_conf_sg.so"
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Порт по которому сервер взаимодействует с конфигуратором
# Значения: 1...65535
Port = 5555
# Модуль захвата трафика "mod_cap_bpf.so"
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Без параметров. Только имя модуля.
# Интерфейс(ы) на котором нужно производить подсчет трафика
iface = rl0
iface = rl1
iface = dc0
# Модуль захвата трафика "mod_cap_nf.so"
# Принимает информацию о трафике по протоколу NetFlow
# Второй параметер - это имя модуля без mod_ в начале и .so в конце
# TCPPort - порт для TCP-соединений
TCPPort = 42111
# UDPPort - порт для UDP-соединений
UDPPort = 42111
# Могут иметь совпадающие значения.
# Если параметр не указан - соответствующий порт не "прослушивается".
# Настройки модуля пингующего пользователей "mod_ping.so"
# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Время, в секундах, между пингами одного и того же пользователя
# Значения: 10...3600
PingDelay = 15
# # Настройки модуля для удаленного выполнения скриптов OnCOnnect и
# # OnDisconnect "mod_remote_script.so"
# # Второй параметр - это имя модуля без mod_ в начале и .so в конце
#
#
# # Время, в секундах, между посылками подтверждений, того, что пользователь
# # всё еще онлайн
# # Значения: 10...600
# SendPeriod = 15
#
# # Соответствие подсетей, в которой находится пользователь и
# # соответствующего роутера. Первая часть строки - подслеть, заданная
# # как IP-адрес и маска, через пробел - IP-адрес роутера на котором
# # должны выполняться скрипты
# # Например эта запись "192.168.1.0/24 192.168.1.1" означает, что для
# # всех пользователей из подсети 192.168.1.0/24, скрипты будут
# # выполняться на роутере с адресом 192.168.1.1
# # Subnet0...Subnet100
# Subnet0 = 192.168.1.0/24 192.168.1.7
# Subnet1 = 192.168.2.0/24 192.168.2.5
# Subnet2 = 192.168.3.0/24 192.168.2.5
# Subnet3 = 192.168.4.0/24 192.168.2.5
#
# # Пароль для шифрования пакетов между stg-сервером и сервером,
# # выполняющим скрипты
# Password = 123456
#
# # Этот параметр определяет какие параметры пользователя передаются
# # на удаленный сервер
# # Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName, NextTariff, Address,
# # Note, Group, Email, RealName, Credit, EnabledDirs, Userdata0...Userdata9
# UserParams=Cash Tariff EnabledDirs
#
# # Порт по которому сервер отсылает сообщения на роутер
# # Значения: 1...65535
# Port = 9999
#
#
#
# Password = 123456
# ServerIP = 127.0.0.1
# Port = 6666
# AuthServices = Login-User
# AcctServices = Framed-User
#
################################################################################
Скрипты OnConnect, OnDisconnect и другие обрабатываются при наступлении соответствующего события. Например, при подключении пользователя ему должен открываться доступ к интернету. Соответственно, при отключении пользователя “окно” должно закрываться.
Вот пример моих скриптов:
OnConnect:
# Login
LOGIN=$1
#user IP
IP=$2
#cash
CASH=$3
#user ID
ID=$4
#Selected dirs to connect
DIRS=$5
fw="/sbin/ipfw"
${fw} table 1 add $IP
При соединении IP пользователя добавляется в таблицу фаервола, и ему открывается доступ в инет.
OnDisconnect:
# Login
LOGIN=$1
#user IP
IP=$2
#cash
CASH=$3
#user ID
ID=$4
#Selected dirs to disconnect
DIRS=$4
fw="/sbin/ipfw"
${fw} table 1 del $IP
При отключении ип пользователя удаляется из таблицы, доступ закрывается.
Остальная настройка подробно описана в мануале, ничего сложного там нет. Трафик считается, деньги исправно списываются.