Настройка биллинговой системы ubuntu + abills + VPN + radius + mysql: различия между версиями

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
(pptpd)
(Полностью удалено содержимое страницы)
 
Строка 1: Строка 1:
Попытка адаптировать документацию по биллинговой системе ABILLS применительно к использованию ее под ОС Linux <br>
 
'''Примечание:''' Эта статья написана для abills V0.55 и Ubuntu 14.04. При использовании других версий настройка может немного отличаться. Что замечу, то внесу, а что нет так нет.
 
Этот документ базируется на оригинальной документации по ABILLS от Asmodeus’а http://www.abills.net.ua/wiki/doku.php
 
  
Здесь будет описана установка биллинга для VPN сервера (abills + pppd + pptpd) Пути установки программ и расположения конфигурационных файлов несколько изменены по сравнению с оригинальной документацией. Вы можете их изменять, однако отдавайте себе отчет, что при этом потребуется изрядно переконфигурировать весь комплекс программ. Все компоненты (NAS, radius, web-сервер, база данных) расположены на одном сервере, хотя это не исключает возможности вынести например NAS или базу данных на другую машину.
 
==Система==
 
==Возможности ABillS==
 
Так возможности все время меняются,то вот [http://www.abills.net.ua/wiki/doku.php/abills:docs:features:ru ссылка] на оригинальную документацию.
 
===Обновляем систему===
 
<pre>$ sudo apt-get update
 
$ sudo apt-get dist-upgrade</pre>
 
И перезагружаем систему
 
 
===Устанавливаем пакеты===
 
<pre>sudo apt-get install mysql-server mysql-client libmysqlclient-dev apache2 apache2-doc apache2-mpm-prefork \
 
apache2-utils libexpat1 ssl-cert cvs libdbi-perl libdbd-mysql-perl libdigest-md4-perl \
 
libdigest-sha-perl libcrypt-des-perl libperl-dev make pptpd</pre>
 
 
===Создаем недостающие каталоги и меняем права:===
 
<pre># mkdir -p /usr/abills/var/log
 
# touch /usr/abills/var/log/abills.log
 
# chown -Rf www-data:www-data /usr/abills/cgi-bin
 
# chown -Rf www-data:www-data /usr/abills/Abills/templates
 
# chown -Rf www-data:www-data /usr/abills/backup</pre>
 
==Закачка дистрибутива Abills==
 
Идем на страницу [http://sourceforge.net/projects/abills/ загрузки] и скачиваем последнюю версию Abills, на данный момент Abills-0.54.
 
<pre>
 
# cp abills-0.54.tgz /usr
 
# tar -xvzf abills-0.54.tgz</pre>
 
 
==PPTPD==
 
Создаем файл /etc/ppp/options.pptpd со следующим содержимым:
 
<pre>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
 
</pre>
 
Более детальное описание опций здесь - http://mppe-mppc.alphacron.de/
 
 
'''Примечание:''' в последнее время я пришел к выводу, что MPPE и MPPC в домашней сети не такая уж и полезная фича. Ресурсов отъедает прилично. По этому если вы строите NAS на недостаточно производительном железе, подумайте, нужно ли оно вам. Возможно лучшим выходом будет отключить обязательное шифрование в виндовом клиенте.
 
 
==PPTPD сервер==
 
pptpd, (подпольная кличка - PopTop) можете взять из своего дистрибутива
 
 
Правим файл /etc/pptpd.conf :
 
<pre>ppp /usr/sbin/pppd
 
option /etc/ppp/options.pptpd
 
#debug
 
# stimeout 10
 
# noipparam
 
logwtmp
 
bcrelay eth0
 
localip ***.***.***.*** # Здесь IP адрес интерфейса вашего pptpd сервера, например, 192.168.20.1
 
#remoteip 192.168.0.234-238,192.168.0.245 # Закоментировать, назначается
 
  #радиусом
 
</pre>
 
:Редактируем файл /etc/ppp/chap-secret
 
<pre># Secrets for authentication using CHAP
 
# client        server  secret                  IP addresses
 
vova    *      vova            192.168.200.5</pre>
 
:Перезапускаем pptpd демон и пробуем войти по VPN c Win машины с авторизацией CHAP,  или MS-CHAP V2 c шифрацией трафика с именем vova и паролем vova. Если все ок, снимаем ремарки со строк
 
<pre>plugin radius.so
 
plugin radattr.so</pre> в файле options.pptpd и идем дальше.
 
 
==Настройка Iptables (фаервола)==
 
Хотя настройка фарвола это совсем другая история (см [[Настройка фаервола | тут]] ), но для проверки, как работает инет через данную систему, привожу тут несколько правил, которые помогут проверить работу всей системы.
 
<pre>
 
#!/bin/sh
 
#
 
# Сначала сбросим все правила, которые были до этого
 
/etc/init.d/iptables stop
 
###########################################################################
 
#
 
# Configuration options.
 
#
 
#
 
# Internet Configuration.
 
#
 
INET_IP="213.54.25.11"          # Арес интерфейса, который смотрит в интернет
 
LAN_VPN_RANGE="192.168.10.0/24" # Диапазон адресов VPN сети, имеющей доступ
 
                                # в инет
 
# IPTables Configuration.
 
#
 
# Путь, где находится iptables.
 
IPTABLES="/usr/local/sbin/iptables"
 
 
# Включаем форвардинг
 
echo "1" > /proc/sys/net/ipv4/ip_forward
 
$IPTABLES -P INPUT ACCEPT
 
$IPTABLES -P OUTPUT ACCEPT
 
$IPTABLES -P FORWARD ACCEPT
 
 
# Делаем NAT
 
$IPTABLES -t nat -A POSTROUTING  -s $LAN_VPN_RANGE -j SNAT --to-source $INET_IP
 
</pre>Ну вот и все. Этого достаточно для проверки. Но на рабочем сервере такое использование я бы очень не рекомендовал.
 
 
==Perl modules==
 
Для работы системы нужны модули.
 
<pre>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
 
</pre>
 
Все модули, кроме DBI  есть в rpm-ax.
 
 
Установить модуль perl-devel-*.rpm
 
 
Установить модули Perl-DBD-mysql-*.rpm и Perl-DB_File-*.rpm
 
 
Очень удобно эти модули загрузить с сайта [http://www.cpan.org | www.cpan.org] или установка с консоли. Вот способ установки:
 
<pre># 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
 
</pre>
 
 
==Закачка дистрибутива Abills==
 
Тк далее в настройках будут ссылки на этот дистрибутив, то для последовательного изложения, нужно его выкачать<br />
 
Скачиваем и распаковываем последний релиз версии в отдельный каталог:
 
<pre>cd /usr/src/abills_distr
 
wget http://puzzle.dl.sourceforge.net/sourceforge/abills/abills-0.xx.tgz
 
tar -xvzf abills-0.xx.tgz</pre>
 
 
==Установка freeradius==
 
===Настройка для Mandriva 2008.1 с FreeRadius v1.7.1===
 
Настройку в Mandriva 2009.1 с данной версией радиуса я не проверял, так что если что не так, то извините.<br>
 
Для настройки биллинга с FreeRadius v1.7.1, я переустановил все пакеты Radius сервера  V1.7.1, из Mandriva 2008.<br>
 
Для этого нужны пакеты 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. Их можно взять [ftp://ftp.ps.pl/mirrors/mandrake/official/2008.0/i586/media/main/release/ тут].<br>
 
Сначала удаляем соответствующие пакеты, с помощью '''urpme''', например
 
<pre># urpme freeradius
 
# urpme libfreeradius
 
и другие ...
 
</pre>
 
А потом устанавливаем выше указанные, через '''rpm''', например
 
<pre>rpm -i libradius0-0.3.2-7mdv2008.0.i586.rpm</pre>
 
Пакет libfreeradius1-1.1.7-2mdv2008.0.i586.rpm устанавливать с ключами '''-i --nodeps'''.
 
 
===Настройка для freeradius 1.7.*===
 
Переименовываем файл
 
<pre>#mv /etc/raddb/users  /etc/raddb/users.old </pre>
 
Создаем новый файл  '''/etc/raddb/users''' и вставляем туда строки
 
<pre>DEFAULT Auth-Type = Accept
 
Exec-Program-Wait = "/usr/abills/libexec/rauth.pl"
 
</pre>
 
Правим файл '''/etc/raddb/acct_users'''
 
<pre>#Перед 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"
 
</pre>
 
Не забываем про пробелы перед Exec-Program
 
 
У большинства такая конфигурация работает нормально, а в моем случае после каждого аккаунтинг-запроса в памяти оставались зомби-процессы racct.pl. Проверить это можно командой:
 
<pre>ps ax|grep racct</pre>
 
Если у вас тоже остаются зомби, то рекомендую заменить в файле acct_users Exec-Program на Exec-Program-Wait
 
 
'''/etc/raddb/clients.conf''' В этот файл нужно вписать IP адрес или имя NAS сервера с которого будут поступать данные для радиуса и пароль доступа, те исправить строки secret.
 
<pre>client localhost {
 
  # Ниже пароль для доступа к радиусу. Запомните его, он
 
  # понадобится в п. 8
 
  secret = radsecret   
 
  shortname = shortname
 
}
 
</pre>
 
'''/etc/raddb/radiusd.conf'''- Если вы желаете использовать MPPE, MPPC, MS-Chap V2 (протоколы шифрования и компрессии от M$ - для VPN очень желательно) то в файл /etc/raddb/radiusd.conf вносятся следующие изменения:
 
В секции mschap {
 
<pre>use_mppe = yes
 
require_encription = yes
 
require_strong = yes</pre>
 
Cоздаются функции для преавторизации и поставторизации в секции modules {
 
<pre>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
 
}
 
</pre>
 
В секции ‘authorize’ внести ‘pre_auth’ и раскоментировать ‘mschap’.<br>
 
'''Внимание''' В Mandriva 2008.1 секции authorize и post-auth вынесены в отдельный файл /etc/raddb/sites-inabled/default
 
<pre>authorize {
 
  pre_auth
 
  preprocess
 
# auth_log
 
# attr_filter
 
  chap
 
  mschap
 
  suffix
 
  files
 
}
 
</pre>
 
Для оповещения о неавторизированых пользователях правим секцию post-auth
 
<pre>post-auth {
 
  Post-Auth-Type REJECT {
 
    post_auth
 
  }
 
}
 
</pre>
 
===Настройка для freeradius 2.*===
 
Огромное спасибо пользователю '''Andrushka''' с форума [http://abills.net.ua/forum/ abills]<br>
 
Переименовываем файл
 
<pre>#mv /etc/raddb/users  /etc/raddb/users.old </pre>
 
Создаем новый файл  '''/etc/raddb/users''' и вставляем туда строку
 
<pre>DEFAULT Auth-Type = Accept</pre>
 
Файл '''/etc/raddb/clients.conf''' В этом файле нужно исправить строки secret.
 
<pre>  # Ниже пароль для доступа к радиусу. Запомните его, он
 
  # понадобится в п. 8
 
  secret = radsecret   
 
</pre>
 
Файл '''/etc/raddb/modules/mschap'''- Если вы желаете использовать MPPE, MPPC, MS-Chap V2 (протоколы шифрования и компрессии от M$ - для VPN очень желательно) то в этот файл вносятся следующие изменения:
 
<pre>mschap{
 
use_mppe = yes
 
require_encription = yes
 
require_strong = yes
 
}</pre>
 
Файл '''radiusd.conf''' в секции modules описываем такие секции:
 
<pre>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
 
}</pre>
 
Файл '''/etc/raddb/sytes-inable/default''' - правим секции '''authorize''', '''preacct''', '''post-auth'''. Остальное в этих секциях ремарим.
 
<pre>authorize {
 
preprocess
 
abills_preauth
 
mschap
 
files
 
abills_auth
 
}
 
 
preacct {
 
preprocess
 
abills_acc
 
}
 
 
post-auth {
 
Post-Auth-Type REJECT {
 
abills_postauth
 
}
 
}
 
</pre>
 
В файле /etc/raddb/modules/exec
 
<pre>exec {
 
    wait = yes
 
    input_pairs = request
 
    shell_escape = yes
 
    output = none
 
    output_pairs = reply
 
  }
 
</pre>
 
В версии Abills 0.4.3 и больше, что написано ниже делать не надо. А надо только добавить строчку в файл '''/usr/abills/libexec/config.pl'''
 
<pre>$conf{RADIUS2}=1;</pre>
 
Правим файл '''/usr/abills/Abills/mysql/Auth.pm'''<br>
 
Было строка ~1452
 
<pre>    my $list = $self->{list}->[0];
 
    my $password = $list->[0];
 
    $self->{'RAD_CHECK'}{'User-Password'}="$password";
 
    print "User-Password == \"$password\"";
 
    return 0;</pre>
 
Стало<pre>    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;</pre>
 
 
==Radiusclient==
 
В мандивовском клиенте не хватает нескольких библиотек для работы. Я делал так выкачал с www.samba.org/ppp дистрибутив ppp-2.4.5.tar.gz. Распаковал в /usr/local/src
 
<pre># ./configure
 
# make</pre>
 
Далее переписываем содержимое каталога '''/usr/local/src/ppp-2.4.5/pppd/plugins/radius/etc''' в каталог '''/etc/radiusclient/''', кроме файла  '''/etc/radiusclient/radiusclient.conf'''
 
 
Правим файл /etc/radiusclient/radiusclient.conf:
 
<pre>authserver      127.0.0.1
 
acctserver      127.0.0.1
 
</pre>
 
В файл /etc/radiusclient/servers вносим IP адрес радиус-сервера и соответствующий ему пароль (см п.1)
 
<pre>127.0.0.1          radsecret</pre>
 
==Настройка библиотек для Радиусов.==
 
Для нормальной работы с NAS на осноаве pppd необходимо добавить в файл словарей freeradius’а /etc/raddb/dictionary и /etc/radiusclient/dictionary следующие строки (между колонками дб табуляции):
 
<pre># 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
 
</pre>
 
 
==Проверка конфигурационных файлов freeradius==
 
<pre>check-radiusd-config -level 345 radiusd on</pre>
 
Если все ок, то:
 
<pre>Radius server configuration looks OK.</pre>
 
При отладке останавливаем freeradius, и запускаем freeradius -X
 
==MYSQL==
 
Создаем файл pre_abills.sql следующего содержания:
 
<pre>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;</pre>
 
Не забудьте исправить sqlpassword на свое усмотрение. Для тех кто не понял, это пароль mysql-пользователя abills, необходимый для доступа к базе данных abills
 
 
Cоздаём пользователя и базу.
 
 
Далее делаем в консоли.
 
<pre># mysql -u root -p < pre_abills.sql
 
# mysqladmin -uroot -p flush-privileges
 
</pre>
 
Я просто создал пользователя в webmin, дал ему полный доступ к базе “abills” и установил пароль.
 
 
На этом настройка mysql завершена.
 
 
==Abills==
 
Правим конфигурационый файл системы /usr/abills/libexec/config.pl:
 
<pre>#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;
 
</pre>
 
При использовании модуля Dv полезно так же добавить в конфиг следующие параметры, и изменить их по своему усмотрению.
 
<pre>$conf{MAC_AUTO_ASSIGN}=0;    # Заполнять поле CID при cоединении, если оно не заполнено
 
$conf{DV_USER_CHG_TP}=0;    # Разрешить пользователю менять тарифный план из своего веб акаунта
 
$conf{ERROR_ALIVE_COUNT}=3;  # Количество периодов не пришедших Alive пакетов после которого сесия
 
                              # автоматом    попадает в Zap таблицу
 
</pre>
 
При изменении значения в '''$conf{secretkey}''' поменяйте его также в файле abills.sql из дистрибутива abills. После этого загружаем структуру таблиц в базу:
 
<pre>#mysql -D abills < abills.sql</pre>
 
Для того, чтобы можно было осуществлять hangup подключенного пользователя необходимо добавить в файл /etc/sudoers:
 
<pre>apache  ALL = NOPASSWD: /usr/abills/misc/pppd_kill</pre>
 
И там же закоментируйте строку
 
<pre>#Defaults requiretty</pre>
 
Вносим в cron периодические процессы, /etc/crontab (уберите восклицательный знак в начале первой строки):
 
<pre>*/5 *  *  *  *  root    /usr/abills/libexec/billd -all
 
1    0  *  *  *  root    /usr/abills/libexec/periodic daily
 
1    0  1  *  *  root    /usr/abills/libexec/periodic monthly
 
</pre>
 
Если хотите, чтоб ежедневно осуществлялось автоматическое резервное копирование базы данных, добавьте туда же:
 
<pre>1    3  *  *  *  root    /usr/abills/libexec/periodic backup</pre>
 
Определяем от имени какого пользователя запускается web-сервер в нашей системе. Для этого надо просмотреть файл httpd.conf и найти в нем директиву User, которая определяет имя владельца процесса. В моем случае:
 
<pre>User apache</pre>
 
Устанавливаем права на чтение и запись вебсервером для файлов веб интерфейса
 
<pre>chown -Rf apache /usr/abills/cgi-bin</pre>
 
Создаем недостающие каталоги:
 
<pre>mkdir /usr/abills/backup
 
chown -Rf apache /usr/abills/backup
 
chown -Rf apache /usr/abills/Abills/templates
 
mkdir /usr/abills/var
 
mkdir /usr/abills/var/log
 
</pre>
 
Правим файл /usr/abills/Abills/defs.conf. После правки я бы рекомендовал скопировать этот файл в defs.conf.old, что бы после обновления abills не пришлось снова его править.
 
<pre>$SNMPWALK = '/usr/bin/snmpwalk';
 
$GZIP = '/bin/gzip';
 
$MYSQLDUMP = '/usr/bin/mysqldump';
 
</pre>
 
В вашем случае пути к этим программам могут быть иными, проверьте командой which.
 
 
Еще: freeradius будет ругаться, что у вас нет логов abills, поэтому мы это исправляем.
 
<pre>touch /usr/abills/var/log/abills.log
 
chown radius /usr/abills/var/log/abills.log</pre>
 
 
Далее настраиваем [[Настройка биллинговой системы abills + VPN + radius + mysql#Web server | apache  ]]. Открываем веб интерфейс - https://your.host:9433/abills/admin/ Логин администратора по умолчанию - abills , пароль - abills. От имени этого администратора будут выполняться различные операции в автоматическом режиме, например снятие абонплаты в начале месяца, по этому удалять его не нужно, нужно только изменить пароль на более безопасный. Для реальных администраторов необходимо завести свои аккаунты и назначить им необходимые права: Система → Администраторы
 
 
Если впоследствии вам понадобится самая свежая функциональность обновления из CVS можно производить следующим образом:
 
<pre>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
 
</pre>
 
После этого изучаем changelog и выполняем необходимые рекомендации.
 
 
Тот кто выполнил все предыдущие пункты и увидел вебинтерфейс заслужил первую бутылку пива. Дальнейшее описание специфично именно для Linux-систем с pppd.
 
 
==Web server==
 
Для работы web-интерфейса требуется установить и настроить web сервер. Как и в случае с mysql нет особого смысла собирать его из исходников, поскольку любой приличный дистрибутив уже имеет в своем составе web-сервер Apache. Он должен быть собран и сконфигурирован с поддержкой модуля mod_rewrite. Переписываем  файл '''/usr/abills/misc/apache/abills_httpd.conf'''  в  каталог  '''/etc/httpd/conf/vhosts.d/'''<br />
 
1. В файле /etc/httpd/conf/httpd.conf<br>
 
Было <pre>
 
#NameVirtualHost *:80</pre>
 
Стало<pre>
 
NameVirtualHost *</pre>
 
 
===Ошибка в версии 0.36b ивыше===
 
Для того, что бы заработало, надо изменить файл  '''abills_httpd.conf'''<br />
 
'''Было'''
 
<pre>#Abills version 0.4. Default ABillS port is 9443
 
Listen 9443
 
 
#Alias for web report
 
</pre>
 
'''Стало'''
 
<pre>#Abills version 0.4. Default ABillS port is 9443
 
NameVirtualHost *:9443
 
#Listen 9443
 
 
Alias /abills "/usr/abills/cgi-bin/"
 
 
#Alias for web report
 
</pre>
 
 
===Создание ssl сертификата===
 
Сертификат для работы apache можно создать двумя способами
 
====Используем скрипт /usr/abills/misk/sslserts.sh====
 
Запускаем скрипт
 
<pre>/usr/abills/misc/sslcerts.sh apache</pre>
 
В новых версиях abills
 
<pre>/usr/abills/misc/certs_create.sh apache</pre>
 
И отвечаем на вопросы, которые будет задавать скрипт.<br />
 
На вопрос
 
<pre>Common Name (eg, your name or your server's hostname) []:</pre>
 
Если у Вас доступ к серверу будет по IP адресу (Нет DNS имени) -вводим имя сервера, например, ns2.<br />
 
или DNS имя Вашего сервера, например, volmed.org.ru.
 
В конце получим 2 сертификата, лежащий в папке /usr/abills/Certs<br />
 
После этого править файл '''/etc/httpd/conf/vhosts.d/abills_httpd.conf''' не надо.
 
 
====С помощью своего скрипта====
 
Делаем следующее:<pre>
 
# cd /etc/ssl
 
# mkdir db
 
# mkdir ca
 
# mkdir clients
 
# touch /etc/ssl/db/index.txt
 
# echo "01" > /etc/ssl/db/serial</pre>
 
Создаем скрипт для создания нашего самоподписанного доверенного сертификата (CA) '''/etc/ssl/make_ca.sh''' :
 
<pre>#!/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</pre>
 
Где '''mail.volmed.org.ru''' адрес нашего почтового сервера
 
 
Запускаем скрипт '''make_ca.sh'''. Какое-то время он будет возиться с генерацией секретного ключа длиной в 4096 бит, на слабой машине это займет время... можете уменьшить длину ключа до 1024 или 2048 бит, если очень не терпится все поскорее попробовать. В итоге мы получим два файла в каталоге /etc/ssl/ca:<br />
 
'''ca.crt''' - это наш самоподписанным доверенный сертификат, и <br />
 
'''ca.key''' - его секретный ключ.<br />
 
Правим файл '''/etc/httpd/conf/vhosts.d/abills_httpd.conf'''. <br />
 
Добавляем строку. Было
 
<pre>Listen 9443
 
<VirtualHost _default_:9443>
 
DocumentRoot "/usr/abills/cgi-bin"</pre>
 
Стало
 
<pre>Listen 9443
 
<VirtualHost _default_:9443>
 
Alias /abills "/usr/abills/cgi-bin/"
 
DocumentRoot "/usr/abills/cgi-bin"</pre>
 
Было
 
<pre>  SSLCertificateFile /usr/abills/Certs/server.crt
 
  SSLCertificateKeyFile /usr/abills/Certs/server.key</pre>
 
Стало
 
<pre>  SSLCertificateFile /etc/ssl/ca/ca.crt
 
  SSLCertificateKeyFile /etc/ssl/ca/ca.key</pre>
 
И перезапускаем вебсервер
 
<pre># /etc/init.d/httpd restart</pre>
 
Для доступа к web интерфейсу abills нужно открыть в фаерволе 9443 port и в строку адреса браузера набирать<br />
 
'''https://host:9443/abills/admin'''
 
 
==Шейпер==
 
Что бы включить шейпер, создаем файл скрипт '''/etc/ppp/ip-pre-up''' и пишем в него:
 
<pre>
 
if [ -f /var/run/radattr.$1 ]
 
  then
 
  DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
 
  UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
 
  FILTERS=`/bin/awk  '/Filter-Id/ {print $2}'  /var/run/radattr.$1`
 
#echo $DOWNSPEED
 
#echo $UPSPEED
 
#echo $FILTERS
 
    /sbin/tc qdisc del dev $1 root    > /dev/null
 
    /sbin/tc qdisc del dev $1 ingress > /dev/null
 
 
##### speed server->client
 
  if [ "$UPSPEED" != "0" ] ;
 
  then
 
    /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
 
    /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit burst 4k
 
    /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit burst 4k prio 1
 
    /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit burst 4k prio 2
 
    /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
 
    /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
 
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
 
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
 
    /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
 
  fi
 
##### speed client->server
 
  if [ "$DOWNSPEED" != "0" ] ;
 
  then
 
    /sbin/tc qdisc add dev $1 handle ffff: ingress
 
    /sbin/tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNSPEED}kbit burst 12k drop flowid :1
 
  fi
 
fi
 
</pre>
 
 
==Конфигурирование NAS==
 
Теперь необходимо сконфигурировать NAS.
 
Заходим в web-интерфейс администратора https://your.host:9433/abills/admin/<br />
 
Логин - abills<br />
 
пароль - abills<br />
 
Идем: Система → Сервер доступа Редактируем Nas, созданный по умолчанию.<br />
 
В нашем случае:
 
<pre>IP 127.0.0.1 
 
Название (произвольно, напр. - NAS Server)
 
Radius NAS-Identifier Идентификатор сервера (можно не вписывать)
 
Опис Описание сервера (Произв)
 
Type pppd:pppd + Radius plugin (linux)
 
Authorization SQL
 
Alive 60
 
 
IP:PORT         удалить
 
Пользователь:          удалить 
 
Пароль:                удалить
 
RADIUS Parameters Acct-Interim-Interval=60
 
</pre>
 
Значение Alive и значение параметра Acct-Interim-Interval нужно выбирать одинаковым. Осталось создать [http://abills.asmodeus.com.ua/wiki/doku.php?id=abills:docs:modules:dv:ru#tarif_plans тарифные планы] и завести юзеров..
 
:Проверяем
 
<pre># radtest testuser testpassword 127.0.0.1:1812 0 radpasswd 0 127.0.0.1</pre>
 
:'''testuser''' - имя пользователя из базы
 
:'''testpassword''' - его пароль
 
:'''radpasswd''' - пароль из файла /etc/radiusclient/servers
 
:Если всё правильно настроено, в файле логов /usr/abills/var/log/abills.log должна появиться строка
 
<pre>2005-02-23 12:55:55 LOG_INFO: AUTH [testuser] NAS: 1 (xxx.xxx.xxx.xxx) GT: 0.03799</pre>
 
 
===Если radius сервер на одной машине, а radius клиент на другой===
 
Допустим, что <br />
 
ip адрес машины радиус сервера '''192.168.1.10'''<br />
 
ip адрес машины радиус клиента '''192.168.1.20'''<br />
 
1. Правим файл '''/etc/raddb/users.conf'''
 
<pre>client 192.168.1.20  { </pre>
 
2. Заходим в http://192.168.1.10/abills/admin<br />
 
Далее '''Система ---> Сервер доступа'''<br />
 
Выбираем нужный NAS сервер и меняем его IP адрес на '''192.168.1.10'''<br />
 
3. Проверка - из консоли мфшины '''192.168.1.20''' запускаем
 
<pre>radtest user passuser 192.168.1.10:1812 0 radpasswd 0 192.168.1.10</pre>
 
Где '''user''' и '''passuser''' - имя и пароль одного из пользователей abills.<br />
 
'''radpasswd''' - пароль из файла /etc/raddb/users.conf
 
 
==Добавляем статистику==
 
'''abills/libexec/config.pl'''
 
{| border=1
 
| $conf{s_detalization}='yes';
 
| Более детальная статистика по сесиям
 
|-
 
| $conf{DV_LOG_CLEAN_PERIOD}=90
 
| Время хранения логов детализации. Задаётся в днях.
 
|}
 
В свободной версии нет подробной статистики по alive пакетам.<br />
 
Для ее добавления делаем следующее (но без гарантии, что все правильно).<br />
 
Редактируем файл '''/usr/abills/Abills/mysql/Acct.pm'''<br />
 
Строка ~236 Вставляем строки <br />
 
После
 
<pre>  elsif ($conf->{rt_billing}) {
 
    $self->rt_billing($RAD, $NAS);
 
  }
 
</pre>
 
Вставляем
 
<pre>###################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########################################
 
</pre>
 
Было. Строка ~264
 
<pre>#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}));
 
</pre>
 
Стало <pre>
 
#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}));
 
</pre>
 
 
==Как перевести web интерфейс с кодировки cp1251 на utf8==
 
Не удобно, когда файлы хранятся, в отличной от основной кодировке. Я тут опишу, как перевести интерфейс abills в кодировку utf8. База данных при этом остается в cp1251, что вобщем и не важно.<br />
 
1. Правим файл /usr/abils/libexec/config.pl
 
<pre>#For MySQL 5 and highter
 
$conf{dbcharset}='utf8';</pre>
 
<pre>$conf{MAIL_CHARSET}='utf8';
 
$conf{default_language}='russian';
 
$conf{default_charset}='utf-8';</pre>
 
2. Файл /usr/abills/Abills/XML.pm строка ~577
 
<pre>my $CHARSET=(defined($attr->{CHARSET})) ? $attr->{CHARSET} : 'utf-8';</pre>
 
3. Файл /usr/abills/Abills/defs.conf строка ~38
 
<pre>$lang_charset='utf-8';</pre>
 
4. Файл /usr/abills/Abills/HTML.pm сторока ~98
 
<pre>$self->{CHARSET}=(defined($attr->{CHARSET})) ? $attr->{CHARSET} : 'utf-8';</pre>
 
5. Спомощью команды iconv перекодируем файлы в директории /usr/abils/language/. Например, для файла russian.pl
 
<pre>iconv -fcp1251 -tutf8 russian.pl -orussian.pl1
 
mv russian.pl1 russian.pl</pre>
 
И поменять в них '''$CHARSET=" windows-1251"''' на '''$CHARSET=" utf8"''', хотя работает и без этого.
 
:Ну вот вроде и все.
 
 
==Настройка подключения к Totol Control==
 
Totol Control - это такая железяка в которую входят 16 модемов и система управления ими со своей ОС.
 
К ней можно подключиться через сом кабкль эмулятором терминала VT100, а после установок сети и telnet оп сети.
 
Пишу сдесь настройки, которые я делал, что бы не забыть потом.
 
===Настройка сервера доступа===
 
*'''Система ---> Сервер доступа'''<br />
 
{| border=1
 
| 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'''<br />
 
Пути можно найти с помощью команды '''which''', например
 
<pre># which snmpwalk
 
/usr/bin/snmpwalk</pre>
 
Все изменения в файле /usr/abills/Abills/nas.pl<br />
 
Вместо строк
 
<pre> 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 });</pre>
 
Вставить
 
<pre> elsif ($nas_type eq 'usr') {
 
  hangup_usr($NAS, $PORT, $attr);
 
  }</pre>
 
Вместо строк
 
<pre>#####################################################################
 
# 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;
 
}</pre>
 
Вставляем
 
<pre>#*******************************************************************
 
# 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;
 
}
 
 
}</pre> где passwd_telnet - пароль доступа по telnet
 
 
Файл /usr/abills/libexec/billd
 
Была строка ~ 194
 
<pre>      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 });
 
      }
 
</pre>
 
Стало <pre>
 
      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
 
                                });
 

Текущая версия на 14:35, 22 апреля 2014