Opensource білінг ABillS

0. ПередісторіяБлизько двох років тому перед порівняно невеликою мережею, що розвивається, в якій я, волею доль, виявився системним адміністратором, постало завдання впровадження нового білінгу. Вимоги виявилися простими і досить банальними для тих місць, де Інтернет коштує не копійки і далеко не всі готові платити за безліміти:

  • Можливість створення помегабайтних тарифних планів та безлімітів
  • Можливість обліку трафіку за напрямками
  • Безкоштовне рішення (слово opensource тоді ще мало цікавило)
  • Інтелектуальний web-інтерфейс користувача та адміністратора
  • Можливість розширення функціоналу на майбутнє
  • Підтримка різних систем оплати (зокрема, цікавила оплата картками поповнення
З великої кількості кандидатів, якось різко залишилося лише два: NeTAMS і ABillS. Після детального розгляду відпав і NeTAMS — його методи роботи аж ніяк не підходили для мене, та й відчутно відчувалося, що білінг для нього — лише модуль. Більше того, користувальницький web-інтерфейс не працював. Не маючи альтернатив, я приступив до встановлення ABillS. Мабуть я утримаюся від розповіді всіх перипетій вивчення нового софту, і запропоную вам квінтесенцію моїх знань щодо встановлення кращого, на мою думку, opensource-білінгу.

1. УстановкаУ цьому записі я розглядатиму установку виключно для FreeBSD, до того ж версії 7.0 (установка на 6.х має незначні, але відмінності). Якщо Ви щасливий власник Linux на сервері - раджу звернутися до цієї статті хабралюдини Glooom.

1.1 Готуємо ядроОскільки білінг — все-таки досить серйозна система, я віддаю перевагувсі використовувані у роботі функції мати у ядрі, а чи не в модулях. Тому додаємо в наш конфіг складання ядра наступні опції: options NETGRAPH #підключаємо NETGRAPH до ядра options NETGRAPH_IPFW #вузол ng_ipfw

options LIBALIAS # потрібен для роботи ng_nat options NETGRAPH_NAT #вузол ng_nat options NETGRAPH_NETFLOW #вузол ng_netflow для збору статистики ### Потрібно для роботи MPD ### options NETGRAPH_SPLIT

options NETGRAPH_SOCKET options NETGRAPH_BPF options NETGRAPH_IFACE options NETGRAPH_MPPC_ENCRYPTION options NETGRAPH_PPP options NETGRAPH_PPTPGRE options NETGRAPH_OPS _TEE options NETGRAPH_CAR ### --- ###

ext_if="re0" # ім'я зовнішнього інтерфейсу ext_ip="1.2.3.4" #зовнішній IP який буде NAT'иться користувачі

#Створюємо вузол ng_nat $ mkpeer ipfw: nat 60 out $ name ipfw:60 nat $ connect ipfw: nat: 61 in $ msg nat: setaliasaddr $

# Правила фаєрволла $ -f flush #скидаємо всі правила фаєрволла

# Створюємо табличку для ната (номер 127) $ table 127 flush #чистимо табличку $ table 127 add 10.39.0.0/16 # додаємо мережі сірих ip користувачів

#дозволяємо все на loopback $ add 00001 allow ip from any to any via lo0 # все що прийшло із зовнішнього інтерфейсу загортаємо в NAT $ add 00003 netgraph 61 all from any to $ in via $ #Все, що йде від Інтернет-користувачів - у NAT $ add 60021 netgraph 60 ip from "table(127)" to any У цьому скрипті ми організовуємо NAT користувачів з IP 10.39.0.0/16 в IP 1.2.3.4. Все це реалізовано на таблицях, оскільки часом виникає необхідність NAT'ити несуміжні діапазони

1.3 Необхідне ПО

Для нормальної роботи білінгу явикористовую наступне ПЗ (усі з портів):

  • apache22 (версія - справа смаку)
  • flow-tools (набір утиліт для збору netflow-потоків)
  • freeradius (RADIUS-сервер)
  • mpd5 (використовуватимемо його як VPN-сервер)
  • mysql-server, mysql-client (призначення, я сподіваюся, пояснювати не треба)
  • p5-DBD-mysql (для доступу до mysql з Perl)
  • p5-Digest-MD4, p5-Digest-SHA1 (використовуються для шифрування в білінгу)sudo (деякі команди треба буде запускати від непривілейованого користувача)

Стандартна конфігурація, запропонована в FreeBSD цілком мене влаштовує. Єдине - зберіть mpd5 з ng_car з портів, якщо ви все-таки зважилися ставити на FreeBSD 6.x.

1.4 Встановлення ABillS

2.1. RADIUSОтже, не мудруючи лукаво, заглянемо в папку contrib/freeradius ABillS'а і скопіюємо в папку freeradius'а (за замовчуванням це /usr/local/etc/raddb) файли acct_users, clients.conf, eap .conf, rlm_perl.conf та users . Файл rlm_perl.conf не забудемо перейменувати в radiusd.conf, а файл client.conf впишемо IP і пароль для доступу до радіусу (У прикладі будуть використовуватися значення 127.0.0.1 і radsecret).

Для того, щоб заробило обмеження швидкості засобами MPD, яке ми збираємося використовувати, допишемо в кінець 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 5>ATTRIBUTE mpd-filter 6 string mpd ATTRIBUTE mpd-limit 7 string mpd ATTRIBUTE mpd-drop-user 154 integer mpd На цьому налаштування завершено. Запускаємо radiusd -X та уважно читаємо висновок на наявність помилок. Якщо помилок немає - дописуємо в/etc/rc.conf магічний рядок radiusd_enable="YES" і запускаємо радіус як демона.

default: load pptp_server

create link template L pptp set link action bundle B set link enable multilink set link yes acfcomp protocomp set link no pap chap set link enable chap set link yes crypt -reqd set link mtu 1460 #тут задаємо локальний IP на якому MPD буде #чекати з'єднань set pptp self 10.37.254.253 set link enable incoming #IP, пароль і порти RADIUS-сервера set radius server 127.0.0.1 radsecret 1812 1813 set radius timeout 10 set auth acct-update 300 set auth enable radius-auth set auth enable radius- acct set radius retries 3 Налаштування MPD завершено. Не забудьте додати до /etc/rc.conf рядок mpd_enable="YES"

Увага!Якщо ваша система поводиться нестабільно і вмирає з «double fault» обов'язково оновіть вихідні коди ядра. У новій версії цю проблему вже вирішено. Мій PR kern/125314 з цього приводу

2.3 Налаштовуємо Netflow колекторПерш за все, пара слів чому з усіх варіантів підрахунку трафіку було обрано Netflow:

  • Стандартність рішення - MPD потім можна легко замінити на Mikrotik або апаратний VPN-сервер (наприклад CISCO)
  • Зв'язка IPN+Netflow вирішує дві проблеми безкоштовної версії ABillS'а — зняття грошей з рахунку користувача здійснюється тільки після закінчення сесії та розрив сесії на межі часових інтервалів
Перш за все необхідно створити посилання в самому ABillS # cd /usr/abills/libexec/ # ln -s ../Abills/modules/Ipn/trafdstats trafdstats # ln -s .. /Abills/modules/Ipn/traffic2sql traffic2sql Дадимо права користувачеві flowtools на папку, в яку буде збирати трафік #chown flowtools/usr/local/abills/var/log/ipn/ Якщо папки /usr/local/abills/var/log/ipn не існує - створіть її

Редагуємо /etc/rc.conf flow_capture_enable="YES" flow_capture_datadir="/usr/local/abills/var/log/ipn/" flow_capture_port="9996" flow_capture_flags="- S 5 -n 1300 -N 0 -d 5" Єдиний параметр, що цікавить нас, - це -n 1300 - ротація логів буде 1300 разів на добу, що становить близько однієї хвилини.

2.4 Налаштування ApacheНалаштування web-інтерфейсу настільки банальне, що я дозволю собі лише навести робочий конфіг і сказати, що для генерування сертифікатів ви можете скористатися скриптом sslcerts.sh у папці contrib ABillS'а. SSLEngine on SSLOptions +StrictRequire SSLProtocol -all +TLSv1 +SSLv3 SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM SSLCertificateFile /usr/local/abills/Certs/server.crt SSLCertificateKeyFile /usr/local/abills/Certs/server.key SSLVerifyClient none SSLProxyEngine off SetEnvIf User-Agent ".*MSIE. *" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

DocumentRoot /usr/local/abills/cgi-bin ServerName stat.example.com #ServerAlias ​​com ServerAdmin [email protected] ErrorLog /var/log/error_log TransferLog / var/log/access_log

Alias ​​/ "/usr/local/abills/cgi-bin/" RewriteEngine on RewriteCond % ^(.*) RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION :%1] Options Indexes ExecCGI SymLinksIfOwnerMatch AddHandler cgi-script .cgi Options Indexes ExecCGI FollowSymLinks AllowOverride none DirectoryIndex index.cgi Order 5>Allow from all

