Поэтапная настройка ABillS.

Т.к. все заточено под FreeBSD не вижу смысла изголятся и ставить это все под линуксом, хотя сам я сервер баз данных держу под Debian Sarge :-)

MySQL

(У меня SQL база находится на линукс-сервере на другой машине, поэтому я не собирал, но проблем не должно быть). (Для сборки сразу с поддержкой utf8 - make WITH_CHARSET=utf8).

# cd /usr/ports/database/mysql51-server && make  && make install

Автостарт после перезагрузки. /etc/rc.conf

echo mysql_enable=\"YES\" >> /etc/rc.conf

Создаём пользователя и базу.

# mysql --default-character-set=cp1251 -u root -p
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, 
  Lock_tables_priv, Create_tmp_table_priv, Create_view_priv,
  Show_view_priv, Execute_priv, Event_priv, Trigger_priv) 
VALUES ('localhost', 'abills', 'abills', 'Y', 'Y', 'Y', 'Y', 'Y', 
  'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');

CREATE DATABASE abills;
flush privileges;

Загружаем таблицы в базу.

# mysql --default-character-set=cp1251 -D abills < abills.sql

Perl modules

Для работы системы нужны модули.

DBI (cd /usr/ports/databases/p5-DBI && make && make install)
DBD-mysql (cd /usr/ports/databases/p5-DBD-mysql51 && make && make install)
Digest-MD5 для Chap авторизации (cd /usr/ports/security/p5-Digest-MD5 && make && make install)
Digest-MD4 для MS-Chap авторизации (cd /usr/ports/security/p5-Digest-MD4 && make && make install)
Crypt-DES для MS-Chap авторизации (cd /usr/ports/security/p5-Crypt-DES && make && make install)
Digest-SHA1 для MS-ChapV2 авторизации (cd /usr/ports/security/p5-Digest-SHA1 && make && make install)
Time-HiRes Нужен только для тестирования скорости выполнения авторизациИ, аккаунтинга, и страниц веб-интерфейса (cd /usr/ports/devel/p5-Time-HiRes && make && make install)

Web Server

Apache

Собираем апач 2.2 из портов.

# cd /usr/ports/www/apache22
# make
# make install

Для автоматического запуска апача внести изменения в rc.conf

# echo apache_enable=\"YES\" >> /etc/rc.conf

В случае использования веб-сервер Apache вносим в /usr/local/etc/apache22/httpd.conf

#Abills version 0.5
Listen 9443
<VirtualHost _default_:9443>
  DocumentRoot "/usr/abills/cgi-bin"
  #ServerName www.example.com:9443
  #ServerAdmin admin@example.com
  ErrorLog /var/log/httpd/abills-error.log
  #TransferLog /var/log/httpd/abills-access.log
  CustomLog /var/log/httpd/abills-access_log common
 
  <IfModule ssl_module>
    #   SSL Engine Switch:
    #   Enable/Disable SSL for this virtual host.
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /usr/abills/Certs/server.crt
    SSLCertificateKeyFile /usr/abills/Certs/server.key
    <FilesMatch "\.(cgi)$">
      SSLOptions +StdEnvVars
    </FilesMatch>
    BrowserMatch ".*MSIE.*" \
       nokeepalive ssl-unclean-shutdown \
       downgrade-1.0 force-response-1.0

    CustomLog /var/log/abills-ssl_request.log \
        "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  </IfModule>


# User interface
  <Directory "/usr/abills/cgi-bin">
    <IfModule ssl_module>
      SSLOptions +StdEnvVars
    </IfModule>

    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{HTTP:Authorization} ^(.*)
      RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1]
      Options Indexes ExecCGI SymLinksIfOwnerMatch
    </IfModule>
 
    AddHandler cgi-script .cgi
    Options Indexes ExecCGI FollowSymLinks
    AllowOverride none
    DirectoryIndex index.cgi         

    Order allow,deny
    Allow from all

   <Files ~ "\.(db|log)$">
     Order allow,deny
     Deny from all
   </Files>
  
  #For hotspot solution
  #ErrorDocument 404 "/abills/"
  #directoryIndex "/abills" index.cgi
 </Directory>

 #Admin interface
 <Directory "/usr/abills/cgi-bin/admin">
   <IfModule ssl_module>
     SSLOptions +StdEnvVars
   </IfModule>

   AddHandler cgi-script .cgi
   Options Indexes ExecCGI FollowSymLinks
   AllowOverride none
   DirectoryIndex index.cgi
   order deny,allow
   allow from all
 </Directory>

