Cистема обліку трафіку користувачів Sbilling, Локальні мережі, статті

Комп’ютерна газета

У великій і дружній родині open source поповнення: відкрився новий російський проект – simple billing system. Що таке sbilling? За словами авторів, це проста білінгова система, що використовується для підрахунку мережевого трафіку. Була написана (і продовжує розвиватися) із за відсутності в Linux системного білінгу як такого. Написана повністю на мові C. Розповсюджується за ліцензією GPL, яка, як водиться, додається до пакету. Завантажити і, природно, задарма в своє задоволення використовувати, можна з сайту автора – sbilling.lrn.ru/download/.

Тлумачного опису пакета на сайті розробників немає, оскільки проект тільки-тільки стартував, та й хлопцям-програмістам, балующімся у вільний від роботи час GPL-программізмом, писати user-freindly опису напевно лінь. Оскільки тестувати це господарство нам в редакції було ліниво, я спробую “на пальцях” пояснити як цей “псевдобіллінг” працює, і далі проілюструвати сказане витягами з рідного імпровізованого man’а, оскільки IMHO man – найкращий спосіб усвідомити, що програма здатна робити в принципі. Плюс до того для самих допитливих (але ледачих для негайного вивчення Сорс 😉 Мережевиків в урізанні пропонується інформація для потенційних розробників – подробиці принципу роботи програми і формат пакетів, за допомогою яких відбувається взаємодія.
У двох словах, рішення складається з двох демонів, один з яких проксі – сервер, а інший – біллінг-сервер. Залежно від контексту вони по черзі є один для одного клієнтом або сервером, але в ході розповіді нижерасположенного man’a під “сервером” понінімается біллінг-сервер, а під “клієнтом” – проксі-сервер. Розташовуватися вони можуть на різних хостах, оскільки всі взаємовідносини між демонами відбувається за звичайним TCP-з’єднанню. Користувачі працюють через “ручний” (здатний працювати з біллінг-сервером) socks-проксі, він скидає інформацію по напрацювань біллінг-серверу, останній пише отримані відомості до бази даних. Для установки системи sbilling вам буде потрібно власне ОС Linux ядро ​​2.0 або вище (реально перевірено на 2.2.X і 2.4.X) пакет GNU Make і компілятор C (наприклад GCC). Так само потрібен пакет devel від mysql або просто заголовні файли з бібліотеками mysql.
На жаль на даний момент графічний інтерфейс для роботи з базою даних відсутній, і підтримується тільки 32 розрядна архітектура і операційна система Linux, хоча, можливо, збереться в інших системах. Ось, з більшого, і всі справи 🙂 Для тих, кому цікаво – пропонуємо нижченаведений шматок man’а.

Конфігурування

Після проведення установки системи, добавте групу billing і однойменного користувача в цю групу (useradd-g billing billing). За замовчуванням використовується користувач billing, ви можете змінити ім’я.
Занесіть в таблицю proxyes ваших клієнтів. Формат таблиці наступний | id | addr | port | try_addr | try_username | try_resolv | about |, де: id – унікальний номер (primary key) в таблиці mysql, addr – адреса клієнта формату IP (192.168.2.1) або символічне ім’я (повинно бути прописано в зоні DNS) до 255 символів, port до якого буде коннектіться sbillng – від 1 до 65536 (для socks за замовчуванням 1081), try_addr – значення 0 або 1 – відображати чи в статистиці адресу користувача у вигляді IP (192.168.2.1), try_username – значення 0 або 1 – відображати чи в статистиці ім’я користувача (у socks-сервера має сенс тільки при наявності авторизації), try_resolv – значення 0 або 1 – дана опція враховується тільки при try_addr = 1 і вказує, перетворювати чи IP-адресу користувача в ім’я машини, при невдалому перетворенні в статистику заноситься IP-адресу, about – рядок в 255 символів – коротка характеристика клієнта. Наприклад:
insert into proxyes values(NULL,’socks.proxy.com’,1081,1,0,1,’socks proxy server in server 1′); 
заведе в таблиці proxyes проксі-сервер з адресою socks.proxy.com, порт для зв’язку з проксі-сервером – 1081, в статистику заносити імена машин, отресолвленние по IP-адресою і не заносити імена користувачів, в полі about – “сокс проксі-сервер на сервері 1”.
Бажано прикрити порти проксі-сервера і sbilling’a (за замовчуванням 800 порт) файрволом!

запуск socks сервера

Якщо ви встановили всі параметри при компіляції socks сервера, можете просто запустити його, набравши. / Socks, або використовувати наступні параметри (перераховуються тільки параметри додані в socks сервер):
-Bh | – billing-host ip_addr – адреса, на якому socks-сервер відкриє порт для білінгу (за замовчуванням все інтерфейси);
-Bp | – billing-port port – номер порту, який socks-сервер відкриє для білінгового сервера (за умовчанням 1081);
-Bs | – billing-server host – IP-адреса або ім’я хоста, на якому нахродітся sbiling (за умовчанням localhost);
-Bsp | – billing-server-port port – порт sbiling, до якого треба коннектіться (за замовчуванням 800).
Всі значення за замовчуванням вищевказаних параметрів можуть бути змінені при компіляції програми.
Після запуску, socks-сервер пошле пакет connect sbilling-серверу. Після чого sbilling-сервер спробує встановити зв’язок з socks-сервером.

зупинка socks сервера

Тепер socks-сервер можна зупинити тільки сигналом SIGTERM kill pid або kill-TERM pid При отриманні сигналу SIGTERM socks-сервер змушує своїх чаілдов вийти і відправляє дані sbilling-серверу. При неможливості відправити дані на sbilling-сервер, дані, що знаходяться в буфері, втрачаються.
Не рекомендується зупиняти socks-сервер за допомогою kill -9 (kill): при цьому пропадають дані, що знаходяться в буфері socks-сервера.

запуск sbilling

Бажано спочатку провести запуск вручну, після вдалого запуску додати рядок запуску в startup-скрипти (в каталог / etc / rc.d або щось в цьому дусі – в залежності від вашого дистрибутива). Запуск sbilling обов’язково проводиться з опцією пароля для бази mysql, наприклад:
./sbilling -sp password
Параметри запуску:
– Help – висвітити меню допомоги по параметрам;
-Bs | – billing-server addr – IP-адреса, на якому сервер відкриє порт (за умовчанням на всіх інтерфейсах);
-Bp | – billing-server-port port – номер порта, який відкриє sbilling (за замовчуванням 800);
-Ss | – sql-server addr – адреса sql-сервера (IP або ім’я, по замовчуванню localhost);
-Ssp | – sql-server-port port – порт sql-сервера (за умовчанням 3306);
-Sb | – sql-database database – назва бази на sql-сервере (за замовчуванням billing);
-Su | – sql-username username – ім’я користувача для з’єднання з sql-сервером (за замовчуванням billing);
-Sp | – sql-user-password password – обов’язкова опція, пароль для коннекта до бази даних (значення за замовчуванням відсутня).
-U username – права користувача, з якими буде працювати sbilling (за замовчуванням billing). Всі значення за замовчуванням вищевказаних параметрів (крім password) можуть бути змінені при компіляції програми.
Після запуску sbiling-cервер прочитає таблицю proxyes і встановить з’єднання з усіма клієнтами. Ви можете спостерігати в балці записи виду:
alarm OK ansve all_ok proxy id=1
з періодичністю 150 секунд. Це означає, що система працює нормально.

зупинка sbilling сервера

Зупинити sbilling сервер ви можете надіславши один із сигналів SIGTERM або SIGINT – kill-TERM pid.
При отриманні одного з сигналів біллінг сервер розриває з’єднання з клієнтами і скидає всю статистику в базу sql. При неможливості з’єднається з sql всі дані заносяться в swap-файл.
Не рекомендується робити сигнал kill -9 (KILL) процесу sbilling: при цьому всі дані в буферах губляться.
Попередження: так як запис даних в sql-базу вимагає деякого часу, підкоригуйте скрипт / etc/rc.d/rc.0 (6) (або інший, в залежності від вашого дистрибутива), що відповідає за перехід в режим init0 (6).
Збільште час sleep між командами killall -15 sleep 5 killall -9 до 20 секунд або більше (в залежності від завантаженості вашої мережі). При цьому у вас буде гарантія, що по команді halt (reboot, shutdown) звільняться буфери sbiling-сервера.

Режими роботи sbilling-сервера

Основний режим. Має на увазі: а) перекличку пакетами i_live про підтвердження підтримки коннекта, б) прийом даних від клієнта, в) запис даних у базу mysql. Також в цьому режимі відкритий порт 800 (default) для прийняття запитів коннекта до клієнта.
режим очікування клієнта. В даном режимі sbilling може знаходиться в двох варіантах: а) при старті sbilling не зміг з’єднається з клієнтом, б) стався розрив зв’язку з клієнтом (тобто немає пакетів i_live протягом 150 секунд).
В цьому режимі sbiling намагається пріконнектіться до клієнта раз в 150 секунд і чекає пакета connect. По приходу повідомлення про коннекте, з’єднання з клієнтом відбувається негайно.
режим ре-ініціалізації. Можливо ви внесли зміни в таблицю proxyes і хочете зробити ре-ініціалізацію. Пошліть процесу sbilling сигнал HUP kill-HUP pid. При цьому sbiling розірве з’єднання з усіма клієнтами, перечитає таблицю proxyes і зробить з’єднання до клієнтами відповідно до таблиці proxyes.
режим очікування SQL. При старті демона sbilling обов’язково повинен бути доступ до бази sql-сервера для ініціалізації таблиці клієнтів. При неможливості прочитати дані з бази sql, sbilling буде намагатися пріконнектітся до бази один раз в 60 секунд. Під час роботи sbiling-сервера може бути втрачено зв’язок з sql-сервером При цьому дані, що надходять від клієнтів, будуть заноситися в файл / var / sbilling / billing_swap (Default). Дані заносяться в перетвореному вигляді, тобто, якщо у вас стоїть опція резолвіть IP-адреси, будуть записуватися імена машин, так-же кожному пакету буде відповідати поточна дата. В даному режимі можна вимкнути комп’ютер або переініціалізіровать демон sbilling. При наступному старті або при вдалому поєднанні з базою sql-сервера sbilling прочитає swap-файл і перенесе дані звідти в базу sql.
Увага: при неможливості запису в swap-файл всі клієнти переводяться в примусовий stop-режим, дані, що знаходяться в буферах sbiling-сервера, а так-же надходять після переходу в режим stop, губляться. В режимі очікування sql-сервера в ERR-логу ведуться записи про втрату зв’язку з sql-сервером.
stop режим. В даний режим sbilling-сервер може переключитися з однієї причини: немає доступу до бази sql і немає можливості записувати дані в swap-файл. Увага: при неможливості запису в swap-файл все клієнти переводяться в примусовий stop-режим, дані, що знаходяться в буферах sbiling-сервера, а також надходять після переходу в режим stop, губляться.
В даному режимі відбувається запис в ERR-лог про втрату зв’язку з sql-сервером і неможливості записи в swap-файл, при цьому буде заноситься записи виду:
Jan 25 21:01:44 alex ./sbilling [1696]: lose addr=16777343 user=alex in=10822 \ out=530 id=1100 pole=2001-01-25 mons=1
де дані після lose – це втрачений пакет. Також в ERR-лог буде заноситися запис про переведення всіх клієнтів в stop режим кожні 150 секунд.
Якщо в даному режимі пере-ініціалізується клієнт і пошле sbilling-серверу пакет connect, то клієнт тут же буде переведений в примусовий stop режим.
Даний режим буде вдосконалюватися надалі аж до реплікації між декількома серверами sbilling.