Order allow,deny Deny from all

#Admin interface AddHandler cgi-script .cgi Options Indexes ExecCGIFollowSymLinks AllowOverride none DirectoryIndex index.cgi Order deny,allow allow from all

У разі отримання 500-ї помилки - обов'язково дивіться в error.log - майже напевно або щось із базою даних, або Perl'у не вистачає якогось модуля.

2.5 Налаштування ABillSОсь ми і підійшли до найсмачнішого. Тим не менш, я дозволю собі не зупинятися детально на всіх особливостях. Наведені конфіги дозволять у мінімальний час отримати працездатну систему. Завантажимо у створену базу даних з ім'ям abills файли для роботи з білінгом # mysql -D abills Другий файл активує розширення IPN, яким ми і скористаємося

Одним з ефективних методом обмеження швидкості клієнтів при використанні MPD є повернення в Start-пакеті RADIUS відповідних фільтрів. Таким чином, наприклад, для створення обмеження за тарифним планом 64 достатньо в RADIUS-параметри цього тарифного плану включити наступний рядок: mpd-limit+=out#1=all shape 64000 pass,mpd-limit+=in#1=all shape 64000 pass При цьому обмеження швидкості буде здійснюватися за допомогою вузла ng_car, що, як показала моя практика, набагато ефективніше за нарізання засобами ipfw+dummynet. На жаль, з незрозумілих причин, ABillS «з коробки» неправильно обробляє оператор "+=" у тарифних планах. Щоб виправити це прикрі непорозуміння знайдіть у Auth.pm такі рядки: $RAD_PAIRS-> =

