Предыстория:
Некие хорошие люди решили начинать провайдерский бизнес. Растянули и разварили оптику в небольшом районе, поставили ящички, засунули туда минимальные свичи, с помощью которых можно организовать VLAN-Per-User, закупили небольшой, для начала, канал у ближайшего магистрала. Встал у них вопрос о том, чем же считать пользователям трафик/денежки и нарезать скоростя.
Общая схема сети должна выглядеть следующим образом:
Кому интересно, далее под катом очень много букв и картинок.
Условности:
— Шлюз аплинка будет 1.2.3.3
— Сетевые адаптеры NAS смотрящие на аплинка будут в сети 1.2.3.3/24
— Сеть, предоставляемая пользователям, будет 172.16.0.0/18, или, если угодно, 255.255.192.0
— IP адреса 172.16.0.0-172.16.0.10 мы резервируем для серверов доступа и прочих собственных нужд
— Сервер пользовательской статистики будет доступен по адресу stat.isp и, учитывая бюджетность решения, будет находиться на одном хосте с биллинговым сервером, хотя хорошим тоном является не только разделять биллинг и трафик абонентов, но и разносить на раздельные хосты БД, ядро биллинга и веб-интерфейс.
Изначальные потребности были четко оговорены:
— Проектная емкость сети — до 10000 абонентов
— Раздача IP абонентам при помощи DHCP
— Авторизация либо по связке IP+MAC
— Несколько полностью безлимитных тарифов
— Трафик все же считать нужно для контроля
— Очень желательно видеть активность каждого отдельного пользователя
— Разделение прав касиров/бухгалтеров/менеджеров/администраторов
— Возможность масштабирования решения относительно роста количества абонентов
— Так как своей АС еще нету и в наличии имеются три с половиной айпишки, выданных аплинком, первых пользователей предполагается NAT-ить.
— Естественно все это максимально бюджетно :)
Беглое изучение ассортимента opensource биллинговых систем показало, что оптимальным в данной ситуации может оказаться Stargazer по следующим причинам:
— Проект открыт, активно развивается, новые версии выходят с завидным постоянством.
— Не страдает врожденной монстроидальностью и позволяет допиливать функционал не привязываясь к внутренней механике
— Ядро написано на C/C++ и категорически быстрое
— Большой выбор методов подсчета трафика
— На выбор поддержка хранения данных в Файлах/MySQL/Firebird/PostgreSQL
— Волшебный механизм исполнения команд на удаленных серверах
Установка будет проходить на голую FreeBSD 8.2-RELEASE, установленную в варианте kern-developer + порты. Весь трафик пользователей будем рулить через удаленный NAS на все
той же FreeBSD 8.2, производя по нему NAT/Shape/NetFlow и отрисовку графиков загрузки абонентского канала при помощи bandwidthd. В роли вебинтерфейса для stargazer 2.407-p1 у нас будет выступать последний на момент написания топика Ubilling 0.1.7, хотя выбор фронтендов у Stargazer довольно широк — от Win-конфигуратора до нескольких консольных и XML-RPC API.
Далее прямой копипаст из консоли с периодическими заострениями внимания на концептуальных моментах.
Итак приступим к настройке биллингового сервера.
1. Морально готовимся
2. Установка зависимостей
Для простоты isc-dhcp собираем без DHCP_PARANOIA
php5 должен быть собран как минимум с поддержкой CLI и модулем Apache (последний должен нормально подтянуться зависимостью)
Собираем жизненно необходимые расширения PHP, а именно: ставим галочки на MYSQL, MBSTRING и ICONV
3. Собираем сам stargazer и его консольные конфигураторы в две строчки :)
4. Разворачиваем текущую версию Ubilling
5. Делаем особую симлинковую магию
6. Запускаем Apache и MySQL
7. Устанавливаем новый пароль пользователя root для mysql (newpassword — для примера)
#mysqladmin -u root password newpassword
8. Приводим /etc/stargazer/stargazer.conf к следующему виду
9. Редактируем конфиг /etc/stargazer/rules оставля аж одно нужное нам направление, а именно интернеты.
10. Добавляем наш первый NAS в /etc/stargazer/remote_nas.conf
10. запускаем/останавливаем stargazer
11. Убеждаемся, что умолчальная БД развернулась
12. Редактируем /usr/local/etc/sudoers, добавляя туда пользователя, под которым будет работать Web интерфейс
13. Разворачиваем дамп Ubilling
14. Убеждаемся, что все хорошо
15. Редактируем файл config/billing.ini, доводя его до кондиции:
16. Разворачиваем заготовки стартовых скриптов
17. И делаем прибивание IP+MAC в скрипте /etc/stargazer/OnConnect
18. Редактируем конфиг /etc/stargazer/config, прописывая в него текущие параметры MySQL
19. Аналогично редактируем конфиг config/mysql.ini
20. Запускаем stargazer и меняем пароль администратора по умолчанию
21. приводим наш /etc/rc.conf к виду
22. Добавляем служебную зону ".isp" в /etc/namedb/named.conf
и в /etc/namedb/master/isp
23. Создаем стартовый скрипт запуска stargazer в /etc/rc.d/billing
и назначаем ему нужные права
24. Прописываем нужные виртуалхосты в /usr/local/etc/apache/httpd.conf
25. Правим глобальный шаблон по которому будут генерироваться конфиги dhcp, он находиться вот здесь: /usr/local/www/data/billing/config/dhcp/global.template
26. Выставляем нужный уровень логирования для dhcpd в /etc/syslog.conf
27. Можем сделать профилактический ребут чтобы посмотреть как все подымается, либо поперезапускать все, что мы уже понастраивали вручную.
28. А теперь самое интересное ради чего все затевалось :)
Заходим на наш servername.isp/billing и логинимся с логином и паролем по умолчанию admin/demo (не забываем сразу же сменить) и видим следующую картину:
Добавляем нужный нам класс трафика:
Добавляем сеть и сервис (напоминаю, что мы резервируем первых 10 IP под свои нужды)
Добавляем сети обработчик DHCP
и применяем к нему свой шаблон подсети
намекая таким образом, что шлюз по умолчанию должен быть в сторону нашего NAS сервера.
Проверяем, удачно ли создается конфиг dhcpd.conf в справочнике «Сети»
Добавляем свой первый тариф, пусть он будет зваться Unlim-1 и будет безлимиткой с абонплатой 50 денег в месяц
Навешиваем на него симметричную скорость в 1 мегабит/с
Добавляем наш сервер доступа который мы будем настраивать чуть пожже
В справочниках Городов, Улиц и домов добавляем наш населенный пункт, улицы и дома где будут жить абоненты
Ну и вроде все, регистрируем нашего первого абонента
Назначаем ему MAC, тариф, вписываем Ф.И.О. и все что нужно в «редактировании», и, в общем-то, он должен работать.
Настройка NAS сервера.
Опять же, имеем Голую FreeBSD 8.2, от которой хотим, чтобы она выступала шлюзом по умолчанию для наших пользователей.
Нужные модуля можно и просто подгрузить, но это дело привычки, так что соберем ядро руками с попутным выкидыванием всего что нам не нужно.
Заменяем в конфиге нашего нового ядра ident GENERIC на NAS1
И собираем/ставим его в одну строчку:
Следим за тем, чтобы наш /etc/rc.conf имел где-то такой вид:
Устанавлиеваем thttpd, которым будем показывать графички
Отличный сенсор NetFlow
Expat нужен
И умеренно врущий, но идеально простой в настройке bandwidthd для отрисовки per-user графиков
PHP собираем с поддержкой CLI
И модуль MYSQL к нему
Приводим наш /etc/firewall.conf к виду:
Выставляем правильные права на наш скрипт инициализации фаервола
Собираем rscriptd и обеспечиваем его запуск при ребуте
редактируем /etc/rc.d/rscriptd, приводя его к виду
и назначаем ему правильные права
Разворачиваем заготовки скриптов Ubilling
Редактируем конфиг /etc/rscriptd/config, прописывая в него текущие параметры MySQL для того, чтобы скрипты GetSpeed, GetUpSpeed, GetMAC могли нормально получать информацию о пользователях.
Также, не забываем поправить /etc/rscriptd/OnConnect, указав в нем входной интерфейс для шейпинга, который в нашем случае
Настраиваем bandwidthd для того, чтобы он рисовал красивые графики, которые мы потом должны лицезреть в Ubilling:
В файл /usr/local/bandwidthd/etc/bandwidthd.conf вписываем сеть наших пользователей
добавляем периодический SIGHUP для bandwidthd в crontab -e
И опять страшная симлинковая магия, чтобы наш thttpd мог нормально показывать графички
Обеспечиваем при загрузке запуск
И как последний штрих, добавляем более-менее универсальные вещи, помогущие хоть как-то поднять быстродействие в дальнейшем в /etc/sysctl.conf
После перезагрузки получаем работающий NAS, получающий удаленно команды от биллинга, отправляющий ему сведения о трафике и все остальное, что от него требовалось.
Хотелось бы еще написать о настройке кабинета пользователя, недокументированых «фичах» с переходом на следующий месяц и прочих вещах, на которых можно споткнуться в первое время. Но статья и так уже получилась слишком монстроидальной и нудной. Обещаюсь, если карма позволит, на недельке описать все эти вещи в отдельном сказании.
Оффсайт Stargazer
Оффсайт Ubilling
Некие хорошие люди решили начинать провайдерский бизнес. Растянули и разварили оптику в небольшом районе, поставили ящички, засунули туда минимальные свичи, с помощью которых можно организовать VLAN-Per-User, закупили небольшой, для начала, канал у ближайшего магистрала. Встал у них вопрос о том, чем же считать пользователям трафик/денежки и нарезать скоростя.
Общая схема сети должна выглядеть следующим образом:
Кому интересно, далее под катом очень много букв и картинок.
Условности:
— Шлюз аплинка будет 1.2.3.3
— Сетевые адаптеры NAS смотрящие на аплинка будут в сети 1.2.3.3/24
— Сеть, предоставляемая пользователям, будет 172.16.0.0/18, или, если угодно, 255.255.192.0
— IP адреса 172.16.0.0-172.16.0.10 мы резервируем для серверов доступа и прочих собственных нужд
— Сервер пользовательской статистики будет доступен по адресу stat.isp и, учитывая бюджетность решения, будет находиться на одном хосте с биллинговым сервером, хотя хорошим тоном является не только разделять биллинг и трафик абонентов, но и разносить на раздельные хосты БД, ядро биллинга и веб-интерфейс.
Изначальные потребности были четко оговорены:
— Проектная емкость сети — до 10000 абонентов
— Раздача IP абонентам при помощи DHCP
— Авторизация либо по связке IP+MAC
— Несколько полностью безлимитных тарифов
— Трафик все же считать нужно для контроля
— Очень желательно видеть активность каждого отдельного пользователя
— Разделение прав касиров/бухгалтеров/менеджеров/администраторов
— Возможность масштабирования решения относительно роста количества абонентов
— Так как своей АС еще нету и в наличии имеются три с половиной айпишки, выданных аплинком, первых пользователей предполагается NAT-ить.
— Естественно все это максимально бюджетно :)
Беглое изучение ассортимента opensource биллинговых систем показало, что оптимальным в данной ситуации может оказаться Stargazer по следующим причинам:
— Проект открыт, активно развивается, новые версии выходят с завидным постоянством.
— Не страдает врожденной монстроидальностью и позволяет допиливать функционал не привязываясь к внутренней механике
— Ядро написано на C/C++ и категорически быстрое
— Большой выбор методов подсчета трафика
— На выбор поддержка хранения данных в Файлах/MySQL/Firebird/PostgreSQL
— Волшебный механизм исполнения команд на удаленных серверах
Установка будет проходить на голую FreeBSD 8.2-RELEASE, установленную в варианте kern-developer + порты. Весь трафик пользователей будем рулить через удаленный NAS на все
той же FreeBSD 8.2, производя по нему NAT/Shape/NetFlow и отрисовку графиков загрузки абонентского канала при помощи bandwidthd. В роли вебинтерфейса для stargazer 2.407-p1 у нас будет выступать последний на момент написания топика Ubilling 0.1.7, хотя выбор фронтендов у Stargazer довольно широк — от Win-конфигуратора до нескольких консольных и XML-RPC API.
Далее прямой копипаст из консоли с периодическими заострениями внимания на концептуальных моментах.
Итак приступим к настройке биллингового сервера.
1. Морально готовимся
2. Установка зависимостей
# cd /usr/ports/databases/mysql51-server/ && make install # cd /usr/ports/textproc/expat2 && make install # cd /usr/ports/devel/libtool && make all && make install # cd /usr/ports/security/sudo && make install
Для простоты isc-dhcp собираем без DHCP_PARANOIA
# cd /usr/ports/net/isc-dhcp31-server/ && make install
php5 должен быть собран как минимум с поддержкой CLI и модулем Apache (последний должен нормально подтянуться зависимостью)
# cd /usr/ports/lang/php5 && make install
Собираем жизненно необходимые расширения PHP, а именно: ставим галочки на MYSQL, MBSTRING и ICONV
# cd /usr/ports/lang/php5-extensions/ && make config && make install
3. Собираем сам stargazer и его консольные конфигураторы в две строчки :)
# fetch http://stg.dp.ua/download/server/2.407-p1/stg-2.407-p1.tar.gz && tar zxvf stg-2.407-p1.tar.gz && cd stg-2.407-p1/projects/stargazer/ && ./build && gmake install # cd ../sgconf && ./build && gmake && gmake install && cd ../sgconf_xml/ && ./build && gmake && gmake install
4. Разворачиваем текущую версию Ubilling
# cd /usr/local/www/data/ # mkdir billing # cd billing # fetch http://ubilling.net.ua/ub.tgz # tar zxvf ub.tgz # chmod -R 777 content/ config/ multinet/ exports/ remote_nas.conf vservices.php
5. Делаем особую симлинковую магию
# mkdir /etc/stargazer/dn # chmod -R 777 /etc/stargazer/dn # ln -fs /usr/local/www/data/billing/multinet /usr/local/etc/multinet # ln -fs /usr/local/www/data/billing/remote_nas.conf /etc/stargazer/remote_nas.conf # ln -fs /etc/stargazer/dn /usr/local/www/data/billing/content/dn
6. Запускаем Apache и MySQL
# /usr/local/etc/rc.d/mysql-server start # /usr/local/etc/rc.d/apache onestart
7. Устанавливаем новый пароль пользователя root для mysql (newpassword — для примера)
#mysqladmin -u root password newpassword
8. Приводим /etc/stargazer/stargazer.conf к следующему виду
LogFile = /var/log/stargazer.log PIDFile = /var/run/stargazer.pid Rules = /etc/stargazer/rules DetailStatWritePeriod = 1/4 StatWritePeriod = 10 DayFee = 1 DayFeeIsLastDay = no DayResetTraff = 1 SpreadFee = no FreeMbAllowInet = no WriteFreeMbTraffCost = yes FullFee = yes <DirNames> DirName0 = Internet DirName1 = DirName2 = DirName3 = DirName4 = DirName5 = DirName6 = DirName7 = DirName8 = DirName9 = </DirNames> ExecutersNum = 1 ModulesPath = /usr/lib/stg <StoreModule store_mysql> dbhost = localhost dbname = stg dbuser = root rootdbpass = newpassword </StoreModule> <Modules> <Module auth_ao> </Module> <Module auth_ia> Port = 5555 UserDelay = 60 UserTimeout = 65 FreeMb = cash </Module> <Module conf_sg> Port = 5555 </Module> <Module cap_nf> TCPPort = 42111 UDPPort = 42111 </Module> <Module remote_script> SendPeriod = 10 SubnetFile =/etc/stargazer/remote_nas.conf Password = пароль_для_rscriptd UserParams=Cash Tariff Port = 9999 </Module> </Modules>
9. Редактируем конфиг /etc/stargazer/rules оставля аж одно нужное нам направление, а именно интернеты.
# echo "ALL 0.0.0.0/0 DIR0" > /etc/stargazer/rules
10. Добавляем наш первый NAS в /etc/stargazer/remote_nas.conf
# echo "172.16.0.0/18 172.16.0.2" > /etc/stargazer/remote_nas.conf
10. запускаем/останавливаем stargazer
# stargazer # killall stargazer
11. Убеждаемся, что умолчальная БД развернулась
# mysql -u root -p stg -e "S Enter password: +---------------+ | Tables_in_stg | +---------------+ | admins | | messages | | stat | | tariffs | | users | +---------------+
12. Редактируем /usr/local/etc/sudoers, добавляя туда пользователя, под которым будет работать Web интерфейс
User_Alias BILLING = www BILLING ALL = NOPASSWD: ALL
13. Разворачиваем дамп Ubilling
# cd /usr/local/www/data/billing/ # cat docs/test_dump.sql | mysql -u root -p stg
14. Убеждаемся, что все хорошо
#mysql -u root -p stg -e "SHOW TABLES" Enter password: +-----------------+ | Tables_in_stg | +-----------------+ | address | | admins | | ahenassign | | apt | | build | | cardbank | | cardbrute | | cashtype | | cfitems | | cftypes | | city | | contracts | | contrahens | | cpe | | cpetypes | | dhcp | | directions | | dshape_time | | emails | | employee | | jobs | | jobtypes | | messages | | modem_templates | | modems | | nas | | nethosts | | networks | | notes | | payments | | phones | | realname | | services | | servtariff | | speeds | | stat | | street | | switches | | switchmodels | | tags | | tagtypes | | tariffs | | taskman | | userreg | | users | | userspeeds | | vcash | | vcashlog | | vservices | | weblogs | +-----------------+
15. Редактируем файл config/billing.ini, доводя его до кондиции:
baseconf = sgconfxml SGCONF=/usr/sbin/sgconf SGCONFXML=/usr/sbin/sgconf_xml STG_HOST=localhost STG_PORT=5555 XMLRPC_PORT=8081 STG_LOGIN=admin STG_PASSWD=новый_пароль_админа_stargazer SUDO=/usr/local/bin/sudo TOP = /usr/bin/top -b CAT=/bin/cat GREP=/usr/bin/grep RC_DHCPD=/usr/local/etc/rc.d/isc-dhcpd UPTIME=/usr/bin/uptime PING=/sbin/ping KILL=/bin/kill STGPID=/var/run/stargazer.pid STGNASHUP=1 PHPSYSINFO=phpsysinfo/ LANG = ua TASKBAR_ICON_SIZE = 128 REGRANDOM_MAC=1 REGALWONLINE=1 REGDISABLEDSTAT=1
16. Разворачиваем заготовки стартовых скриптов
# cp -f docs/presets/FreeBSD/etc/stargazer/config /etc/stargazer/ # cp -f docs/presets/FreeBSD/etc/stargazer/GetMac /etc/stargazer/ # chmod a+x /etc/stargazer/*
17. И делаем прибивание IP+MAC в скрипте /etc/stargazer/OnConnect
#!/bin/sh LOGIN=$1 IP=$2 CASH=$3 ID=$4 MAC=`php /etc/stargazer/GetMac $LOGIN` /usr/sbin/arp -S $IP $MAC
18. Редактируем конфиг /etc/stargazer/config, прописывая в него текущие параметры MySQL
host = localhost username = root password = newpassword database = stg
19. Аналогично редактируем конфиг config/mysql.ini
;database host server = "localhost" ;database port port = "3306" ;user login username = "root" ;user password password = "newpassword" ;database name to use db = "stg" character = "UTF8" prefix = "billing"
20. Запускаем stargazer и меняем пароль администратора по умолчанию
# stargazer # sgconf_xml -s localhost -p 5555 -a admin -w 123456 -r "<ChgAdmin Login=\"admin\" Password=\"новый_пароль_админа_stargazer\"/>"
21. приводим наш /etc/rc.conf к виду
gateway_enable="YES" hostname="billing.isp" ifconfig_em0="inet 172.16.0.1 netmask 255.255.192.0" inetd_enable="YES" keymap="ru.koi8-r" sshd_enable="YES" named_enable="YES" sendmail_enable="NO" mysql_enable="YES" apache_enable="YES" dhcpd_enable="YES" dhcpd_flags="-q" dhcpd_conf="/usr/local/etc/multinet/dhcpd.conf" dhcpd_ifaces="em0"
22. Добавляем служебную зону ".isp" в /etc/namedb/named.conf
acl internals { 172.16.0.0/18; }; acl local { 127.0.0.1; }; zone "isp" { type master; file "/etc/namedb/master/isp"; allow-query { internals; local; }; };
и в /etc/namedb/master/isp
$TTL 86400 @ IN SOA isp. admin.isp. ( 2011101001 ; Serial 8H ; Refresh 1D ; Retry 2W ; Expire 1D ) ; Negative Cache TTL IN NS dns.isp. @ IN A 172.16.0.1 billing IN A 172.16.0.1 stat IN A 172.16.0.1 nas1 IN A 172.16.0.2
23. Создаем стартовый скрипт запуска stargazer в /etc/rc.d/billing
#!/bin/sh /usr/sbin/stargazer
и назначаем ему нужные права
# chmod a+x /etc/rc.d/billing
24. Прописываем нужные виртуалхосты в /usr/local/etc/apache/httpd.conf
NameVirtualHost *:80 <VirtualHost *:80> ServerName billing.isp DocumentRoot "/usr/local/www/data/billing/" AddDefaultCharset utf-8 </VirtualHost> <VirtualHost *:80> ServerName stat.isp DocumentRoot "/usr/local/www/data/billing/userstats/" AddDefaultCharset utf-8 </VirtualHost>
25. Правим глобальный шаблон по которому будут генерироваться конфиги dhcp, он находиться вот здесь: /usr/local/www/data/billing/config/dhcp/global.template
option domain-name "isp"; option domain-name-servers 172.16.0.1; default-lease-time 3600; max-lease-time 43200; authoritative; ddns-update-style none; log-facility local7; one-lease-per-client true; deny duplicates; shared-network ourisp { {SUBNETS} }
26. Выставляем нужный уровень логирования для dhcpd в /etc/syslog.conf
27. Можем сделать профилактический ребут чтобы посмотреть как все подымается, либо поперезапускать все, что мы уже понастраивали вручную.
28. А теперь самое интересное ради чего все затевалось :)
Заходим на наш servername.isp/billing и логинимся с логином и паролем по умолчанию admin/demo (не забываем сразу же сменить) и видим следующую картину:
Добавляем нужный нам класс трафика:
Добавляем сеть и сервис (напоминаю, что мы резервируем первых 10 IP под свои нужды)
Добавляем сети обработчик DHCP
и применяем к нему свой шаблон подсети
subnet {NETWORK} netmask {MASK} { default-lease-time 3600; option domain-name "ourisp"; option subnet-mask {MASK}; option routers 172.16.0.2; include "/usr/local/etc/multinet/{HOSTS}"; }
намекая таким образом, что шлюз по умолчанию должен быть в сторону нашего NAS сервера.
Проверяем, удачно ли создается конфиг dhcpd.conf в справочнике «Сети»
Добавляем свой первый тариф, пусть он будет зваться Unlim-1 и будет безлимиткой с абонплатой 50 денег в месяц
Навешиваем на него симметричную скорость в 1 мегабит/с
Добавляем наш сервер доступа который мы будем настраивать чуть пожже
В справочниках Городов, Улиц и домов добавляем наш населенный пункт, улицы и дома где будут жить абоненты
Ну и вроде все, регистрируем нашего первого абонента
Назначаем ему MAC, тариф, вписываем Ф.И.О. и все что нужно в «редактировании», и, в общем-то, он должен работать.
Настройка NAS сервера.
Опять же, имеем Голую FreeBSD 8.2, от которой хотим, чтобы она выступала шлюзом по умолчанию для наших пользователей.
Нужные модуля можно и просто подгрузить, но это дело привычки, так что соберем ядро руками с попутным выкидыванием всего что нам не нужно.
# cd /usr/src/sys/i386/conf/ # cp GENERIC NAS1
Заменяем в конфиге нашего нового ядра ident GENERIC на NAS1
options IPFIREWALL options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_FORWARD options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=50 options IPFIREWALL_NAT options LIBALIAS options ROUTETABLES=2 options DUMMYNET
И собираем/ставим его в одну строчку:
# config NAS1 && cd ../compile/NAS1 && make cleandepend && make depend && make && make install
Следим за тем, чтобы наш /etc/rc.conf имел где-то такой вид:
defaultrouter="1.2.3.3" gateway_enable="YES" hostname="nas1" ifconfig_em1="inet 1.2.3.4 netmask 255.255.255.0 -rxcsum -txcsum -tso" ifconfig_em0="inet 172.16.0.2 netmask 255.255.192.0 -rxcsum -txcsum -tso" inetd_enable="YES" sshd_enable="YES" firewall_enable="YES" firewall_nat_enable="YES" dummynet_enable="YES" firewall_script="/etc/firewall.conf" thttpd_enable="YES" thttpd_enable="YES"
Устанавлиеваем thttpd, которым будем показывать графички
# cd /usr/ports/www/thttpd/ && make install
Отличный сенсор NetFlow
# cd /usr/ports/net-mgmt/softflowd/ && make install
Expat нужен
#cd /usr/ports/textproc/expat2 && make install
И умеренно врущий, но идеально простой в настройке bandwidthd для отрисовки per-user графиков
# cd /usr/ports/net-mgmt/bandwidthd/ && make install
PHP собираем с поддержкой CLI
# cd /usr/ports/lang/php5 && make install
И модуль MYSQL к нему
# cd /usr/ports/lang/php5-extensions/ && make config && make install
Приводим наш /etc/firewall.conf к виду:
#!/bin/sh # отправляем netflow на биллинговый сервер /usr/local/sbin/softflowd -i em0 -n 172.16.0.1:42111 FwCMD="/sbin/ipfw -q" ${FwCMD} -f flush #сеть пользователей ${FwCMD} table 2 add 172.16.0.0/18 #сети которые не будем NAT-ить ${FwCMD} table 9 add 1.2.3.4/24 #NAT ${FwCMD} nat 1 config log if em1 reset same_ports ${FwCMD} add 600 nat 1 ip from table\(2\) to not table\(9\) via em1 ${FwCMD} add 601 nat 1 ip from any to 1.2.3.4 via em1 #политика блокирования по умолчанию ${FwCMD} add 65533 deny all from table\(2\) to any via em0 ${FwCMD} add 65534 deny all from any to table\(2\) via em0 ${FwCMD} add 65535 allow all from any to any
Выставляем правильные права на наш скрипт инициализации фаервола
# chmod a+x /etc/firewall.conf
Собираем rscriptd и обеспечиваем его запуск при ребуте
# fetch http://stg.dp.ua/download/server/2.407-p1/stg-2.407-p1.tar.gz && tar zxvf stg-2.407-p1.tar.gz && cd stg-2.407-p1/projects/rscriptd/ && ./build && gmake install
редактируем /etc/rc.d/rscriptd, приводя его к виду
#!/bin/sh /usr/sbin/rscriptd
и назначаем ему правильные права
#chmod a+x /etc/rc.d/rscriptd
Разворачиваем заготовки скриптов Ubilling
# mkdir ubilling && fetch http://ubilling.net.ua/ub.tgz && tar zxvf ub.tgz && cd ubilling # mkdir /etc/stargazer/dn && chmod a+w /etc/stargazer/dn # cp -f docs/presets/FreeBSD/etc/stargazer/* /etc/rscripd/ # chmod a+x /etc/rscriptd/*
Редактируем конфиг /etc/rscriptd/config, прописывая в него текущие параметры MySQL для того, чтобы скрипты GetSpeed, GetUpSpeed, GetMAC могли нормально получать информацию о пользователях.
Также, не забываем поправить /etc/rscriptd/OnConnect, указав в нем входной интерфейс для шейпинга, который в нашем случае
IFACE="em0"
Настраиваем bandwidthd для того, чтобы он рисовал красивые графики, которые мы потом должны лицезреть в Ubilling:
В файл /usr/local/bandwidthd/etc/bandwidthd.conf вписываем сеть наших пользователей
subnet 172.16.0.0/18 dev "em0" output_cdf true recover_cdf true
добавляем периодический SIGHUP для bandwidthd в crontab -e
3 3 * * * /bin/kill -HUP `cat /var/run/bandwidthd.pid`
И опять страшная симлинковая магия, чтобы наш thttpd мог нормально показывать графички
# mv /usr/local/bandwidthd/htdocs /usr/local/www/data/band # ln -fs /usr/local/www/data/band/ /usr/local/bandwidthd/htdocs # cp /usr/local/etc/thttpd.conf.sample /usr/local/etc/thttpd.conf
Обеспечиваем при загрузке запуск
# /usr/local/bandwidthd/bandwidthd # /usr/local/etc/rc.d/thttpd start
И как последний штрих, добавляем более-менее универсальные вещи, помогущие хоть как-то поднять быстродействие в дальнейшем в /etc/sysctl.conf
net.inet.ip.fw.one_pass=1 net.inet.ip.fastforwarding=1 net.inet.tcp.nolocaltimewait=1
После перезагрузки получаем работающий NAS, получающий удаленно команды от биллинга, отправляющий ему сведения о трафике и все остальное, что от него требовалось.
Хотелось бы еще написать о настройке кабинета пользователя, недокументированых «фичах» с переходом на следующий месяц и прочих вещах, на которых можно споткнуться в первое время. Но статья и так уже получилась слишком монстроидальной и нудной. Обещаюсь, если карма позволит, на недельке описать все эти вещи в отдельном сказании.
Оффсайт Stargazer
Оффсайт Ubilling