Недавно устанавливал сервер для маленькой домашней сети. Сервер в основном используется для организования доступа в Интернет. В начале думал взять свою связку (mpd + netams + ipfw + pipe + sh_scripts), но потом захотелось чего-то новенького, свеженького (да и намучено у меня там со скриптами и т.д., долго пришлось бы объяснять что к чему). И вот остановился на связке:mpd5 - в качестве pppoe-сервера (кому не нравится pppoe - ставьте pptp, думаю особой разницы в настройке не будет)radius - как сервер AAAAbills - в качестве биллинговой системыng_car - шейпинг (потому что раньше его не пробовал :) )Основные настройки брал на официальном сайте Abills'a.Предполагается, что система у вас уже установлена. В начале на тесте я ставил на FreeBSD 8.0-RC1 #0. Затем переносил настройки на FreeBSD 7.2-RELEASE #0.Также у вас должен быть установлен и настроен mysql-server. Я использовал mysql-server-5.0.86 с make-флагами
make WITH_CHARSET=cp1251 WITH_COLLATION=cp1251_bin
Также у вас должно быть собрано ядро с:
options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=1000 options IPFIREWALL_FORWARD options NETGRAPH options NETGRAPH_IPFW options LIBALIAS options NETGRAPH_NAT options NETGRAPH_NETFLOW options NETGRAPH_SPLIT options NETGRAPH_ECHO options NETGRAPH_ETHER options NETGRAPH_TEE options NETGRAPH_BPF options NETGRAPH_IFACE options NETGRAPH_KSOCKET options NETGRAPH_MPPC_ENCRYPTION options NETGRAPH_PPP options NETGRAPH_PPTPGRE options NETGRAPH_SOCKET options NETGRAPH_TCPMSS options NETGRAPH_VJC
либо загрузить модулем:
ipfw_nat.ko ng_car.ko
Остальное, что нужно mpd он сам загрузит.И так, приступим.1. Abills.
# whereis abills # cd /usr/ports/net/abills
В портах есть abills-0.41. На сайте сть 0.5-я версия. Я ставил из портов.
# make install clean
Создаем пользователя для абиллса:
# mysql -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) VALUES ('localhost', 'abills', 'abills', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); CREATE DATABASE abills; flush privileges;
Загружаем таблицы в базу.
# mysql -D abills < /usr/local/abills/abills.sql
Правим /usr/local/abills/libexec/config.pl
#DB configuration $conf{dbhost}='localhost'; $conf{dbname}='abills'; $conf{dbuser}='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/local/abills/libexec/billd -all 1 0 * * * root /usr/local/abills/libexec/periodic daily 1 1 * * * root /usr/local/abills/libexec/periodic monthly
В /usr/local/abills/libexec/config.pl добавляем
$conf{mpd_filters}=1
2. mpd5Настройка mpd5 уже не раз обсуждалась, но в кратце повторюсь, для полноты картины так сказать.Для того, что бы собрать mpd с поддержкой ng_car рекомендуют, что бы модуль ng_car был уже загружен ядром.
# whereis mpd5 # cd /usr/ports/net/mpd5 # make install clean
+--------------------------------------------------------------------+ | Options for mpd 5.2 | | +----------------------------------------------------------------+ | | | [X] NG_CAR Use ng_car kernel module from port (< 7.0 only)| | | | [ ] NG_IPACCT Use ng_ipacct kernel module from port | | | | | | | | | | | | | | | | | | +-+------v(+)------------------------------------------------------+-+ | [ OK ] Cancel | +--------------------------------------------------------------------+
# cd /usr/local/etc/mpd5 # cp mpd.conf.sample mpd.conf
После установки правим дефолтный конфиг до такого состояния:
startup: # configure mpd users set user admin PASSWD admin # set user foo1 bar1 # configure the console set console self 127.0.0.1 5005 set console open # configure the web server set web self 0.0.0.0 5006 set web open default: load pppoe_server pppoe_server: create bundle template B set ipcp ranges 10.10.10.254/32 10.10.10.0/24 set iface idle 0 set iface enable tcpmssfix set ipcp no vjcomp set iface up-script "/usr/local/abills/libexec/linkupdown mpd up" set iface down-script "/usr/local/abills/libexec/linkupdown mpd down" set bundle enable compression set ccp yes mppc set mppc yes e40 set mppc yes e128 set mppc yes stateless create link template common pppoe set link enable multilink set link action bundle B set link disable pap eap set link enable chap load radius set pppoe service "*" create link template em0 common set link max-children 1000 set pppoe iface em0 set link enable incoming set link no pap eap set link yes chap-md5 set link keep-alive 20 60 set link enable incoming set link no acfcomp protocomp radius: set radius server 127.0.0.1 PASSWD 1812 1813 set radius retries 3 set auth acct-update 300 set auth enable radius-auth set auth enable radius-acct set radius enable message-authentic
Обращаем внимание на слудющие строки:Они понадобятся для настройки Abills'a.
set user admin PASSWD admin set console self 127.0.0.1 5005
em0 - интерфейс, на котором слушает mpd5 (pppoe)
create link template em0 common set link max-children 1000 set pppoe iface em0 set link enable incoming
PASSWD - пароль для подключения к радиус-серверу.
set radius server 127.0.0.1 PASSWD 1812 1813
Не забываем также про ТАБуляцию, свойственную mpd.3. FreeRadius. Пробовал freeradius2, но с ним у меня что-то не срослось. Интерфейс поднимался и через несколько секунд падал. Я не победил, по-этому переполз на 1-й.
# whereis freeradius # cd /usr/ports/net/freeradius # make install clean
+--------------------------------------------------------------------+ | Options for freeradius 1.1.7_4 | | +----------------------------------------------------------------+ | | |[ ] KERBEROS With Kerberos support | | | |[ ] HEIMDAL With Heimdal Kerberos support | | | |[ ] LDAP With LDAP database support | | | |[X] MYSQL With MySQL database support | | | |[ ] PGSQL With PostgreSQL database support | | | |[ ] UNIXODBC With unixODBC database support | | | |[ ] FIREBIRD With Firebird database support (EXPERIMENTAL) | | | |[ ] SNMP With SNMP support | | | |[ ] EDIR With Novell eDirectory support | | | |[ ] NOPERL Do not require perl (use only if necessary) | | | |[X] EXPERIMENTAL Build experimental modules | | | +----------------------------------------------------------------+ | | | +--------------------------------------------------------------------+
После успешной установки правим конфиги радиуса:
# cd /usr/local/etc/raddb
файл users
DEFAULT Auth-Type = Accept Exec-Program-Wait = "/usr/local/abills/libexec/rauth.pl"
файл acct_users
DEFAULT Acct-Status-Type == Start Exec-Program = "/usr/local/abills/libexec/racct.pl" DEFAULT Acct-Status-Type == Alive Exec-Program = "/usr/local/abills/libexec/racct.pl" DEFAULT Acct-Status-Type == Stop Exec-Program = "/usr/local/abills/libexec/racct.pl"
в файл clients.conf прописываем пароль для доступа к радиус-серверу, тот что мы указывали в mpd.conf
client 127.0.0.1 { secret = PASSWD }
В файле radiusd.conf Нужно создать функции для преавторизации и поставторизации в секции 'modules'
exec pre_auth { wait = yes program = "/usr/local/abills/libexec/rauth.pl pre_auth" input_pairs = request output_pairs = config } exec post_auth { wait = yes program = "/usr/local/abills/libexec/rauth.pl post_auth" input_pairs = request output_pairs = config }
Комментируем использование модулей 'chap' и добавим 'pre_auth' в разделе 'authorize'
authorize { preprocess # chap # counter # attr_filter # eap # suffix files # etc_smbpasswd # sql mschap pre_auth }
Для оповещения о неавторизированых пользователях. Внесите в секцию 'post-auth'
post-auth { Post-Auth-Type REJECT { post_auth } }
Создаем словарь для мпд dictionary.mpd:
VENDOR mpd 12341 ATTRIBUTE mpd-rule 1 string mpd ATTRIBUTE mpd-pipe 2 string mpd ATTRIBUTE mpd-queue 3 string mpd ATTRIBUTE mpd-table 4 string mpd ATTRIBUTE mpd-table-static 5 string mpd ATTRIBUTE mpd-filter 6 string mpd ATTRIBUTE mpd-limit 7 string mpd ATTRIBUTE mpd-input-octets 8 string mpd ATTRIBUTE mpd-input-packets 9 string mpd ATTRIBUTE mpd-output-octets 10 string mpd ATTRIBUTE mpd-output-packets 11 string mpd ATTRIBUTE mpd-link 12 string mpd ATTRIBUTE mpd-bundle 13 string mpd ATTRIBUTE mpd-iface 14 string mpd ATTRIBUTE mpd-iface-index 15 integer mpd ATTRIBUTE mpd-input-acct 16 string mpd ATTRIBUTE mpd-output-acct 17 string mpd ATTRIBUTE mpd-drop-user 154 integer mpd
в файле dictionary добавляем строку:
$INCLUDE dictionary.mpd
4. Добавляем нужные модули perl. Также проверьте пусть к бинарнику перла. К примеру в 8-ке он лежит уже не в /usr/bin/perl , а в /usr/local/bin/perl. По-этому я делал симлинк:
# ln -s /usr/local/bin/perl /usr/bin/perl
# cd /root # perl -MCPAN -e shell o conf prerequisites_policy ask install DBI install DBD::mysql install Digest::MD5 install Digest::MD4 install Crypt::DES install Digest::SHA1 install Bundle::libnet install Time::HiRes quit
5. Настриваем apache Добавляем
Include /usr/local/abills/misc/apache/abills_httpd.conf
И сгенерим сертификаты:
# /usr/local/abills/misc/sslcerts.sh apache
Имейте ввиду, нужно что бы Common Name (eg, YOUR name) []: совпадал с именем вашего сервера (hostname).Стартуем apache.Если ставите apache22 и в логах ругань на
то добавьте в /boot/loader.conf
accf_http_load="YES"
6. Настраиваем Abbils.Заходим на https://your.host:9443/admin/Выбираем русский язык.Теперь нужно сконфигурировать сервер доступа NASИдем в Система -> Сервер доступа
ID 1 IP 127.0.0.1 Название: NAS Radius NAS-Identifier: Описание: Тип: mpd5:MPD 5.xx Авторизация: SQL External Accounting: Alive (sec.): 60 Отключено: :Управление: IP:PORT: 127.0.0.1:5005 (тот, что настраивали в mpd.conf) Пользователь: admin (тот, что настраивали в mpd.conf) Пароль: PASSWD (тот, что настраивали в mpd.conf) RADIUS Параметры (,)
Теперь добавляем ему пул адресов, которые будут выдаваться клиентам при подключении к ВПН-серверу.Заходим в IP POOLs
Название: first FIRST IP: 10.10.10.1 Количество: 253 Приоритет: 0
Если нужно больше, увеличиваем сеть или создаем еще пулы. Их будем указывать в тарифном плане.Теперь настроим хотя бы один тарифный план: Система -> Internet -> Тарифные планы -> ДобавитьТут настраиваем по вкусу, при этом указываем пул-адресов (IP Pool:) и RADIUS Parameters (,).RADIUS Parameters (,) - это собственно и есть параметры передаваемые радиусом системе ng_car.Сюда для примера добавим:
mpd-limit+="in#1=all rate-limit 1024000 192000 384000", mpd-limit+="out#1=all rate-limit 1024000 192000 384000"
где первая цифра (rate-limit) собственно ограничение скорости при закачкевторая - (normal burst) - какую полосу отдать за 1 секундутретья - (extended burst) за первые полторы секундыФормулы расчета burst (Cisco like rate-limit):
normal burst = configured rate * 3 / 16 extended burst = 2 * normal burst
Теперь добавим пользователя Клиенты -> Логины -> Добавить Затем привязываем к нему тарифный план. Далее исходя из тарифного плана (предоплата/постоплата) смотрим, нужно ли ему для успешной авторизации деньги на счету, и если нужны, то добавляем. Далее активируем пользователя.Запускаем mpd, radius (предварительно добавив параметры запуска в rc.conf)Проверяем, может ли пользователь авторизироваться в радиусе:
# radtest testuser testpassword 127.0.0.1:1812 0 PASSWD 0 127.0.0.1
если ему выдался ИП и т.д., то все ок.Для логирования mpd, добавляем следующее в /etc/syslog.conf
!mpd *.* /var/log/mpd.log
Создаем файл, даем права и рестартуем syslog
# touch /var/log/mpd.log # chmod 600 /var/log/mpd.log # /etc/rc.d/syslogd restart
7. Настроим ipfw и natУкажу минимальный набор правил для доступа пользователей в интернет:rl1 - внешняя сетевая картаrl0 - внутреняя сетевая карта192.168.1.0/24 - локальная сеть${eip} - Внешний IP-адресtable(1) - содержит созданные вами пулы адресовФаервол по-умолчанию закрытый.
ipfw nat 100 config if rl1 allow ip from any to any via lo0 ipfw add allow ip from 192.168.1.0/24 to 192.168.1.0/24 via rl0 ipfw add allow ip from 'table(1)' to 'table(1)' ipfw add nat 100 ip from 'table(1)' to any ipfw add nat 100 ip from any to ${eip} ipfw table 1 add 10.10.10.0/24
Пробуем настроить соединение в Windows:
http://abills.net.ua/wiki/doku.php/abills:index
http://mpd.sourceforge.net/doc/mpd.html