Режими роботи клієнта (proxy сервера)

Основний режим. а) передача пакетів i_live та отримання відповідей ansve кожні 150 секунд, б) передача пакетів даних sbilling серверу (кожні 150 секунд, або при переповненні буфера).
режим очікування billing-сервера. Або stop режим. В даному режимі клієнт може перебувати з двох причин: 1. при старті не було встановлено зв’язок з sbilling-сервером, 2. було втрачено зв’язок з sbilling- сервером і вона не воccтановілась в інтервалі від 150 до 300 секунд. В даному режимі клієнт шле пакети connect кожні 150 секунд. Примітка: socks-сервер не дає вихід в інтернет поки не переключиться в нормальний режим.
примусовий stop режим. В примусовий stop режим клієнта перемикає sbilling-сервер в аварійній ситуації (дивіться stop-режим sbilling). При цьому клієнт вбиває всіх своїх Чайлд, відправляє всю інформацію sbilling-серверу і запобігає користувачам вихід в інтернет. Тільки З примусового stop режиму клієнта може вивести sbilling-сервер або перезапуск (клієнта).

Робота з базою даних

За замовчуванням база даних для сервера sbilling називається billing. База складається з таблиць 3-х видів. Таблиця proxyes: список клієнтів (проксі-серверів). Формат таблиці см. вище.
Таблиці mons01 – mons12. Це таблиці місяців, відповідно від 1 до 12. Формат таблиці: | id | proxy | userna-me | addr | date | in_bytes, out_bytes де id – унікальний номер запису (primary key), proxy – номер проксі-сервера (Клієнта), username – ім’я користувача (до 15 символів), addr – фактичний IP-адреса або ім’я машини, date – дата в форматі YYYY-MM-DD (примітка: дані в таблиці зберігаються з дискретизацією в один день, тобто якщо користувач працював 30 днів у місяці, то в таблиці йому буде відповідати 30 записів за місяць), in_bytes і out_bytes, відповідно, вхідний і вихідний трафік в байтах. Статистика ведеться безперервним циклом в році. На початку кожної таблиці першим записом id = 1 завжди зберігається ідентифікаційна запис виду | 1 | 0 | NULL | NULL | 2001-02-12 | 0 | 0 |. Даний запис свідчить, що в таблиці mons02 ведеться статистика за 2001 рік. У разі невідповідності дати року поточним або за відсутності цього рядка всі дані з таблиці поточного місяця переміщуються в таблицю tmp. При цьому в лог записується наступне попередження : 
Feb 11 21:50:40 darkstar ./billing[6053]: warning replase table mons02 to tmp !!!
Таблиця tmp. Має ту ж структуру, що і mons-таблиці. У таблицю tmp відбувається перенесення застарілих даних або перенесення даних з причини збою (наприклад локальної дати). Видалення або перенос записів з таблиці tmp буде здійснюватися інтерфейсом до бази даних (який ще не написаний).

