Посчитаем все! 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

При отключении ип пользователя удаляется из таблицы, доступ закрывается.

Остальная настройка подробно описана в мануале, ничего сложного там нет. Трафик считается, деньги исправно списываются.

Leave a Reply