Таксуване с отворен код ABillS

0. ПредисторияПреди около две години сравнително малка, но разрастваща се мрежа, в която аз, по волята на съдбата, се оказах системен администратор, се изправи пред задачата да внедри нова система за таксуване. Изискванията се оказаха прости и доста банални за онези места, където интернетът не струва нито стотинка и не всеки е готов да плаща за неограничено:

  • Възможност за създаване на тарифни планове за мегабайт и неограничени
  • Възможност за отчитане на трафика по посоки (свободен град-държава-свят)
  • Безплатно решение (думата отворен код тогава не представляваше голям интерес)
  • Нормален уеб потребителски и администраторски интерфейс
  • Разширяема функционалност за бъдещето
  • Поддръжка за различни платежни системи (по-специално, интересувах се от плащане с карти за презареждане
От голям брой кандидати внезапно останаха само двама: NeTAMS и ABillS. След подробно разглеждане NeTAMS също изчезна - методите му на работа в никакъв случай не бяха подходящи за мен и беше осезаемо усещането, че таксуването за него е просто модул. Освен това уеб интерфейсът меко казано не работеше. Тъй като нямах алтернативи, продължих да инсталирам ABillS. Може би ще се въздържа да разказвам всички перипетии на изучаването на нов софтуер и ще ви предложа квинтесенцията от моите познания за инсталиране на най-доброто според мен таксуване с отворен код.

1. ИнсталиранеВ тази публикация ще разгледам инсталациите изключително за FreeBSD и версия 7.0 (все пак инсталацията на 6.x има малки разлики). Ако сте щастлив собственик на Linux на сървъра, съветвам ви да се обърнете към тази статия от Glooom.

1.1 Подготовка на ядротоТъй като таксуването все още е доста сериозна система, предпочитамвсички функции, използвани в работата, трябва да бъдат в ядрото, а не в модули. Затова добавяме следните опции към нашата конфигурация за изграждане на ядрото: опции NETGRAPH #включете NETGRAPH в ядрото опции NETGRAPH_IPFW #ng_ipfw възел

опции LIBALIAS # изисква се за ng_nat опции NETGRAPH_NAT #възел ng_nat опции NETGRAPH_NETFLOW #възел ng_netflow за събиране на статистика ### Изисква се за работа на MPD ### опции NETGRAPH_SPLIT опции NETGRAPH_KSOCKET

опции NETGRAPH_SOCKET опции NETGRAPH_BPF опции NETGRAPH_IFACE опции NETGRAPH_MPPC_ENCRYPTION опции NETGRAPH_PPP опции NETGRAPH_PPTPGRE опции NETGRAPH_TCPMSS опции NETGRAPH_VJC опции NETGRAPH_TE E опции NET GRAPH_CAR ### --- ###

ext_if="re0" # име на външен интерфейс ext_ip="1.2.3.4" # външен IP, към който потребителите ще бъдат NAT

#Create node ng_nat $ mkpeer ipfw: nat 60 out $ name ipfw:60 nat $ connect ipfw: nat: 61 in $ msg nat: setaliasaddr $

# Правила на защитната стена $ -f flush #нулиране на всички правила на защитната стена

# Създайте таблица за nat (номер 127) $ table 127 flush #почистете таблицата $ table 127 add 10.39.0.0/16 # добавете мрежи от сиви ip потребители

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

1.3 Необходим софтуер

За нормална операция по таксуване, Iизползвайки следния софтуер (всички от портове):

  • apache22 (версията е въпрос на вкус)
  • flow-tools (набор от помощни програми за събиране на netflow потоци)
  • freeradius (RADIUS сървър)
  • mpd5 (ще го използваме като VPN сървър)
  • mysql-сървър, mysql-клиент (целта, надявам се, не е необходимо да се обяснява)
  • 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 и копираме файловете acct_users, clients.conf, eap.conf, rlm_perl.conf и потребители в папката freeradius (по подразбиране това е /usr/local/etc/raddb). Нека не забравяме да преименуваме файла rlm_perl.conf на radiusd.conf и да въведете IP и паролата за достъп до радиуса във файла clients.conf (В примера ще се използват стойностите на 127.0.0.1 и radsecret).

За да направите ограничаване на скоростта чрез MPD, който ще използваме, добавете речник за MPD в края на речника: VENDOR mpd 12341

mpd RIBUTE mpd-limit 7 string mpd ATTRIBUTE mpd-drop-user 154 integer mpd Това завършва настройката. Изпълнете radiusd -X и внимателно прочетете изхода за грешки. Ако няма грешки, добавете/etc/rc.conf магическа линия radiusd_enable="YES" и стартиране на radius като демон.

по подразбиране: зареди 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 #here set the local IP where MPD will #wait for connections set pptp self 10 .37.2 54.253 set link enable incoming #IP, RADIUS server парола и портове 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 radi повторни опити с нас 3 Настройката на MPD е завършена. Не забравяйте да добавите реда mpd_enable="YES" към /etc/rc.conf

Внимание!Ако вашата система стане нестабилна и умре с "двойна грешка", не забравяйте да актуализирате изходните кодове на ядрото. В последната версия този проблем вече е решен. Моят PR kern/125314 относно това

2.3 Конфигуриране на Netflow CollectorНа първо място, няколко думи защо 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="ДА" 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Конфигурирането на уеб интерфейса е толкова банално, че ще си позволя само да дам работеща конфигурация и да кажа, че можете да използвате скрипта sslcerts.sh в папката contrib на ABillS за генериране на сертификати. SSLEngine на SSLOptions +StrictRequire SSLProtocol -all +TLSv1 +SSLv3 SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM SSLCertificateFile /usr/local/abills/Certs/server.crt SSLCerti ficate KeyFile /usr/local/abills/Certs/server.key SSLVerifyClient none SSLProxyEngine изключен SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

DocumentRoot /usr/local/abills/cgi-bin Име на сървър stat.example.com #ServerAlias ​​​​com ServerAdmin [email protected] ErrorLog /var/log/error_log TransferLog /var/log/access_log

Псевдоним / "/usr/local/abills/cgi-bin/" RewriteEngine на RewriteCond % ^(.*) RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1] Опции Индекси ExecCGI SymLinksIfOwnerMatch AddHand ler cgi-script .cgi Опции Индекси ExecCGI FollowSymLinks AllowOverride няма DirectoryIndex index.cgi Поръчка разреши,откажи Разреши от всички