Висновок

Даний проект розвивається досить повільно. У ньому на даний момент бере участь тільки автор, проект пишеться у вільний від роботи час. Сподіваюся, система sbilling буде розвиватися і надалі. Якщо ви хочете взяти участь у проекті, або написати клієнта (або патч до сервера), то пишіть на alex@lrn.ru, постараюся дати інформацію та консультації!

Короткий принцип роботи системи.

Сервер sbilling тримає завжди відкритим порт 800. Клієнт додатково тримає завжди (або на час втрати зв’язку) зі свого боку білінговий порт. В якості транспортного протоколу використовується TCP / IP.
Клієнт може посилати пакет give_mee_all на порт 800 sbilling сервера (інші види пакетів будуть відкинуті). Для встановлення зв’язку sbilling сам з’єднується з клієнтом, після чого починається нормальний режим роботи і обмін пакетами). Весь інформаційний обмін відбувається тільки при наявності встановленої зв’язку між sbilling сервером і клієнтом.

Опис пакетів

reset. Даний пакет клієнт отримує від sbilling-сервера. При отриманні даного пакета клієнт повинен “прибити” всіх своїх чаілдов, переключиться в нормальним режим роботи (якщо був включений stop режим).
i_live. Даний пакет клієнт відправляє sbilling-серверу кожні 150 секунд (при втрати зв’язку з сервером не відправляється).
all_OK. Даний пакет клієнт отримує від sbilling-сервера кожні 150 секунд. Якщо протягом 150 секунд після відправки пакета i_live від sbilling немає відповіді пакетом all_OK, зв’язок з sbilling-сервером вважається втраченою.
stop. Даний пакет клієнт отримує від sbilling-сервера. При його отриманні клієнт повинен “прибити” всіх своїх чайлд і відіслати всю інформацію на sbilling-сервер.
send_bytes. Відправляється sbilling-серверу кожні 150 секунд або або в міру завершення роботи чайлд (час відправлення пакетів асинхронно, тобто кожен чайлд сам відраховує час від моменту свого народження).
give_mee_all. Даний пакет відправляється при ініціалізації клієнта або кожні 150 секунд при втрати зв’язку з сервером.