</VirtualHost>

Radius

Все пакеты кроме самого биллинга я ставил из портов и все нормально работало, начнем с радиуса:

# cd /usr/ports/net/freeradius
# make
# make install

Далее идем в /usr/local/etc/raddb и убираем у всех файлов .sample (чесно говоря и не люблю из-за этого фрю :)

Правим в этой же /usr/local/etc/raddb директории users
Все строки комментируем, и в конец вставляем эту (По-умолчанию авторизовыватся через скрипт):

DEFAULT Auth-Type = Accept
  Exec-Program-Wait = "/usr/abills/libexec/rauth.pl"

Далее правим 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 добавляем следующие строки (опять же в конец): !!! (Если PPPoE демон или PPTP демон на этой же машине, то достаточно найти строки и изменить в них значение secret и shortname).

client 127.0.0.1 {
   secret = radsecret
   shortname = exppp
}

Если у вас pppd, poptop, cisco, lucent max6000, exppp или еще какая-нибудь терминирующая железка/сервер не на одной машине с радиусом, то вам нужно для них всех добавить по такой секции, для того, чтобы радиус знал о том, что они будут у него авторизовыватся.

Например, у меня есть локальный exppp и для него я описал выше адрес машины на которой он стоит, пароль и обозвал его exppp.

Еще у меня есть DialUP концентратор Lucent MAX6000 для него я добавил следующее:

client 217.21.248.211 {
   secret = maxsecret
   shortname = nas1.provider.com
 }

В файле radiusd.conf нужно закомментировать использование модулей ‘chap’ и ‘mschap’ в разделе ‘authorize’

authorize {
  preprocess
  suffix
  files
}

С радиусом пока все, но позже в зависимости от используемых способов терминирования (подключения пользователей) мы в него будем добавлять кое-что еще.

Для автоматического запуска радиуса внести изменения в /etc/rc.conf

# echo radiusd_enable=\"YES\" >> /etc/rc.conf

Сборка ядра

Ставим FreeBSD поновее, ставим исходники ядра и добавляем некоторые возможности в ядро:

# cd /usr/src/sys/i386/conf
# cp SMP GATE-SMP		

(Если у вас один процессор и нет гипертрэйдинга, копируйте не SMP, а GENERIC)

# ee GATE-SMP

В конец вставляем этот кусок:

# For Abills
options         IPFIREWALL
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         DUMMYNET

options         NETGRAPH
options         NETGRAPH_PPPOE
options         IPFILTER
options         IPFILTER_LOG
options         IPDIVERT

Собираем:

# /usr/sbin/config GATE-SMP
# cd ../compile/GATE-SMP
# make depend
# make
# make install

Перегружаем машину и приступаем к установке необходимого софта.

Установка ABillS

ABillS

Загрузить пакет можно по адресу http://sourceforge.net/projects/abills/

tar zxvf abills-0.51.tgz
cp -Rf abills /usr/

Правим конфигурационный файл системы (в нем выставляем все под свои нужды) /usr/abills/libexec/config.pl

#DB configuration 
$conf{dbhost}='localhost';
$conf{dbname}='abills'; 
$conf{dblogin}='abills';
$conf{dbpasswd}='sqlpassword'; 
$conf{ADMIN_MAIL}='info@your.domain'; 
$conf{USERS_MAIL_DOMAIN}="your.domain";
# используется для шифрования паролей администраторов и пользователей.
$conf{secretkey}="test12345678901234567890"; 

При изменении значения в $conf{secretkey} поменяйте его также в файле abills.sql Вносим в cron периодические процессы /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

Установить права на чтение и запись вебсервером для файлов веб интерфейса

# chown -Rf www /usr/abills/cgi-bin
# chown -Rf www /usr/abills/Abills/templates
# chown -Rf www /usr/abills/backup
# mkdir /usr/abills/var /usr/abills/var/log

Открываем веб интерфейс http://your.host:9443/admin/
Логин администратора по умолчанию abills пароль abills
Прежде всего надо сконфигурировать сервера доступа NAS (Network Access Server).

Переходим в меню System configuration→NAS

Параметры

IP IP адрес NAS сервера
Name Название
Radius NAS-Identifier Идентификатор сервера (можно не вписывать)
Describe Описание сервера
Type Тип сервера. В зависимости от типа по разному обрабатываются запросЫ на авторизацию
Authorization