Поръчка разреши, откажи Откажи от всички

#Интерфейс на администратора AddHandler cgi-script .cgi Опции Индекси ExecCGIFollowSymLinks AllowOverride none DirectoryIndex index.cgi order deny,allow allow от всички

Ако получите грешка 500, не забравяйте да проверите error.log - почти сигурно е или нещо в базата данни, или в Perl липсва някакъв модул.

2.5 Настройване на ABillSСега стигаме до най-вкусното. Въпреки това ще си позволя да не се спирам подробно на всички характеристики. Горните конфигурации ще ви позволят да получите работеща система за възможно най-кратко време. Качете файловете за таксуване в създадената база данни с име abills # mysql -D abills Вторият файл активира IPN разширението, което ще използваме

Един ефективен метод за ограничаване на честотата на клиентите при използване на MPD е връщането на подходящи филтри в пакета RADIUS Start. Така например, за да създадете лимит за тарифен план 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: 1 0 * * * root /usr/abills/libexec/periodic daily 1 0 * * * root /usr/abills/libexec/periodic monthlyНе добавяйте, както се препоръчва от билд за ръчно извикване -all в Cron. В нашия случай това не е необходимо - и освен това, вредно - ще изключи потребителите в границите на интервали от време.

Това завършва основната настройка и вашият VPM сървър трябва да е готов за работа.

3. Лични впечатления - буре медПолзвам ABillS като производствен сървър повече от 2 години. През това време нямаше нито един сериозен отказ и общото време на престой вероятно не достигна 2 часа, от които един час беше преходът към нови версии на таксуването. Само веднъж, в навечерието на Нова година, поради малка грешка, таксуването започна да изпуска всички потребители по времеви лимит. Отне ми 15 минути, за да коригирам тази грешка. Като цяло системата предоставя много удобни отчети за потребителите, цялата необходима информация се съхранява в базата данни, много различни модули улесняват живота - просто приятно изживяване. Нашите приятели купиха UTM за себе си и имаха много повече проблеми с него, дори и да са платили поддръжка

Hardcore conf в C++. Каним само професионалисти.