Формати пакетів

Вид пакетів буде представлений в такій формі:
reset ‘\0’|15|”reset”|’\0’ 11
де reset – назва пакету, ‘\ 0’ | 15 | “reset” | ‘\ 0’ – форма подання пакета, | – це табулятор ‘\ t’ або 09, 11-довжина пакета в байтах, тобто пакет reset в коді C виглядає так
char reset[]={‘\0’, ‘\t’, 15, ‘\t’, ‘r’, ‘e’, ‘s’, ‘e’, ‘t’, ‘\t’, ‘\0’};
write (socket, reset, 11); – відправка пакету

Отже, пакети:
i_live ‘\0’|13|”i_live__”|’\0’ 14 
geve_mee_all ‘\0’|14|”1081mee_”|’\0’ 14
Примітка: в тілі пакету першими цифрами повинен бути позначений порт до якого буде проводити підключення sbilling, якщо даний порт для даного клієнта не збігається з базою sql, sbilling не виробляє спроби підключення.

reset ‘\0’|15|”reset”|’\0’ 11 

all_OK ‘\0’|16|”allOK”|’\0’ 11

stop ‘\0’|19|”stop0″|’\0’ 11

send_bytes ‘\0’|17|”1234″|”1234″|”1234″|
“123456789012345”|’\0′ 36 