SYSTEM - При хранении паролей в UNIX базе (/etc/passwd)
SQL - при хранении паролей SQL базе (MySQL, PosgreSQL)
|

Alive Период отправки Alive пакетов
Disable Отключить
:Manage: Секция менеджмента NAS сервера
IP:PORT IP адрес и порт для контроля соединения. Например, для отключения пользователя из веб-интерфейса
User Пользователь для контроля
Password Пароль
RADIUS Parameters Дополнительные параметры которые передаются NAS серверу после успешной авторизации.

После заведения сервера доступа добавте ему пул адресов IP POOLs.

FIRST IP Первый адрес в пуле
COUNT Количество адресов

К примеру 10.1.0.1 количество 60 000 (хватит на всех :)
Одному серверу доступа может принадлежать несколько пулов адресов.
Создание тарифного плана

Меню System configuration → Internet → Tarif Plans

Регистрация пользователя Customers → Users → Add

Заведение сервиса Internet на пользователя.

Customers → Users → Information → Services→Dialup / VPN
Проверяем

# radtest testuser testpassword 127.0.0.1:1812 0 radsecret 0 127.0.0.1

Если всё правильно настроено, в файле логов /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

Настройка NAS сервера exppp

Общие настройки Переходим в каталог с программами

cd /usr/abills/soft
tar zxvf exppp_asm-0.2.4.tar.gz
cd exppp_asm-0.2.4
make
cp ppp /usr/sbin/
cp raddb/exppp /usr/local/etc/raddb/

Дописываем в файл /usr/local/etc/raddb/dictionary

$INCLUDE		/usr/local/etc/raddb/exppp

перезагружаем радиус

# /usr/local/etc/rc.d/radiusd restart

Конфигурационный файл для подключения к радиусу (создать если нет)
/etc/radius.conf

auth    127.0.0.1:1812      radsecret   4    4
acct    127.0.0.1:1813      radsecret   4    4

127.0.0.1 - адрес Radius сервера

HINT: В конце всех файлов на всякий случай оставляем одну пустую строку!

/etc/ppp/ppp.linkup (создать если нет)

MYADDR:
  !bg /usr/abills/libexec/linkupdown up INTERFACE USER HISADDR

/etc/ppp/ppp.linkdown (создать если нет)

MYADDR:
  !bg /usr/abills/libexec/linkupdown down INTERFACE USER HISADDR

Правим файл настройки ppp /etc/ppp/ppp.conf

default:
  set log Warning

PPPoE

Правим файл настройки ppp /etc/ppp/ppp.conf

pppoe-in:   # Метка (идентификатор правил) 
  set mtu 1492
  set mru 1492
  allow mode direct
  enable lqr
  set lqrperiod 5
  set timeout 6000
  disable acfcomp protocomp    
  deny acfcomp
  # если авторизация из UNIX базы паролей enable pap
  enable chap
  set speed sync
  accept dns
  #set dns xxx.xxx.xxx.xxx
  # Номер порта для контроля и пароль
  set server +3000 password     
  set radius /etc/radius.conf
  set rad_service_type 11
  # Таймаут для Alive пакетов
  set rad_alive 60

Не забывайте делать отступы для правил расположеных после метки. В противном случае, они не будут приниматься. Для запуска PPPoE демона при старте системы в /etc/rc.conf нужно добавить следующие записи:

pppoed_enable="YES"              # Run the PPP over Ethernet daemon.
pppoed_provider="provider"       # Provider and ppp(8) config file entry.
pppoed_flags="-l pppoe-in -P /var/run/pppoed.pid"   # Flags to pppoed (if enabled).
pppoed_interface="em0"         # The interface that pppoed runs on.

PPTP Правим файл настройки ppp /etc/ppp/ppp.conf

pptp:
  set mtu 1460
  set mru 1460
  allow mode direct
  enable lqr
  set timeout 6000
  disable acfcomp protocomp  
  deny acfcomp
  # если авторизация из UNIX базы паролей enable pap
  enable chap
  accept dns
  #set dns xxx.xxx.xxx.xxx
  # Номер порта для контроля и пароль
  set server +3000 password   
  set radius /etc/radius.conf
  set rad_service_type 11
  # Таймаут для Alive пакетов
  set rad_alive 60

Настройка pptp демона

# cd /usr/ports/net/poptop/
# make
# make install

Идем в /usr/local/etc и переименовываем pptpd.conf.sample в pptpd.conf В этом файле должно быть только это:

options /etc/ppp/ppp.conf
pidfile /var/run/pptpd.pid
noipparam

Для автоматического запуска после перезагрузки В /etc/rc.conf правим

pptpd_enable=”YES”

Фильтры (сам не пробовал, т.к. мне нечего контролировать) Программа PPP имеет возможность применять правила фильтрации пакетов для контроля трафика, который она маршрутизирует. Несмотря на то, что эти правила действуют далеко не так как обычный брандмауэр, они обеспечивают некоторый контроль доступа по мере того, как используется соединение. Правим /etc/ppp/ppp.conf или /etc/ppp/ppp.linkup (Если хотите передавать параметр через radius)

#
# Разрешить доступ внутри локальной сети
#
  set filter in 6 permit 0/0 192.168.101.0/24
  set filter out 6 permit 192.168.101.0/24 0/0

#  
# Разрешить telnet-подключения к Интернет
#
   set filter in 1 permit tcp src eq 23 estab
   set filter out 1 permit tcp dst eq 23
#
# Разрешить доступ в Интернет по ftp
#
   set filter in 2 permit tcp src eq 21 estab
   set filter out 2 permit tcp dst eq 21
   set filter in 3 permit tcp src eq 20 dst gt 1023
   set filter out 3 permit tcp dst eq 20

# Если пакет не удовлетворяет ни одному указанному выше условию, то он будет
# блокирован.
#-------

В каждом классе правил фильтрации пакетов можно применить до 20 явных фильтров. Правила в каждом классе представляют собой последовательные номера от 0 до 20, но ни одно из правил для конкретного класса фильтров не будет активизировано до тех пор, пока будет определено правило с номером ‘0’! !
Если Вы решили не использовать правила фильтрации пакетов в конфигурации PPP, то в этом случае, на время соединения с Вашим Интернет-провайдером, через Вашу систему будет разрешен ВЕСЬ входящий и исходящий трафик. Если Вы решите, что Вам необходимо использовать правила фильтрации пакетов, добавьте строки, описанные выше в Ваш файл /etc/ppp/ppp.conf в одну из секций “стандартную:”, “demand:” или “интерактивную:” (или же во все, по Вашему усмотрению).

У меня все обслуживает один интерфейс, который смотрит в киску.

Настройка NAT

В файл /etc/rc.conf добавляем всего 3 строки:

ipnat_enable="YES"              
ipnat_program="/sbin/ipnat"     
ipnat_rules="/etc/ipnat.rules"  

Файл /etc/ipnat.rules

#
# Interface:
#    em0 - external to cable modem
# 
# NAT policy:
#    + Use IP Filter FTP proxy
#    + Use IP Filter IKE proxy
#    + Use IP Filter RealAudio proxy
#    + NAT UDP and TCP packets from internal hosts to external IP
#    + NAT ICMP packets from internal hosts to external IP
#
# share and enjoy,
# hoang@muine.org
# Oct 25, 2001
#

# ------------------------------------------------------------
# Use ipfilter FTP proxy for the firewall doing transfer mode
# active.
# ------------------------------------------------------------
map em0 0.0.0.0/0 -> 0.0.0.0/32 proxy port ftp ftp/tcp

# ------------------------------------------------------------
# Use ipfilter FTP proxy for hosts behind NAT doing transfer
# mode active.
# ------------------------------------------------------------
map em0 10.222.0.0/16 -> 0.0.0.0/32 proxy port ftp ftp/tcp

# -----------------------------------------------------------
# Use ipfilter IKE proxy for ESP packets for hosts behind NAT 
# IP Filter 3.4.21 and beyond only.
# -----------------------------------------------------------
map em0 10.222.0.0/16 -> 0.0.0.0/32 proxy port 500 ipsec/udp

# -----------------------------------------------------------
# Use ipfilter RealAudio proxy for hosts behind NAT
# -----------------------------------------------------------
map em0 10.222.0.0/16 -> 0.0.0.0/32 proxy port 7070 raudio/tcp

# -----------------------------------------------------------
# Map all internal UDP and TCP traffic to the external IP address
# -----------------------------------------------------------
map em0 10.222.0.0/16 -> 0.0.0.0/32 portmap tcp/udp 40000:60000

# -----------------------------------------------------------
# Map all other traffic e.g. ICMP to the external IP address
# -----------------------------------------------------------
map em0 10.222.0.0/16 -> 0.0.0.0/32

Продолжение следует…