s/\"//g; push( @ >, $right ); > else < $RAD_PAIRS->= [ $right ]; > Після цього ABillS коректно передаватиме атрибути у форматі "+="

NAS отримає номер (швидше за все це буде «1»). Тепер відкрийте crontab і впишіть наступний рядок: */5 * * * * /usr/local/abills/libexec/traffic2sql1 flowdir=/usr/local/abills/var/log/ipn не забувши замінити 1 на номер Вашого NAS. Тепер усі дані про трафік ваших користувачів враховуватимуться білінгом. Также можете дописати до crontab виклик periodic скриптів: 1 0 * * * root /usr/abills/libexec/periodic daily 1 0 * * * root /usr/abills/libexec/periodic monthly >Не вноситеяк рекомендовано керівництвом виклик billd -all у Cron. У нашому випадку він не потрібен — і більше, шкідливий, — він роз'єднуватиме користувачів на кордонах тимчасових інтервалів.

На цьому базове налаштування завершено, і ваш VPM-сервер має бути готовим до роботи.

3. Особисті враження — бочка медуЯ використовую ABillS як бойовий сервер вже понад 2 роки. За цей час не траплялося жодного серйозного збою, а загальний downtime не склав у сумі напевно і 2 години, з яких година — перехід на нові версії білінгу. Лише раз, у новорічну ніч, через незначну помилку, білінг став дропати всіх користувачів за time-limit. На усунення цієї помилки у мене пішло 15 хвилин. Загалом система надає дуже зручні звіти користувачам, вся потрібна інформація зберігається в БД, купа різних модулів полегшує життя — одні приємні враження. Наші друзі купили собі UTM і з ним у них проблем було набагато більше, навіть за наявності платної підтримки.

Хардкорна конфа за С++. Ми запрошуємо лише профі.