Настройка биллинговой системы abills + VPN + radius + mysql
Попытка адаптировать документацию по биллинговой системе ABILLS применительно к использованию ее под ОС Linux
Примечание: Эта статья написана для abills V0.35 и Mandriva 2007.1.При использовании других версий настройка может немного отличаться. Что замечу, то внесу, а что нет так нет.
Постепенно документация изменяется. В данный момент уже проверена работа с Mandriva 2010.0 + radius 2.1.7 + abills 0.5.0. Все замечания прошу присылать мне
Этот документ базируется на оригинальной документации по ABILLS от Asmodeus’а http://www.abills.net.ua/wiki/doku.php
Здесь будет описана установка биллинга для VPN сервера (abills + pppd + pptpd) Пути установки программ и расположения конфигурационных файлов несколько изменены по сравнению с оригинальной документацией. Вы можете их изменять, однако отдавайте себе отчет, что при этом потребуется изрядно переконфигурировать весь комплекс программ. Все компоненты (NAS, radius, web-сервер, база данных) расположены на одном сервере, хотя это не исключает возможности вынести например NAS или базу данных на другую машину.
Итак- устанавливаем пакеты, нужные для настройки биллинга freeradius-*.rpm, libfreeradius1-*.rpm, libfreeradius1-mysql-*.rpm, libradius0-*.rpm, ppp-radius-*.rpm, pptpd-server-*.rpm, radiusclient-utils-*.rpm, webmin*.rpm
Содержание
- 1 Возможности ABillS
- 2 pppd
- 3 pptpd
- 4 Установка freeradius
- 5 Radiusclient
- 6 Проверка конфигурационных файлов freeradius
- 7 MYSQL
- 8 Perl modules
- 9 Abills
- 10 Web server
- 11 Шейпер
- 12 Конфигурирование NAS
- 13 Добавляем статистику
- 14 Как перевести web интерфейс с кодировки cp1251 на utf8
- 15 Настройка подключения к Totol Control
Возможности ABillS
- Тарификация по времени
- Тарификация по трафику
- Периодические отчисления (месячная и дневная абонплата)
- Возможность раздельной и совместной тарификации по времени и трафику
- Ограничение доступа в интернет по времени суток
- Callback
- Система скидок
- Установка минимальной цены сессии
- Работа с неограниченным количеством NAS серверов
- Авторизация по SQL базе даных или по системной UNIX базе паролей
- Авторизация по PAP, CHAP, MS-CHAP, MS-CHAPv2+MPPE (CHAP, MS-CHAP, MS-CHAPv2 при сохраниени паролей в SQL базе)
- Шифрование траффика MPPE
- IEEE 802.1x
- Авторизация PPPoE по MAC адресу
- Авторизация PPTP по IP адресу (для MPD по IP и MAC одновременно)
- Изменение тарифного плана или снятие денег со счета по расписаню
- Классификация трафика (внутрений, внешний, бесплатный) (Только для VPN, Ipnet)
- Ограничение скорости в зависимости от вида трафика и времени суток (Только для VPN)
- Создание месячных предоплаченых по трафику пакетов
- Дневные, недельные и месячные лимиты по трафику и времени
- Отчёты по работе системы и с остоянию счетов за любой период времени
- Генерация и отправка администратору добовых и месячных отчётов по работе системы
- WEB интерфейс управления системой с возможностью настроики прав доступа
- Лог действий администратора, менеджера
- Ограничение сессий по количеству общего (in+out) трафика (для exppp, mpd, pppd + RADIUS plugin (Linux))
- Несъёмный минимум для подключений к NAS серверам (Tarif Plans → Credit Tresshold)
- Выписка счётов из пользовательского интерфейса
- Обратная связь
- Система предоплаченых карт.
- VoIP – GNU Gatekeeper, Asterisk
- Система пополнения через платёжные системы Webmoney.ru и RUpay.ru
- Squid монитор
- SNMP монитор и набор утилит для работы с NAS серверами.
- Система рассылки сообщений для пользователей.
- Распространяется по лицензии GNU GPL 2
pppd
Правим файл /etc/modprobe.preload и /etc/modules, добавляя в конец строку ppp_mppe и делаем
#modprobe ppp_mppe
И если он загрузился, можно проверить командой
lsmod | grep ppp
прописываем его в /etc/modules.
Примечание: В Mandriva 2008 и выше модуль грузится вместе с демоном pptpd (VPN сервер) и прописывать его никуда не надо (но хуже не будет).
Создаем файл /etc/ppp/options.pptpd со следующим содержимым:
mtu 1490 mru 1490 ms-dns 172.16.130.1 # ip адресс DNS сервера ipcp-accept-local ipcp-accept-remote lcp-echo-failure 30 lcp-echo-interval 5 auth +mschap-v2 defaultroute mppe required,stateless #plugin radius.so #plugin radattr.so #debug
Более детальное описание опций здесь - http://mppe-mppc.alphacron.de/
Примечание: в последнее время я пришел к выводу, что MPPE и MPPC в домашней сети не такая уж и полезная фича. Ресурсов отъедает прилично. По этому если вы строите NAS на недостаточно производительном железе, подумайте, нужно ли оно вам. Возможно лучшим выходом будет отключить обязательное шифрование в виндовом клиенте.
pptpd
pptpd, (подпольная кличка - PopTop) можете взять из своего дистрибутива
Правим файл /etc/pptpd.conf :
ppp /usr/sbin/pppd option /etc/ppp/options.pptpd debug # stimeout 10 # noipparam logwtmp bcrelay eth0 localip ***.***.***.*** # Здесь IP адрес вашего сервера в локальной сети #remoteip 192.168.0.234-238,192.168.0.245 # Закоментировать, назначается #радиусом
- Редактируем файл /etc/ppp/chap-secret
# Secrets for authentication using CHAP # client server secret IP addresses vova * vova 192.168.200.5
- Перезапускаем pptpd демон и пробуем войти по VPN c Win машины с авторизацией CHAP, или MS-CHAP V2 c шифрацией трафика с именем vova и паролем vova. Если все ок, снимаем ремарки со строк
plugin radius.so plugin radattr.so
в файле options.pptpd и идем дальше.
Ошибки и их устранение
Не правильная версия pppd демона
Существует только на версии 2008.0
При коннекте (Mandriva 2008.0) возникает ошибка - Plugin /usr/lib/pptpd/pptpd-logwtmp.so is for pppd version 2.4.3, this is 2.4.4
В этой строке сказано, что плагин pptpd-logwtmp для записи в wtmp для старой версии pptpd 2.4.3
Есть 2 способа решения
- Закоментировать строку logwtmp в pptpd.conf
- Выкачиваем pptpd-server-1.3.0-2mdv2007.0.src.rpm, устанавливаем его, распаковвываем файл pptpd-1.3.0.tar.bz2, исправляем в файле patchlevel.h версию c 2.4.3 на 2.4.4, запаковываем все обратно (tar -cjf pptpd-1.3.0.tar.bz2 pptpd-1.3.0), заменяем файл архива новым, пересобираем пакет и устанавливаем его заново.
После установки и настройки pptpd демона в системный лог посыпались сообщения GRE: accepting packet #1
- Проблема Куча сообщений типа GRE: accepting packet #1 в системном логе (файл /var/log/syslog)
- Решение Нужно выкачать пакет pptpd-server*.src.rpm,например, с contribs ftp://ftp.mandriva.ru/mandriva/official установить его, потом расспаковать исходник pptpd-*.tar.gz2 любое место (его можно найти в /home/user_dir/rpmbuild/SOURSES), в в нем найти файл pptpgre.c и там найти строку
syslog(LOG_DEBUG, "GRE: accepting packet #%d", seq);
или
syslog(LOG_DEBUG, "GRE: accepting packet #%d",. seq);
И закоментировать ее, примерно так
/* syslog(LOG_DEBUG, "GRE: accepting packet #%d", seq); */
Потом заново запаковать исходник
tar -cjf pptpd-1.3.0.tar.bz2 pptpd-1.3.0
Переписать его поверх старого
и собрать пакет
cd /usr/src/rpm/SPEC rpm -bb pptpd-server.spec
Взято отсюда
Исправленные пакеты можно взять
Для Mandriva 2008 pptpd-server-1.3.0-2mdv2008.0.i586.rpm
Для Mandriva 2008 pptpd-server-debug-1.3.0-2mdv2008.1.i586.rpm
Для Mandriva 2010 pptpd-server-1.3.0-3mdv2010.0.i586.rpm
Для Mandriva 2010 pptpd-server-debug-1.3.0-3mdv2010.0.i586.rpm
Для Mandriva 2010.1 pptpd-server-1.3.4-1mdv2010.1.i586.rpm
Для Mandriva 2010.1 pptpd-server-debug-1.3.4-1mdv2010.1.i586.rpm
Установка freeradius
Настройка для Mandriva 2008.1 с FreeRadius v1.7.1
Настройку в Mandriva 2009.1 с данной версией радиуса я не проверял, так что если что не так, то извините.
Для настройки биллинга с FreeRadius v1.7.1, я переустановил все пакеты Radius сервера V1.7.1, из Mandriva 2008.
Для этого нужны пакеты freeradius-1.1.7-2mdv2008.0.i586.rpm, libradius0-devel-0.3.2-7mdv2008.0.i586.rpm, libradius0-static-devel-0.3.2-7mdv2008.0.i586.rpm, libfreeradius1-1.1.7-2mdv2008.0.i586.rpm, ppp-radius-2.4.4-1mdv2008.0.i586.rpm,
libfreeradius1-mysql-1.1.7-2mdv2008.0.i586.rpm, radiusclient-utils-0.3.2-7mdv2008.0.i586.rpm, libradius0-0.3.2-7mdv2008.0.i586.rpm. Их можно взять тут.
Сначала удаляем соответствующие пакеты, с помощью urpme, например
# urpme freeradius # urpme libfreeradius и другие ...
А потом устанавливаем выше указанные, через rpm, например
rpm -i libradius0-0.3.2-7mdv2008.0.i586.rpm
Пакет libfreeradius1-1.1.7-2mdv2008.0.i586.rpm устанавливать с ключами -i --nodeps.
Настройка для freeradius 1.7.*
Переименовываем файл
#mv /etc/raddb/users /etc/raddb/users.old
Создаем новый файл /etc/raddb/users и вставляем туда строки
DEFAULT Auth-Type = Accept Exec-Program-Wait = "/usr/abills/libexec/rauth.pl"
Правим файл /etc/raddb/acct_users
#Перед Exec-Program должен быть пробел #Если каждого аккаунтинг-запроса в памяти оставались зомби-процессы racct.pl, то замените #замените в файле acct_users Exec-Program на Exec-Program-Wait 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"
Не забываем про пробелы перед Exec-Program
У большинства такая конфигурация работает нормально, а в моем случае после каждого аккаунтинг-запроса в памяти оставались зомби-процессы racct.pl. Проверить это можно командой:
ps ax|grep racct
Если у вас тоже остаются зомби, то рекомендую заменить в файле acct_users Exec-Program на Exec-Program-Wait
/etc/raddb/clients.conf В этот файл нужно вписать IP адрес или имя NAS сервера с которого будут поступать данные для радиуса и пароль доступа, те исправить строки secret.
client localhost { # Ниже пароль для доступа к радиусу. Запомните его, он # понадобится в п. 8 secret = radsecret shortname = shortname }
/etc/raddb/radiusd.conf- Если вы желаете использовать MPPE, MPPC, MS-Chap V2 (протоколы шифрования и компрессии от M$ - для VPN очень желательно) то в файл /etc/raddb/radiusd.conf вносятся следующие изменения: В секции mschap {
use_mppe = yes require_encription = yes require_strong = yes
Cоздаются функции для преавторизации и поставторизации в секции modules {
exec pre_auth { wait = yes program = "/usr/abills/libexec/rauth.pl pre_auth" input_pairs = request output_pairs = config } exec post_auth { wait = yes program = "/usr/abills/libexec/rauth.pl post_auth" input_pairs = request output_pairs = config }
В секции ‘authorize’ внести ‘pre_auth’ и раскоментировать ‘mschap’.
Внимание В Mandriva 2008.1 секции authorize и post-auth вынесены в отдельный файл /etc/raddb/sites-inabled/default
authorize { pre_auth preprocess # auth_log # attr_filter chap mschap suffix files }
Для оповещения о неавторизированых пользователях правим секцию post-auth
post-auth { Post-Auth-Type REJECT { post_auth } }
Настройка для freeradius 2.*
Огромное спасибо пользователю Andrushka с форума abills
Переименовываем файл
#mv /etc/raddb/users /etc/raddb/users.old
Создаем новый файл /etc/raddb/users и вставляем туда строку
DEFAULT Auth-Type = Accept
Файл /etc/raddb/clients.conf В этом файле нужно исправить строки secret.
# Ниже пароль для доступа к радиусу. Запомните его, он # понадобится в п. 8 secret = radsecret
Файл /etc/raddb/modules/mschap- Если вы желаете использовать MPPE, MPPC, MS-Chap V2 (протоколы шифрования и компрессии от M$ - для VPN очень желательно) то в этот файл вносятся следующие изменения:
mschap{ use_mppe = yes require_encription = yes require_strong = yes }
Файл radiusd.conf в секции modules описываем такие секции:
abills_preauth exec abills_preauth { program = "/usr/abills/libexec/rauth.pl pre_auth" wait = yes input_pairs = request shell_escape = yes #output = no output_pairs = config } abills_postauth exec abills_postauth { program = "/usr/abills/libexec/rauth.pl post_auth" wait = yes input_pairs = request shell_escape = yes #output = no output_pairs = config } abills_auth exec abills_auth { program = "/usr/abills/libexec/rauth.pl" wait = yes input_pairs = request shell_escape = yes output = no output_pairs = reply } abills_acc exec abills_acc { program = "/usr/abills/libexec/racct.pl" wait = yes input_pairs = request shell_escape = yes output = no output_pairs = reply }
Файл /etc/raddb/sytes-inable/default - правим секции authorize, preacct, post-auth. Остальное в этих секциях ремарим.
authorize { preprocess abills_preauth mschap files abills_auth } preacct { preprocess abills_acc } post-auth { Post-Auth-Type REJECT { abills_postauth } }
В файле /etc/raddb/modules/exec
exec { wait = yes input_pairs = request shell_escape = yes output = none output_pairs = reply }
В версии Abills 0.4.3 и больше, что написано ниже делать не надо. А надо только добавить строчку в файл /usr/abills/libexec/config.pl
$conf{RADIUS2}=1;
Правим файл /usr/abills/Abills/mysql/Auth.pm
Было строка ~1452
my $list = $self->{list}->[0]; my $password = $list->[0]; $self->{'RAD_CHECK'}{'User-Password'}="$password"; print "User-Password == \"$password\""; return 0;
Стало
my $list = $self->{list}->[0]; my $password = $list->[0]; $self->{'RAD_CHECK'}{'User-Password'}="$password"; # freeeradius 1xx #print "User-Password == \"$password\""; # freeradius v2 print "Cleartext-Password := \"$password\""; return 0;
Настройка библиотек - для обоих Радиусов.
Для нормальной работы с NAS на основе pppd необходимо добавить в файл словарей freeradius’а /etc/raddb/dictionary и /etc/radiusclient/dictionary следующие строки (между колонками дб табуляции):
# Limit session traffic ATTRIBUTE Session-Octets-Limit 227 integer # What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out) ATTRIBUTE Octets-Direction 228 integer # Connection Speed Limit ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer
Radiusclient
В мандивовском клиенте не хватает нескольких библиотек для работы. Я делал так выкачал с www.samba.org/ppp дистрибутив ppp-2.4.5.tar.gz. Распаковал в /usr/local/src
# ./configure # make
Далее переписываем содержимое каталога /usr/local/src/ppp-2.4.5/pppd/plugins/radius/etc в каталог /etc/radiusclient/, кроме файла /etc/radiusclient/radiusclient.conf
Правим файл /etc/radiusclient/radiusclient.conf:
authserver 127.0.0.1 acctserver 127.0.0.1
В файл /etc/radiusclient/servers вносим IP адрес радиус-сервера и соответствующий ему пароль (см п.1)
127.0.0.1 radsecret
Проверка конфигурационных файлов freeradius
check-radiusd-config -level 345 radiusd on
Если все ок, то:
Radius server configuration looks OK.
При отладке останавливаем freeradius, и запускаем freeradius -X
MYSQL
Создаем файл pre_abills.sql следующего содержания:
use mysql; INSERT INTO user (Host, User, Password) VALUES ('localhost','abills',password('sqlpassword')); INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Index_priv, Alter_priv) VALUES ('%', 'abills', 'abills', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); CREATE DATABASE abills DEFAULT CHARSET=cp1251;
Не забудьте исправить sqlpassword на свое усмотрение. Для тех кто не понял, это пароль mysql-пользователя abills, необходимый для доступа к базе данных abills
Cоздаём пользователя и базу.
Далее делаем в консоли.
# mysql -u root -p < pre_abills.sql # mysqladmin flush-privileges
Я просто создал пользователя в webmin, дал ему полный доступ к базе “abills” и установил пароль.
На этом настройка mysql завершена.
Perl modules
Для работы системы нужны модули.
DBI DBD::mysql Digest-MD5 для Chap авторизации Digest-MD4 для MS-Chap авторизации Crypt-DES для MS-Chap авторизации Digest-SHA1 для MS-ChapV2 авторизации libnet Нужен только при авторизации из UNIX passwd Time-HiRes Нужен только для тестирования скорости выполнения авторизации, акаунтинга, и страниц веб интерфейса. DB_File
Все модули, кроме DBI есть в rpm-ax.
Установить модуль perl-devel-*.rpm
Установить модули Perl-DBD-mysql-*.rpm и Perl-DB_File-*.rpm
Очень удобно эти модули загрузить с сайта | www.cpan.org или установка с консоли. Вот способ установки:
# cd /root # perl -MCPAN -e shell o conf prerequisites_policy ask install DBI install Digest::MD5 install Digest::MD4 install Crypt::DES install Digest::SHA1 install Bundle::libnet install Time::HiRes quit
Abills
Скачиваем и распаковываем последний релиз версии в отдельный каталог:
cd /usr/src/abills_distr wget http://puzzle.dl.sourceforge.net/sourceforge/abills/abills-0.xx.tgz tar -xvzf abills-0.xx.tgz
Правим конфигурационый файл системы /usr/abills/libexec/config.pl:
#DB configuration $conf{dbhost}='localhost'; $conf{dbname}='abills'; $conf{dbuser}='abills'; #Если Вы используете Radius 2, то $conf{RADIUS2}=1; #Здесь нужно подставить пароль mysql-пользователя abills (п.2) $conf{dbpasswd}='sqlpassword'; $conf{ADMIN_MAIL}='info@your.domain'; $conf{USERS_MAIL_DOMAIN}="your.domain"; #For MySQL 5 and highter $conf{dbcharset}='cp1251'; # используется для шифрования паролей администраторов и пользователей. $conf{secretkey}="test12345678901234567890"; #Лимит трафика на сессию, больше нельзя, изза глюка radiusclient'а # Не забудте поправить, иначе клиенты Linux коннектится не будут. $conf{MAX_SESSION_TRAFFIC}=2047; # Проверять депозит по текущим сессиям, при достижении 0 сбрасывать с линии $conf{periodic_check}=’yes’;
При использовании модуля Dv полезно так же добавить в конфиг следующие параметры, и изменить их по своему усмотрению.
$conf{MAC_AUTO_ASSIGN}=0; # Заполнять поле CID при cоединении, если оно не заполнено $conf{DV_USER_CHG_TP}=0; # Разрешить пользователю менять тарифный план из своего веб акаунта $conf{ERROR_ALIVE_COUNT}=3; # Количество периодов не пришедших Alive пакетов после которого сесия # автоматом попадает в Zap таблицу
При изменении значения в $conf{secretkey} поменяйте его также в файле abills.sql из дистрибутива abills. После этого загружаем структуру таблиц в базу:
#mysql -D abills < abills.sql
Для того, чтобы можно было осуществлять hangup подключенного пользователя необходимо добавить в файл /etc/sudoers:
apache ALL = NOPASSWD: /usr/abills/misc/pppd_kill
Вносим в cron периодические процессы, /etc/crontab (уберите восклицательный знак в начале первой строки):
*/5 * * * * root /usr/abills/libexec/billd -all 1 0 * * * root /usr/abills/libexec/periodic daily 1 0 1 * * root /usr/abills/libexec/periodic monthly
Если хотите, чтоб ежедневно осуществлялось автоматическое резервное копирование базы данных, добавьте туда же:
1 3 * * * root /usr/abills/libexec/periodic backup
Определяем от имени какого пользователя запускается web-сервер в нашей системе. Для этого надо просмотреть файл httpd.conf и найти в нем директиву User, которая определяет имя владельца процесса. В моем случае:
User apache
Устанавливаем права на чтение и запись вебсервером для файлов веб интерфейса
chown -Rf apache /usr/abills/cgi-bin
Создаем недостающие каталоги:
mkdir /usr/abills/backup chown apache /usr/abills/backup mkdir /usr/abills/var mkdir /usr/abills/var/log
Правим файл /usr/abills/Abills/defs.conf. После правки я бы рекомендовал скопировать этот файл в defs.conf.old, что бы после обновления abills не пришлось снова его править.
$SNMPWALK = '/usr/bin/snmpwalk'; $GZIP = '/bin/gzip'; $MYSQLDUMP = '/usr/bin/mysqldump';
В вашем случае пути к этим программам могут быть иными, проверьте командой which.
Еще: freeradius будет ругаться, что у вас нет логов abills, поэтому мы это исправляем.
touch /usr/abills/var/log/abills.log chown radius /usr/abills/var/log/abills.log
Далее настраиваем apache . Открываем веб интерфейс - https://your.host:9433/abills/admin/ Логин администратора по умолчанию - abills , пароль - abills. От имени этого администратора будут выполняться различные операции в автоматическом режиме, например снятие абонплаты в начале месяца, по этому удалять его не нужно, нужно только изменить пароль на более безопасный. Для реальных администраторов необходимо завести свои аккаунты и назначить им необходимые права: Система → Администраторы
Если впоследствии вам понадобится самая свежая функциональность обновления из CVS можно производить следующим образом:
cd /usr/src/abills_distr cvs -d:pserver:anonymous@abills.cvs.sourceforge.net:/cvsroot/abills login cvs -z3 -d:pserver:anonymous@abills.cvs.sourceforge.net:/cvsroot/abills checkout -r rel-0-3 abills cp -Rf abills /usr/ chown -Rf apache /usr/abills/cgi-bin
После этого изучаем changelog и выполняем необходимые рекомендации.
Тот кто выполнил все предыдущие пункты и увидел вебинтерфейс заслужил первую бутылку пива. Дальнейшее описание специфично именно для Linux-систем с pppd.
Web server
Для работы web-интерфейса требуется установить и настроить web сервер. Как и в случае с mysql нет особого смысла собирать его из исходников, поскольку любой приличный дистрибутив уже имеет в своем составе web-сервер Apache. Он должен быть собран и сконфигурирован с поддержкой модуля mod_rewrite. Переписываем файл /usr/abills/misc/apache/abills_httpd.conf в каталог /etc/httpd/conf/vhosts.d/
1. В файле /etc/httpd/conf/httpd.conf
Было
#NameVirtualHost *:80
Стало
NameVirtualHost *
Ошибка в версии 0.36b
Для того, что бы заработало, надо изменить файл abills_httpd.conf
Было
#Abills version 0.3 Listen 9443 <VirtualHost _default_:9443> DocumentRoot "/usr/abills/cgi-bin"
Стало
#Abills version 0.3 NameVirtualHost *:9443 Listen 9443 <VirtualHost *:9443> DocumentRoot "/usr/abills/cgi-bin" ############### Alias /abills "/usr/abills/cgi-bin/" ##############
Создание ssl сертификата
В версии abills 0.36b в файл abills_httpd.conf добавлен ssl сертификат
Его можно создать двумя способами
Используем скрипт /usr/abills/misk/sslserts.sh
Запускаем скрипт
/usr/abills/misc/sslcerts.sh apache
И отвечаем на вопросы, которые будет задавать скрипт. В конце получим 2 сертификата, лежащий в папке /usr/abills/Certs
После этого править файл /etc/httpd/conf/vhosts.d/abills_httpd.conf не надо.
С помощью своего скрипта
Делаем следующее:
# cd /etc/ssl # mkdir db # mkdir ca # mkdir clients # touch /etc/ssl/db/index.txt # echo "01" > /etc/ssl/db/serial
Создаем скрипт для создания нашего самоподписанного доверенного сертификата (CA) /etc/ssl/make_ca.sh :
#!/bin/sh openssl req -new -newkey rsa:4096 -nodes -keyout ./ca/ca.key -x509 -days 3650 \ -subj /C=RU/ST=Russia/L=Vologda/O=EI/OU=IT/CN=mail.volmed.org.ru/emailAddress=misk@volmed.org.ru -out ./ca/ca.crt
Где mail.volmed.org.ru адрес нашего почтового сервера
Запускаем скрипт make_ca.sh. Какое-то время он будет возиться с генерацией секретного ключа длиной в 4096 бит, на слабой машине это займет время... можете уменьшить длину ключа до 1024 или 2048 бит, если очень не терпится все поскорее попробовать. В итоге мы получим два файла в каталоге /etc/ssl/ca:
ca.crt - это наш самоподписанным доверенный сертификат, и
ca.key - его секретный ключ.
Правим файл /etc/httpd/conf/vhosts.d/abills_httpd.conf.
Добавляем строку. Было
Listen 9443 <VirtualHost _default_:9443> DocumentRoot "/usr/abills/cgi-bin"
Стало
Listen 9443 <VirtualHost _default_:9443> Alias /abills "/usr/abills/cgi-bin/" DocumentRoot "/usr/abills/cgi-bin"
Было
SSLCertificateFile /usr/abills/Certs/server.crt SSLCertificateKeyFile /usr/abills/Certs/server.key
Стало
SSLCertificateFile /etc/ssl/ca/ca.crt SSLCertificateKeyFile /etc/ssl/ca/ca.key
И перезапускаем вебсервер
# /etc/init.d/httpd restart
Для доступа к web интерфейсу abills нужно открыть в фаерволе 9443 port и в строку адреса браузера набирать
https://host:9443/abills/admin
Шейпер
Спасибо ran. Взято тут.
Что бы включить шейпер, пишем скрипт /etc/ppp/ip-pre-up:
#!/bin/sh TC="/sbin/tc" TCQA="$TC qdisc add dev $IFNAME" TCQD="$TC qdisc del dev $IFNAME" $TCQD root &>/dev/null $TCQD ingress &>/dev/null $TCQA root handle 1: htb $TCQA handle ffff: ingress /usr/abills/libexec/linkupdown ipn up $IFNAME $PEERNAME $IPREMOTE OS=Linux
Предварительно убрав все старые скрипты шейпера, если таковые имели место быть.
Трафик будет шейпится согласно классам, описанным в интервалах ТП (независимо от наличия модуля Ipn) или в соответствии с / Клиенты/ Логины/ Информация/ Сервисы/ Dialup / VPN/Скорость (kb): (более высокий приоритет, независимо от ТП)
в config.pl желательно прописать:
$conf{IPN_FW_FIRST_RULE}=1; $conf{IPN_FW_RULE_UID}=1;
Конфигурирование NAS
Теперь необходимо сконфигурировать NAS.
Заходим в web-интерфейс администратора https://your.host:9433/abills/admin/
Логин - abills
пароль - abills
Идем: Система → Сервер доступа Создаем новый NAS с необходимыми параметрами.
В нашем случае:
IP 127.0.0.1 Название (произвольно, напр. - vpn1) Radius NAS-Identifier Идентификатор сервера (можно не вписывать) Опис Описание сервера (Произв) Type pppd:pppd + Radius plugin (linux) Authorization SQL Alive 60 Disable IP:PORT User Password RADIUS Parameters Acct-Interim-Interval=60
Значение Alive и значение параметра Acct-Interim-Interval нужно выбирать одинаковым. Осталось создать | тарифные планы и завести юзеров..
- Проверяем
# radtest testuser testpassword 127.0.0.1:1812 0 radpasswd 0 127.0.0.1
- testuser - имя пользователя из базы
- testpassword - его пароль
- radpasswd - пароль из файла /etc/radiusclient/servers
- Если всё правильно настроено, в файле логов /usr/abills/var/log/abills.log должна появиться строка
2005-02-23 12:55:55 LOG_INFO: AUTH [testuser] NAS: 1 (xxx.xxx.xxx.xxx) GT: 0.03799
Если radius сервер на одной машине, а radius клиент на другой
Допустим, что
ip адрес машины радиус сервера 192.168.1.10
ip адрес машины радиус клиента 192.168.1.20
1. Правим файл /etc/raddb/users.conf
client 192.168.1.20 {
2. Заходим в http://192.168.1.10/abills/admin
Далее Система ---> Сервер доступа
Выбираем нужный NAS сервер и меняем его IP адрес на 192.168.1.10
3. Проверка - из консоли мфшины 192.168.1.20 запускаем
radtest user passuser 192.168.1.10:1812 0 radpasswd 0 192.168.1.10
Где user и passuser - имя и пароль одного из пользователей abills.
radpasswd - пароль из файла /etc/raddb/users.conf
Добавляем статистику
abills/libexec/config.pl
$conf{s_detalization}='yes'; | Более детальная статистика по сесиям |
$conf{DV_LOG_CLEAN_PERIOD}=90 | Время хранения логов детализации. Задаётся в днях. |
В свободной версии нет подробной статистики по alive пакетам.
Для ее добавления делаем следующее (но без гарантии, что все правильно).
Редактируем файл /usr/abills/Abills/mysql/Acct.pm
Строка ~236 Вставляем строки
После
elsif ($conf->{rt_billing}) { $self->rt_billing($RAD, $NAS); }
Вставляем
###################my######################################### $self->query($db, "SELECT acct_input_octets, acct_output_octets FROM dv_calls WHERE user_name='$RAD->{USER_NAME}' and acct_session_id='$RAD->{ACCT_SESSION_ID}';"); my $a_ref1 = $self->{list}->[0]; ($self->{INPUT33}, $self->{OUTPUT33}, )= @$a_ref1; ##################my########################################
Было. Строка ~264
#detalization for Exppp if ($conf->{s_detalization} eq 'yes') { $RAD->{INTERIUM_INBYTE}=0 if (! defined($RAD->{INTERIUM_INBYTE})); $RAD->{INTERIUM_OUTBYTE}=0 if (! defined($RAD->{INTERIUM_OUTBYTE})); $RAD->{INTERIUM_INBYTE2}=0 if (! defined($RAD->{INTERIUM_INBYTE2})); $RAD->{INTERIUM_OUTBYTE2}=0 if (! defined($RAD->{INTERIUM_OUTBYTE2}));
Стало
#detalization for Exppp if ($conf->{s_detalization} eq 'yes') { ###########################my################################### $self->{INPUT33}=0 if (! defined($self->{INPUT33})); $self->{OUTPUT33}=0 if (! defined($self->{OUTPUT33})); $RAD->{INBYTE}=0 if (! defined($RAD->{INBYTE})); $RAD->{OUTBYTE}=0 if (! defined($RAD->{OUTBYTE})); $RAD->{INTERIUM_INBYTE}=$RAD->{INBYTE} - $self->{INPUT33}; $RAD->{INTERIUM_OUTBYTE} = $RAD->{OUTBYTE} - $self->{OUTPUT33}; ############################my################################### $RAD->{INTERIUM_INBYTE2}=0 if (! defined($RAD->{INTERIUM_INBYTE2})); $RAD->{INTERIUM_OUTBYTE2}=0 if (! defined($RAD->{INTERIUM_OUTBYTE2}));
Как перевести web интерфейс с кодировки cp1251 на utf8
Не удобно, когда файлы хранятся, в отличной от основной кодировке. Я тут опишу, как перевести интерфейс abills в кодировку utf8. База данных при этом остается в cp1251, что вобщем и не важно.
1. Правим файл /usr/abils/libexec/config.pl
#For MySQL 5 and highter $conf{dbcharset}='utf8';
$conf{MAIL_CHARSET}='utf8'; $conf{default_language}='russian'; $conf{default_charset}='utf-8';
2. Файл /usr/abills/Abills/XML.pm строка ~577
my $CHARSET=(defined($attr->{CHARSET})) ? $attr->{CHARSET} : 'utf-8';
3. Файл /usr/abills/Abills/defs.conf строка ~38
$lang_charset='utf-8';
4. Файл /usr/abills/Abills/HTML.pm сторока ~98
$self->{CHARSET}=(defined($attr->{CHARSET})) ? $attr->{CHARSET} : 'utf-8';
5. Спомощью команды iconv перекодируем файлы в директории /usr/abils/language/. Например, для файла russian.pl
iconv -fcp1251 -tutf8 russian.pl -orussian.pl1 mv russian.pl1 russian.pl
И поменять в них $CHARSET=" windows-1251" на $CHARSET=" utf8", хотя работает и без этого.
- Ну вот вроде и все.
Настройка подключения к Totol Control
Totol Control - это такая железяка в которую входят 16 модемов и система управления ими со своей ОС. К ней можно подключиться через сом кабкль эмулятором терминала VT100, а после установок сети и telnet оп сети. Пишу сдесь настройки, которые я делал, что бы не забыть потом.
Настройка сервера доступа
- Система ---> Сервер доступа
IP | IP адрес Totol Control |
Название | Название сервера (например NAS) |
Тип | Usr:USR Netserver 8/16 |
Авторизация | SQL |
Alive (sec) | Обязательно 0 |
IP:PORT | Адрес и порт SNMP Total Сontrol (порт обычно 161), но его можно не ставить |
Пароль | Пароль для доступа SNMP к Total Сontrol |
Остальные настройки теже.
Изменения в коде программы
Правим пути к командам в файле /usr/abills/Abills/defs.conf для команд snmpwalk, bzip, mysqldump, ifconfig
Пути можно найти с помощью команды which, например
# which snmpwalk /usr/bin/snmpwalk
Все изменения в файле /usr/abills/Abills/nas.pl
Вместо строк
elsif ($nas_type eq 'usr') { hangup_snmp($NAS, $PORT, { OID => '.1.3.6.1.4.1.429.4.10.13.'. $PORT, TYPE => 'integer', VALUE => 9 });
Вставить
elsif ($nas_type eq 'usr') { hangup_usr($NAS, $PORT, $attr); }
Вместо строк
##################################################################### # USR Netserver 8/16 #******************************************************************* # Get stats from USR Netserver 8/16 # get_usrns_stats($SERVER, $PORT) #******************************************************************* sub stats_usrns { my ($NAS, $PORT) = @_; my $SNMP_COM = $NAS->{NAS_MNG_PASSWORD} || ''; #USR trafic taker my $in = `a=\`$SNMPWALK -v 1 -c "$SNMP_COM" $NAS->{NAS_IP} interfaces.ifTable.ifEntry.ifInOctets.$PORT |\ awk '{print \$4}'\`; b=\`cat /usr/abills/var/devices/$NAS->{NAS_IP}-$PORT.In\`; c=\`expr \$a - \$b + 0\`; echo \$c`; my $out = `a=\`$SNMPWALK -v 1 -c "$SNMP_COM" $NAS->{NAS_IP} interfaces.ifTable.ifEntry.ifOutOctets.$PORT |\ awk '{print \$4}'\`; b=\`cat /usr/abills/var/devices/$NAS->{NAS_IP}-$PORT.Out\`; c=\`expr \$a - \$b + 0\`; echo \$c`; # $SNMPWALK -v 1 -c $SNMP_COM $SERVER interfaces.ifTable.ifEntry.ifInOctets.$PORT |\ awk '{print \$4}' `a=`$SNMPWALK -v 1 -c tstats 192.168.101.130 interfaces.ifTable.ifEntry.ifInOctets.$PORT |\ awk '{print \$4}'`; b=`cat /usr/abills/var/devices/$SERVER-$PORT.In`; c=`expr \$a - \$b + 0`; echo \$c`; # $stats{in} = int($in); $stats{out} = int($out); return %stats; }
Вставляем
#******************************************************************* # HANGUP USR # hangup_usr($SERVER, $PORT) #******************************************************************* sub hangup_usr { my ($NAS_IP, $PORT) = @_; $telnet_user = "!root"; $telnet_pass = "passwd_telnet"; push @commands, "login:\t$telnet_user"; push @commands, "Password:\t$telnet_pass"; push @commands, ">\treset S$PORT"; push @commands, ">exit"; my $result = telnet_cmd("$NAS->{NAS_IP}", \@commands); print $result; return 0; } ##################################################################### # USR Netserver 8/16 #******************************************************************* # Get stats from USR Netserver 8/16 # get_usrns_stats($SERVER, $PORT) #******************************************************************* sub stats_usrns { my ($NAS, $PORT) = @_; my $SNMP_COM = $NAS->{NAS_MNG_PASSWORD} || ''; #print "Port = $PORT\n"; $PORT1 = $PORT + 2; #USR trafic taker my $in = `a=\`$SNMPWALK -v 1 -c "$SNMP_COM" $NAS->{NAS_IP} interfaces.ifTable.ifEntry.ifInOctets.$PORT1 |awk 'print \$4}'\`; echo \$a`; my $out = `a=\`$SNMPWALK -v 1 -c "$SNMP_COM" $NAS->{NAS_IP} interfaces.ifTable.ifEntry.ifOutOctets.$PORT1 |awk '{print \$4}'\`; echo \$a`; $stats{in} = $in; $stats{out} = $out; $stats{error} = 0; if ( $in eq "\n" ) { if ( $out eq "\n" ){ $stats{error} = 1; } } #elsif (int($in) + int($out) > 0) { #$stats{in} = int($in); #$stats{out} = int($out); # } #print "$in\n$out\n"; return %stats; } }
где passwd_telnet - пароль доступа по telnet
Файл /usr/abills/libexec/billd Была строка ~ 194
elsif (defined($external_stats->{error})) { print "Error: Login: $line->[0], NAS-IP: $NAS{NAS_IP}, Port: $line->[2], Session-ID: $acct_session_id\n" if ($debug == 1); $sessions->online_update({ USER_NAME => $line->[0], ACCT_SESSION_ID => $acct_session_id, STATUS => 5 }); } elsif (defined($external_stats->{in})) { $sessions->online_update({ USER_NAME => $line->[0], ACCT_SESSION_ID => $acct_session_id, %$external_stats }); }
Стало
elsif (($external_stats->{error}) == 1 ) { print "Error: Login: $line->[0], NAS-IP: $NAS{NAS_IP}, Port: $line->[2], Session-ID: $acct_session_id\ n" if ($debug == 1); # Если и в предыдущий раз была ошибка, то убиваем сессию if ( $line->[18] == 5 ) { print "Kill session $line->[0]\nTime session $line->[9]\n "; print "Input traf $acct_input_octets\nOutput traf $acct_output_octets\n"; my $ACCT_INFO = $sessions->online_info({ NAS_ID => $nas_row->[0], NAS_PORT => $line->[2], ACCT_SESSION_ID => $acct_session_id }); $ACCT_INFO->{INBYTE} = $acct_input_octets; $ACCT_INFO->{OUTBYTE} = $acct_output_octets; $ACCT_INFO->{INBYTE2} = $acct_input_octets_ext; $ACCT_INFO->{OUTBYTE2} = $acct_output_octets_ext; $ACCT_INFO->{ACCT_STATUS_TYPE} = 'Stop'; $ACCT_INFO->{ACCT_SESSION_TIME} = $line->[9]; $ACCT_INFO->{ACCT_TERMINATE_CAUSE} = 15; my $r = $Acct->accounting($ACCT_INFO, \%NAS); my $info = ; } # Устанавливаем статус ошибки (5) и пишем его в базу. else { # print "Error session $line->[0]\n"; $sessions->online_update({ USER_NAME => $line->[0], ACCT_SESSION_ID => $acct_session_id, STATUS => 5 }) }; } elsif (defined($external_stats->{in})) { $sessions->online_update({ USER_NAME => $line->[0], ACCT_SESSION_ID => $acct_session_id, STATUS => 1, %$external_stats });