Хакер № 04/08 (112)
Всесторонний учет
Сергей «grinder» Яремчук (grinder@ua.fm, tux.in.ua)
Хакер, номер #112, стр. 112-136-1
ABillS: система биллинга для *nix
Значительная часть услуг, предоставляемых провайдерами или сервисами,
требует системы автоматизированного учета затраченных ресурсов.
Существует большое количество биллинг-систем - как платных, так и
бесплатных, распространяемых под свободной лицензией. Некоторые из них
ориентированы на строго определенный сервис, другие многофункциональны.
Система биллинга ABillS относится к классу программ all-in-one.
Возможности ABillS
Бесплатная биллинговая система ABillS (AsmodeuS Billing System)
распространяется по лицензии GNU GPL2, написана на Perl и в процессе
работы использует другие OpenSource решения: Apache, MySQL и FreeRADIUS.
Информация по продукту и исходные тексты доступны на сайте проекта www.abills.net.ua/wiki/doku.php.
При помощи ABillS можно производить учет времени работы и трафика
диалап и VPN пользователей с выдачей статистики за любой период времени.
Работает с неограниченным количеством NAS серверов (Network Access Server
– сервер доступа в Сеть). Способен авторизировать по системной базе
паролей UNIX и SQL базе данных. Поддерживаются протоколы PAP, CHAP,
MS-CHAP, MS-CHAPv2, EAP и IEEE 802.1x. Для некоторых соединений возможна
авторизация по MAC адресу. Заявлена поддержка протокола шифрования
данных MPPE.
Кроме того, в поставке имеются еще около двадцати модулей,
подключение которых позволяет нарастить стандартные возможности.
Например, AGI интерфейс к Asterisk и монитор Squid. Есть модуль
управления DHCP сервером и почтовыми ящиками пользователей. Возможен
мониторинг количества активных сессий и трафика, проходящего через
интерфейс, при помощи MRTG. Реализована консоль управления базой данных.
Абонентские платы можно снимать ежедневно, ежемесячно или раз в год,
реализована бонусная система. Оплата услуг производится при помощи карт
платежей, а подключение к сервисам – при помощи специальных карт. И это
еще не все! Именно из-за наличия большого количества функций ABillS
считается сложной в настройке системой. Попробуем с ней разобраться.
Установку ABillS можно условно разбить на два этапа. Собственно
установка и настройка компонентов системы биллинга, и подключение
контролируемых сервисов. Не обязательно все компоненты (Apache, MySQL,
FreeRADIUS и ABillS) должны быть установлены на одном компьютере, но для
упрощения я буду использовать именно такой вариант. В качестве
операционной системы был выбран Ubuntu 7.10. Впрочем, отличия в других
системах незначительны.
Установка FreeRADIUS
Начнем с установки FreeRADIUS. Он отвечает за передачу информации
между программами-сервисами и системой биллинга, обеспечивая три А
(Авторизацию, Аутентификацию, Аккаунтинг). В репозиториях подавляющего
большинства дистрибутивов он присутствует, поэтому:
$ sudo apt-get install freeradius radiusclient1
В своей работе FreeRADIUS использует несколько конфигурационных
файлов, которые находятся в каталоге /etc/freeradius (в зависимости от
вида установки или дистрибутива, это может быть и /etc/raddb). Все их
трогать не нужно, достаточно изменить несколько параметров. Начнем с
radiusd.conf, в котором производятся общие настройки сервера.
$ sudo mcedit /etc/freeradius/radiusd.conf
# IP-адрес биллинг-сервера
bind_address = 127.0.0.1
# Далее в разделе authorize нужно закомментировать использование модулей chap и mschap
authorize {
preprocess
# chap
# counter
# attr_filter
# eap
# suffix
files
# etc_smbpasswd
# sql
# mschap
}
Данные о пользователях записываются в файл /etc/freeradius/users. В
нем необходимо подправить соответствующий параметр так, чтобы за это
отвечал скрипт ABillS.
$ sudo mcedit /etc/freeradius/users
DEFAULT Auth-Type = Accept
Exec-Program-Wait = "/usr/abills/libexec/rauth.pl"
Теперь принимаемся за файл acct_users, который содержит настройки
учета. В файле обычно задаются скрипты, выполняющиеся в различных
состояниях (подключение, работа, отключение). По умолчанию здесь все
закомментировано. Открываем в текстовом редакторе и добавляем:
$ sudo mcedit /etc/freeradius/acct_users
DEFAULT Acct-Status-Type == Start
Exec-Program = "/usr/abills/libexec/racct.pl"
DEFAULT Acct-Status-Type == Alive
Exec-Program = "/usr/abills/libexec/racct.pl"
DEFAULT Acct-Status-Type == Stop
Exec-Program = "/usr/abills/libexec/racct.pl"
И, наконец, последний файл, который нас интересует – clients.conf, в
котором описываются параметры подключения к NAS. Сюда нужно вписать
IP-адрес или имя NAS сервера, откуда будут поступать данные и пароль для
доступа:
$ sudo mcedit /etc/freeradius/clients.conf
client localhost {
# Слово, применяемое для шифрования соединения (до 31 знака)
secret = password123
# Псевдоним или IP-адрес
shortname = 127.0.0.1
nastype = other
}
Теперь проверяем правильность заполнения конфигурационного файла:
$ check-radiusd-config -level 345 radiusd on
Radius server configuration looks OK.
Если все нормально, запускаем сервер в режиме отладки «radiusd –X» и переходим к следующему шагу.
Настройка MySQL
Далее нам потребуется рабочая СУБД MySQL, поэтому перейдем к ее установке. Если она уже есть, этот шаг можно пропустить.
$ sudo apt-get install mysql-server mysql-client
В процессе инсталляции будет запрошен пароль администратора. По
умолчанию MySQL принимает подключения только с локального адреса, то
есть в файле /etc/mysql/my.cnf должна быть строка:
bind-address = 127.0.0.1
В нашем случае биллинг и мускул находятся на одном узле, поэтому
этого достаточно. Если используется другой сервер, не забудь изменить
здесь значение. Запускаем MySQL:
$ sudo /etc/init.d/mysql start
Следующий шаг: в mysql создаем пользователя abills с паролем password и базу данных abills:
$ mysql -u root -p
mysql> use mysql;
Database changed
mysql>INSERT INTO user (Host, User, Password)
VALUES ('localhost','abills', password('password'));
mysql>INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv,
Delete_priv, Create_priv, Drop_priv, Index_priv, Alter_priv,
Lock_tables_priv, Create_tmp_table_priv)
VALUES ('localhost', 'abills', 'abills', 'Y', 'Y', 'Y', 'Y', 'Y',
'Y', 'Y', 'Y', 'Y', 'Y');
mysql>CREATE DATABASE abills;
mysql>flush privileges;
mysql> quit
Для удобства эти команды можно вынести в текстовый файл и загрузить
через консоль. Теперь копируем с сайта проекта последнюю версию ABills,
распаковываем:
$ cd /usr
$ tar xzvf abills-0.37.tgz
$ cd abills
Внутри находится шаблон таблиц базы данных, загружаем его:
$ mysql -D abills -u root -p < abills/abills.sql
Все, SQL'ные разборки закончены.
Установка Apache
Для корректной работы ABillS апач должен быть собран с поддержкой mod_rewrite, то есть при ручной сборке индейца используем:
$ ./configure --enable-rewrite=shared
При установке из репозитария никаких дополнительных телодвижений не требуется:
$ sudo apt-get install apache2
$ cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
Только по умолчанию он отключен, не забудь включить:
$ sudo a2enmod rewrite
Module rewrite installed; run /etc/init.d/apache2 force-reload to enable.
Для настройки веб-сервера в дистрибутив ABillS входит конфиг
/usr/abills/misc/abills_httpd.conf, который подключает нужные каталоги в
качестве виртуального сервера. Чтобы его установить, достаточно ввести
команду:
$ sudo sh -c "cat /usr/abills/misc/abills_httpd.conf >> \
/etc/apache2/apache2.conf"
Но без правки работать он не будет. На его основе можно создать свой файл:
$ sudo mcedit /etc/apache2/apache2.conf
# Подключаем пользовательский интерфейс
Alias /abills "/usr/abills/cgi-bin/"
<Directory "/usr/abills/cgi-bin">
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1]
Options Indexes ExecCGI SymLinksIfOwnerMatch
</IfModule>
...
# Интерфейс администратора
<Directory "/usr/abills/cgi-bin/admin">
AddHandler cgi-script .cgi
Options Indexes ExecCGI FollowSymLinks
AllowOverride none
DirectoryIndex index.cgi
order deny,allow
allow from all
</Directory>
Смотрим, от имени какого пользователя работает веб-сервер, и устанавливаем нужные права доступа на каталоги:
$ grep User /etc/apache2/apache2.conf
User www-data
$ sudo chown -Rf www-data /usr/abills/cgi-bin
$ sudo chown -Rf www-data /usr/abills/Abills/templates
Каталог backup предназначен для хранения архива БД, по умолчанию он не создается, но для работы весьма желателен:
$ sudo mkdir /usr/abills/backup
$ sudo chown -Rf www-data /usr/abills/backup
И перезапускаем апач командой «/etc/init.d/apache2 restart».
Последние настройки
Для корректной работы потребуется несколько Perl модулей, в документации проекта предлагается загружать их с CPAN:
$ sudo perl -MCPAN -e shell
cpan> install DBI
cpan> install DBD::mysql
cpan> install Digest::MD5
cpan> install Digest::MD4
cpan> install Crypt::DES
cpan> install Digest::SHA1
cpan> install Bundle::libnet
cpan> install Time::HiRes
cpan> quit
Скажу, что нужны не все указанные модули. Так, libnet понадобится
только, если планируется использовать базу паролей Unix, а Time-HiRes –
для тестирования скорости. Наверняка, в репозитарии твоего дистрибутива
основные модули тоже есть. В Ubuntu используем команду:
$ sudo apt-get install libdbi-perl libdbd-mysql-perl libmd5-perl \
libdigest-md4-perl libdigest-sha1-perl libcrypt-des-perl
Теперь переходим непосредственно к настройке ABillS. В архиве есть
шаблон конфигурационного файла, переименовываем его и приступаем к
настройкам:
$ sudo cp /usr/abills/libexec/config.pl.default /usr/abills/libexec/config.pl
Все параметры трогать не будем, только самые необходимые и интересные. Остальные пока можно оставить в значениях по умолчанию.
$ sudo mcedit /usr/abills/libexec/config.pl
# Настройка доступа к БД
$conf{dbhost}='localhost';
$conf{dbname}='abills';
$conf{dbuser}='abills';
$conf{dbpasswd}='password';
$conf{dbtype}='mysql';
# Следующий параметр подписан, как рекомендуемый для MySQL 5, но у меня все работало и без него
#$conf{dbcharset}='cp1251';
# Отправка сообщений
$conf{ADMIN_MAIL}='admin@yourhost.com';
$conf{USERS_MAIL_DOMAIN}='yourhost.com';
# secretkey используется для шифрования паролей администраторов и пользователей;
# в идеале его нужно изменить, но тогда не забудь это сделать и в abills.sql
$conf{secretkey}="test12345678901234567890";
# Проверяем депозиты по текущим сессиям, при достижении негативного баланса обрываем соединение
$conf{periodic_check}='yes';
И в /etc/crontab вставляем код, необходимый для периодического запуска скриптов:
*/5 * * * * root /usr/abills/libexec/billd -all
1 0 * * * root /usr/abills/libexec/periodic daily
1 0 * * * root /usr/abills/libexec/periodic monthly
На этом настройки ABillS закончены.
Устанавливаем PPPoE
Для примера попробуем подключить ABillS к PPPoE-серверу. Это самый
простой, но в тоже время и самый востребованный вариант. Установим пакет
pppoe, остальные компоненты уже есть в системе:
$ sudo apt-get install pppoe
Проверяем, загружены ли необходимые модули:
$ lsmod | grep ppp
pppoe 15680 2
pppox 4872 1 pppoe
ppp_generic 29332 6 pppoe,pppox
slhc 7552 1 ppp_generic
Если вывод ничего не показывает, загружаем «modprobe pppoe».
Записываем в файл /etc/ppp/options строку «plugin rp-pppoe.so». За
настройку PPPoE-сервера отвечает файл /etc/ppp/pppoe-server-options, в
Ubuntu его нет, поэтому создаем:
$ sudo mcedit /etc/ppp/pppoe-server-options
logfile /var/log/pppoe.log
debug
mtu 1472
mru 1472
auth
login
default-asyncmap
ktune
lcp-echo-interval 20
lcp-echo-failure 2
# Прописываем здесь IP-адрес DNS-сервера, который будет выдаваться клиентам
ms-dns 192.168.1.254
proxyarp
# Пока оставляем эти строки закомментированными
# plugin radius.so
# plugin radattr.so
Для проверки правильности настройки сервера PPPoE создадим тестовую
учетную запись. Открываем файл /etc/ppp/chap-secrets и записываем в нее
одну строку:
test * password *
Запускаем PPPoE сервер:
$ sudo pppoe-server -I eth1 -L 192.168.0.10 -O /etc/ppp/pppoe-server-options
Параметр '-I' позволяет указать на используемый интерфейс (по дефолту
идет eth0). При помощи '-L' указываем локальный адрес. По умолчанию
удаленным компьютерам назначаются адреса в диапазоне с 10.67.15.1. При
помощи '-R' можно назначить начальный адрес из другого диапазона.
Пробуем подключиться с удаленной машины, создав новое соединение и
используя указанный логин и пароль. За ходом подключения можно следить,
набрав в консоли «tail -f /var/log/pppoe.log», нужная информация есть и в
/var/log/messages.
Если все работает, то подключаем PPPoE-сервер к FreeRADIUS. Для этого
снимаем комментарий с указанных выше строк (в /var/log/messages должна
присутствовать строка «Plugin radius.so loaded», говорящая о загрузке
требуемого модуля). Создаем файл /etc/ppp/radius/radiusclient.conf, в
котором будем описывать подключение к серверу.
$ sudo mkdir /etc/ppp/radius
$ sudo mcedit /etc/ppp/radius/radiusclient.conf
authserver localhost:1812
acctserver localhost:1813
И в файл /etc/radiusclient/servers заносим строку для аутентификации
подключаемого клиента, она должна совпадать с данными, записанными в
файле сервера /etc/freeradius/clients.conf. То есть, в нашем случае это:
localhost password123
Настало время взглянуть на интерфейс ABillS.
Использование веб-интерфейса ABillS
Теперь, когда все компоненты настроены и проверены, набираем в
веб-браузере адрес http://localhost/admin и регистрируемся, используя
учетную запись и пароль abills/abills. Для удобства сначала локализуем
интерфейс. Переходим в «Profile – Language», выбираем Russian и нажимаем
Set. Далее, заполняя поля в «Система – Сервер доступа», регистрируем
NAS сервер. Все параметры прописывать необязательно. Достаточно указать в
«IP» адрес сервера (он должен быть описан в
/etc/freeradius/clients.conf), в «Название» – его обозначение. В «Тип»
устанавливаем Other NAS server. После нажатия кнопки «Добавить» описание
нового сервера появится в таблице, внизу страницы. Нажимаем ссылку IP
POOLS и в FIRST IP вводим начало диапазона IP-адресов, а в COUNT – общее
количество адресов. Чтобы подключить пользователя, следует вначале
создать хотя бы один тарифный план. Переходим в Система - Dialup/VPN -
Тарифные планы. Пока все заполнять не нужно, достаточно в «#» ввести
номер, отличный от 0, и имя в «Название». При необходимости здесь же
указываются лимиты по времени и трафику, платежи и прочее.
И, наконец, создание нового клиента. Здесь также все просто: выбираем
Клиенты – Логины – Добавить, вводим логин (например, test) и отмечаем
флажок «Денежный счет: Создать». После нажатия на кнопку «Добавить»
появится окно с информацией о клиенте. Текущее состояние показано как
«Не активизирован», выбираем справа ссылку Dialup/VPN и в новом окне
нажимаем «Активация». Чтобы клиент мог подключиться, нужно создать
пароль и пополнить счет. Нажимаем в левой вкладке ссылку «Пароль» и
вводим его дважды, затем переходим в «Оплаты» и заносим некоторую сумму
на счет.
Для начала лучше провести тестирование подключения нового
пользователя при помощи утилиты radtest (как вариант, можно использовать
скрипт libexec/radtest.sh, идущий в поставке ABillS). Формат команды
проверки такой:
radtest testuser testpassword IP-RADIUS:1812 0 radius_secret 0 IP_NAS
То есть, в нашем примере:
$ radtest test password 127.0.0.1:1812 0 password123 0 127.0.0.1
Sending Access-Request of id 126 to 127.0.0.1 port 1812
User-Name = "test"
User-Password = "password"
NAS-IP-Address = 127.0.0.1
NAS-Port = 0
Framed-Protocol = PPP
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=126, length=38
Session-Timeout = 722541
Framed-IP-Address = 192.168.2.34
Framed-IP-Netmask = 255.255.255.255
В журнале /usr/abills/var/log/abills.log должна появиться строка о
допуске нового клиента. Теперь можно попробовать соединиться удаленно. У
меня все заработало, только когда я подключил дополнительные словари в
/etc/freeradius/dictionary:
$INCLUDE /usr/share/freeradius/dictionary.microsoft
$INCLUDE /usr/share/freeradius/dictionary.unix
Чтобы клиенты могли выйти в Сеть, следует настроить маскарадинг. Проще это сделать, установив пакеты ipmasq и dnsmasq.
В результате мы получили готовую систему раздачи интернета, обладающую всеми необходимыми функциями.
INFO
ABillS позволяет производить учет времени работы и трафика диалап и
VPN пользователей с выдачей статистики за любой период времени.
ABillS умеет разделять трафик на три вида (внутренний, внешний, бесплатный) и ограничивать скорости.
Если ABillS показался слишком сложным в настройке, попробуй Stargazer (stargazer.dp.ua).
О том, как поднять простую систему учета трафика в FreeBSD, ты можешь
прочитать в ][акере #064, в статье «Подсчитаем каждый байт!».
VIDEO
На прилагаемом к журналу диске ты найдешь видеоролик по установке ABillS.
WWW
Хорошую статью по настройке связки ABillS + Mikrotik на Gentoo Linux найдешь по адресу ru.gentoo-wiki.com/Abills.
Содержание
Источник: http://www.xakep.ru/magazine/xa/112/136/1.asp |