Примітка по формату пакета:
‘\0’|17|in|out|addr|user|’/0’
in – число прийнятих (з боку робочої станції) байт у формі int 4-е байта (32 біта);
out – число відправлених (з боку робочої станції) байт у формі int 4-e байта (32 біта);
addr – адреса в форматі uint32_t 4-е байта (32 біта);
user – рядок ім’я користувача, довжина 15 символів, на кінці ‘\ 0’ необов’язковий

режими роботи клієнта

режим запуску

При запуску клієнт не приймає з’єднання (тобто не виконує своїх функцій проксі-сервера). Після ініціалізації клієнта (прочитання конфігураційних файлів відкриття портів) клієнт посилає пакет give_mee_all, після чого очікує коннекта від sbilling-сервера. Якщо sbilling сервер не приєднався, то кожні 150 секунд клієнт буде намагатися надіслати пакет give_mee_all (при цьому клієнт по колишньому не виконує своїх функцій). Якщо при ініціалізації клієнта sbilling знаходиться в аварійному стані (stop) режим, то після підключення sbilling сервера до клієнта клієнт отримує пакет stop. При підключенні sbilling сервера клієнт переходить в нормальний режим роботи і отримує пакет reset.

режим завершення роботи

Зазвичай в режим завершення програма переводиться сигналом SIGTERM. При отриманні сигналу SIGTERM клієнт зобов’язаний правильно завершити роботу своїх Чайлд, зібравши статистику про передані байтах кожного Чайлда . Надіслати всю статистику на sbilling сервер. Закрити sbilling порт і завершити свою роботу.

нормальний режим роботи

У нормальному режимі роботи клієнт виконує свої основні завдання (наприклад proxy сервер дає доступ в інтернет). Крім цього кожні 150 секунд відправляється пакет i_live sbilling серверу. Також кожні 150 секунд передається пакет send_bytes (зазвичай серія пакетів і асинхронно, тобто кожен чайлд вважає час за себе, не синхронізуючи його ні з ким).

режим втрати зв’язку з sbilling-сервером

Якщо протягом 150 секунд після відправлення пакета i_live не було отримано пакета all_OK, то зв’язок з sbilling-сервером вважається втраченою.
При цьому в перші 150 секунд закривається сокет і відправляється пакет give_mee_all, якщо в наступні 150 секунд зв’язок з sbilling-сервером не відновиться, клієнт зобов’язаний правильно завершити роботу своїх Чайлд, зібравши статистику про передані байтах кожного Чайлда і зберігати статистику в своєму кеші до відновлення зв’язку або отримання сигналу SIGTERM (при отриманні сигналу SIGTERM дані губляться).
При підключенні sbilling-сервера клієнт переводиться в нормальний режим роботи. Даний режим буде продовжувати вдосконалюватися.

примусовий stop режим

При отриманні пакета stop клієнт повинен правильно завершити роботу своїх Чайлд, зібравши статистику про передані байтах кожного Чайлд. Надіслати всю статистику на sbilling сервер, перестати давати доступ до інтернету. При цьому зв’язок з sbilling-сервером не розривається, прийом і відправлення пакетів i_live all_OK тривають. Вийти з цього режиму клієнт може отримавши пакет reset.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*