Биллинговая система Nodeny

Главная категория => Nodeny Plus => Тема начата: Efendy от 19 Апреля 2014, 19:09:09



Название: Сбор трафика через Radius
Отправлено: Efendy от 19 Апреля 2014, 19:09:09
Если вы используете pppoe, то у вас стоит Radius, который периодически принимает от mpd accounting пакеты, в которых передается трафик. Вот эти пакеты в настоящее время используются только как признак "клиент жив". Хотя можно их использовать для начисления трафика в учетку клиента. Плюс в том, что практически никаких накладных расходов. Т.е мы удаляем ipcad (ну, и, соответственно, правила divert в фаерволе) и получаем увеличение производительности сервера. Минус в том, что лога трафика (графиков) не будет.

Фича оттестирована elite, поэтому если всплывут какие-то нюансы - задавайте вопросы ему.

В /usr/local/etc/raddb/sql.conf

Код:
postauth_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}',%{Acct-Session-Id},0)"
меняем на
Код:
accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}','%{Acct-Session-Id}',\
(%{%{Acct-Input-Gigawords}:-0} * POWER(2, 32)) + %{%{Acct-Input-Octets}:-0})"}

Код:
CREATE TABLE IF NOT EXISTS `ses_traf` (
  `id` bigint(21) NOT NULL auto_increment,
  `ses_id` varchar(32) NOT NULL default '',
  `time` int(10) unsigned NOT NULL DEFAULT '0',
  `traf_in` bigint(12) unsigned NOT NULL DEFAULT '0',
  `traf_out` bigint(12) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ses_id` (`ses_id`),
  KEY `time` (`time`)
) ENGINE=MyISAM AUTO_INCREMENT=1;


DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16),
    IN properties VARCHAR(255), IN ses VARCHAR(32), IN trafin BIGINT(20))
BEGIN
  DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
  SELECT get_ip(usr_id) INTO usr_ip;
  CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':','')));
  UPDATE users_trf SET in1=in1 + trafin - IFNULL(
    (SELECT traf_in FROM ses_traf WHERE ses_id=ses LIMIT 1),0)
    WHERE uid=usr_id;
  INSERT INTO ses_traf SET ses_id=ses, traf_in=trafin, time=UNIX_TIMESTAMP()
    ON DUPLICATE KEY UPDATE traf_in=trafin, time=UNIX_TIMESTAMP();
END$$
DELIMITER ;


Название: Re: Сбор трафика через Radius
Отправлено: goletsa от 21 Апреля 2014, 13:20:57
Круто. Для 50 ветки можно использовать? :)


Название: Re: Сбор трафика через Radius
Отправлено: elite от 21 Апреля 2014, 15:42:38
можно :)


Название: Re: Сбор трафика через Radius
Отправлено: goletsa от 19 Мая 2014, 04:13:38
А для какой версии freeradius писалось?  У меня просто 2 ветка под linux.
Сам конфиг сведен к минимуму:
Код:
root@mxradius:/etc/freeradius/sql/mysql# cat tinco.conf
# -*- text -*-
##
## dialup.conf -- MySQL configuration for default schema (schema.sql)
##
##      $Id$

sql_user_name = "%{User-Name}"

authorize_check_query = "call radcheck('%{SQL-User-Name}')"
authorize_reply_query = "call mxvrfreply('%{SQL-User-Name}')"
accounting_update_query = "call radupdate('%{SQL-User-Name}')"
accounting_stop_query = "call radstop('%{SQL-User-Name}')"

Т.е. у меня нету postauth_query
Я могу просто заменить свой accounting_update_query ?


Название: Re: Сбор трафика через Radius
Отправлено: Sidius от 05 Августа 2014, 22:52:01
Учитывается трафик только в одну сторону?


Название: Re: Сбор трафика через Radius
Отправлено: goletsa от 31 Июля 2015, 11:44:46
можно :)
Не, не хватает каких-то процедур.
Но пока глубоко не ковырялся.
Надо будет посмотреть что они в N+ возвращают.


Название: Re: Сбор трафика через Radius
Отправлено: Warlock от 03 Августа 2015, 08:42:14
а в этом случае лог трафика никак нельзя сделать?


Название: Re: Сбор трафика через Radius
Отправлено: goletsa от 03 Августа 2015, 17:31:24
а в этом случае лог трафика никак нельзя сделать?
Теоретически можно, но все будет упираться в частоту акаунтинга, а на некоторых железных BRAS время между Interim-Update может быть 15-30 минут.


Название: Re: Сбор трафика через Radius
Отправлено: elite от 16 Мая 2017, 09:04:39
А чтобы сделать лог трафика, нужно заполнять x-таблицы?


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 16 Мая 2017, 10:25:50
жалко что на микротике аккаунтинг не покатит, если без коммутации юзать (((


Название: Re: Сбор трафика через Radius
Отправлено: elite от 16 Мая 2017, 11:37:32
а почему нет? разве хотспот не отдает аккаунтинг?


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 16 Мая 2017, 14:53:19
а почему нет? разве хотспот не отдает аккаунтинг?
хотспот отдает, с этим у него все хорошо, только на мой взгляд без него как-то лучше работается на одном ДХЦП и аксесс листе


Название: Re: Сбор трафика через Radius
Отправлено: elite от 16 Мая 2017, 21:41:18
меньше нагрузка на микротик?


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 16 Мая 2017, 23:03:56
правил в файрволе на порядок меньше - соответственно да.


Название: Re: Сбор трафика через Radius
Отправлено: elite от 17 Мая 2017, 14:10:27
Ладно, вопрос в другом: что нужно, чтобы сделать норм лог трафика и графики работали?
Заполнять х-таблицу? Или что-то ещё надо?


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 18 Мая 2017, 10:12:39
создавать и заполнять x-таблицу с округлением времени, иначе трафик будет на каждую секунду. Думаю, округлять лучше минут до 5, если на каждую минуту - все таки будет перекос из-за что 40 секунд могут попасть или в одну и другую минуту


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 08 Февраля 2018, 21:31:38
Переделал процедуру так, чтобы велся график трафика. Внимание! Необходимо в конфиге collectors.cfg закомментировать все коллекторы (list   => [],) и запустить модуль collectors - это нужно только для того, чтобы он создавал на каждый день X-таблицу типа X2018_2_8. Срезы кратны минуте (в процедуре число 60)

Код:
DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16),
    IN properties VARCHAR(255), IN ses VARCHAR(32), IN trafin BIGINT(20))
BEGIN
  DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE t_in BIGINT;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
  SELECT get_ip(usr_id) INTO usr_ip;
  CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':','')));
  SELECT trafin - IFNULL((SELECT traf_in FROM ses_traf WHERE ses_id=ses LIMIT 1),0) INTO t_in;
  UPDATE users_trf SET in1=in1 + t_in WHERE uid=usr_id;
  INSERT INTO ses_traf SET ses_id=ses, traf_in=trafin, time=UNIX_TIMESTAMP()
    ON DUPLICATE KEY UPDATE traf_in=trafin, time=UNIX_TIMESTAMP();
  SET @s = CONCAT('INSERT INTO X', YEAR(NOW()), '_', MONTH(NOW()), '_', DAY(NOW()), ' VALUES(?,?,?,?,?,?)');
  PREPARE stmt1 FROM @s;
  SET @iface = 0;
  SET @cls = 1;
  SET @ts = CEIL(UNIX_TIMESTAMP() / 60) * 60;
  SET @usr_id = usr_id;
  SET @t_in = t_in;
  SET @t_out = 0;
  EXECUTE stmt1 USING @usr_id, @iface, @ts, @cls, @t_in, @t_out;
  DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;


Название: Re: Сбор трафика через Radius
Отправлено: k291 от 10 Февраля 2018, 15:21:24
Будет работать в связке NoDeny+Radius+Mikrotik+DHCP ?


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 10 Февраля 2018, 18:57:49
Насчет DHCP большие сомнения. В связке Hotspot - работает однозначно.


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 10 Февраля 2018, 20:39:44
Даю общий ответ: если устройство посылает на радиус трафик - будет работать. Возможно придется поменять название атрибута для трафика (со стандартизацией у нас проблемы). И, естественно, необходимо не тупо копировать процедуру, а взять вашу и вставить в нее код, который сохраняет трафик


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 10 Февраля 2018, 22:20:56
Учитывается трафик только в одну сторону?
Начал разбираться и тоже удивился. А какой смысл в том чтобы только траф_ин учитывать?
Я конечно все понимаю, но не на живых же абонентах экспериментировать с этим делом?


Название: Re: Сбор трафика через Radius
Отправлено: Roman от 10 Февраля 2018, 22:44:58
Учитывается трафик только в одну сторону?
Начал разбираться и тоже удивился. А какой смысл в том чтобы только траф_ин учитывать?
Я конечно все понимаю, но не на живых же абонентах экспериментировать с этим делом?

Реально готов тоже упереться в аккаунтинг через радиус, завтра еще раз перечитаю посты, продумаю логику сквозь промежуточные таблици...
Я не силен в перле, но можно было бы в модули коллекторов добавить модуль Radius.
Модуль создает таблицу типа HEAP (в памяти) в которую через радиус аккаунтинг запросы добавляются записи.
Далее раз в таймут конфига происходит парсинг временной таблицы и заполнение X_date таблиц, с очисткой временной таблицы.

Я могу это все реализовать, временную таблицу заполнять из радиуса, не проблема.
Скриптом по крону раз в минуту парсить и складывать в X_date таблицы, но у меня о они игнорятся биллингом, мне нужен точный формат X_date таблиц.
Готов принять участие в создании и тестировании модуля.


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 11 Февраля 2018, 08:48:54
Зачем тебе парсить и укладывать данные в  X-таблицы, если я уже сделал проще и привел пример?

Насчет исходящего трафика. Его добавить элементарно, неужели сами не догадались? Я вас научил прыгать на правой ноге, думал вы догадаетесь как это делать на левой


Название: Re: Сбор трафика через Radius
Отправлено: elite от 12 Февраля 2018, 18:30:23
Можно ses_traf  в memory хранить


Название: Re: Сбор трафика через Radius
Отправлено: elite от 21 Мая 2018, 07:33:24
схема рабочая, но крайний срез трафика обновляется в режиме реального времени, не очень удобно


Название: Re: Сбор трафика через Radius
Отправлено: skreep от 16 Сентября 2018, 19:08:30
настроил у себя сбор трафика по Radius и получил вот такую ошибку

Sun Sep 16 00:00:00 2018 : Error: [sql] Couldn't update SQL accounting ALIVE record - Table 'nodeny.X2018_9_16' doesn't exist
Sun Sep 16 00:00:00 2018 : Error: rlm_sql_mysql: Cannot store result
Sun Sep 16 00:00:00 2018 : Error: rlm_sql_mysql: MySQL error 'Table 'nodeny.X2018_9_16' doesn't exist'
.
.
.
Sun Sep 16 00:00:49 2018 : Error: [sql] Couldn't update SQL accounting ALIVE record - Table 'nodeny.X2018_9_16' doesn't exist
Sun Sep 16 00:00:49 2018 : Error: rlm_sql_mysql: Cannot store result
Sun Sep 16 00:00:49 2018 : Error: rlm_sql_mysql: MySQL error 'Table 'nodeny.X2018_9_16' doesn't exist'
Так понимаю что не успевает создатся таблица, как исправить, потому что из-за ошибки у клиенттов пропадает авторизация и блокируется доступ
такая ошибка повторяется каждую ночь

У меня база реплицируется
из-за чего имеется еще одна ошибка
Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE  on a table with more than one UNIQUE KEY is uns
afe Statement: call radupdate('14:cc:20:73:75:99','10.100.2.108',               'vlan=bond0.126;int=ipoe305', '58e72eb2e3d70de0',               (0 * POWER(2, 32)) + 15809915,          (0 * POWER(2, 32)) + 61
05836)

Подскажите как исправить запрос что б без ошибок все работало
mysql 5.5.6


Название: Re: Сбор трафика через Radius
Отправлено: skreep от 18 Сентября 2018, 10:31:51
настроил у себя сбор трафика по Radius и получил вот такую ошибку

Sun Sep 16 00:00:00 2018 : Error: [sql] Couldn't update SQL accounting ALIVE record - Table 'nodeny.X2018_9_16' doesn't exist
Sun Sep 16 00:00:00 2018 : Error: rlm_sql_mysql: Cannot store result
Sun Sep 16 00:00:00 2018 : Error: rlm_sql_mysql: MySQL error 'Table 'nodeny.X2018_9_16' doesn't exist'
.
.
.
Sun Sep 16 00:00:49 2018 : Error: [sql] Couldn't update SQL accounting ALIVE record - Table 'nodeny.X2018_9_16' doesn't exist
Sun Sep 16 00:00:49 2018 : Error: rlm_sql_mysql: Cannot store result
Sun Sep 16 00:00:49 2018 : Error: rlm_sql_mysql: MySQL error 'Table 'nodeny.X2018_9_16' doesn't exist'
Так понимаю что не успевает создатся таблица, как исправить, потому что из-за ошибки у клиенттов пропадает авторизация и блокируется доступ
такая ошибка повторяется каждую ночь

может таблицу создавать в продцедуре?

тут в таблице X2018_9_16 не хватает данных за первую минуту текущего дня, и лишние данные за первую минуту 17 числа
соответсвенно график трафика за сутки поломан.

У меня база реплицируется
из-за чего имеется еще одна ошибка
Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE  on a table with more than one UNIQUE KEY is uns
afe Statement: call radupdate('14:cc:20:73:75:99','10.100.2.108',               'vlan=bond0.126;int=ipoe305', '58e72eb2e3d70de0',               (0 * POWER(2, 32)) + 15809915,          (0 * POWER(2, 32)) + 61
05836)

Подскажите как исправить запрос что б без ошибок все работало
mysql 5.5.6
Тут все исправилось binlog_format=mixed


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 24 Марта 2019, 21:17:33
Є питання: зміна в /usr/local/etc/raddb/sql.conf
Код:
postauth_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
         'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}',%{Acct-Session-Id},0)"
в Радіус3 ця процедура відрізняється досить кардинально.


Название: Re: Сбор трафика через Radius
Отправлено: Pa4ka от 25 Марта 2019, 21:03:14
Є питання: зміна в /usr/local/etc/raddb/sql.conf
Код:
postauth_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
         'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}',%{Acct-Session-Id},0)"
в Радіус3 ця процедура відрізняється досить кардинально.
пошукайте по форуму було по freeradius3
А процедура яка? radupdate(це процедура бази данних)
А тут просто запит до бази з змінними і викликається call radupdate(***);


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 10 Апреля 2019, 19:17:39
Підкажіть хто небуть, вже весь мозг зірвало. В мене звязка Nodeny+, Mikrotik, Freeradius3 не працює збір трафіка і графіки, перевірив таблицю ses_traf а вона пуста. Раніше запускав радіус з виводом на екран, то радіус писав що uid немає значення по замовчуванню. Можливо щось треба включити в мікротіку, хоча акаунтінг включено, в конфігурації радіуса виклик вункції параметри правильні згідно документації на мікрот.


Название: Re: Сбор трафика через Radius
Отправлено: skreep от 10 Апреля 2019, 20:19:30
Підкажіть хто небуть, вже весь мозг зірвало. В мене звязка Nodeny+, Mikrotik, Freeradius3 не працює збір трафіка і графіки, перевірив таблицю ses_traf а вона пуста. Раніше запускав радіус з виводом на екран, то радіус писав що uid немає значення по замовчуванню. Можливо щось треба включити в мікротіку, хоча акаунтінг включено, в конфігурації радіуса виклик вункції параметри правильні згідно документації на мікрот.

як, пам'ять мене не підводить Мікротік не шле акаунтінг коли ІРОЕ


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 11 Апреля 2019, 11:37:35
Всегда для решения проблем вида "нихрена не работает", связанных с радиусом, запускаем радиус в debug режиме и смотрим на экран: есть ли вообще аккаунтинг? запускаются ли процедуры mysql?  с какими параметрами? возвраащается ли ошибка?


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 13 Апреля 2019, 19:14:58
Тут ще проблема вилізла перестав запускатись радіус з опцією -Х, замість виводу на консоль він просто стартує як демон.


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 14 Апреля 2019, 13:21:04
Тут ще проблема вилізла перестав запускатись радіус з опцією -Х, замість виводу на консоль він просто стартує як демон.
1) переустановить биллинг
2) переустановить виндовз
3) почистить диск
что ты хотел услышать? как радиус починить?


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 14 Апреля 2019, 14:45:04
Я думав може переустановити сам радіус? В мене є безпосередній доступ до сервера (поки не в роботі). Білінг не повинен впливати на роботу радіуса чи я помиляюся?


Название: Re: Сбор трафика через Radius
Отправлено: elite от 14 Апреля 2019, 19:23:55
можно попробовать отформатировать жесткий и переустановить все с нуля


Название: Re: Сбор трафика через Radius
Отправлено: Cell от 14 Апреля 2019, 23:00:29
2) переустановить виндовз
ААААА
биллинг на виндавс?
ааааааа!!!!!


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 23 Апреля 2019, 08:01:52
Всім доброго дня. Радіус поборов повною перестановкою Фряхи. Підкажіть хтось де можна почитати про синтаксис запросів мускула, які прописані /usr/local/etc/raddb/mods-enabled/sql, цікавить акаунтінг. Хочу зробити підрахунок вихідного трафіку, а тупо добавити ще один параметер не вийшло, радіус пише, що неправильний синтаксис і вказує останній запис з реальними данними які передав мікротік.


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 24 Апреля 2019, 10:45:40
Я тебе в личку написал, что запрос твой неверен - лишняя скобка


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 24 Апреля 2019, 12:00:39
Всім дуже дякую. Все працює.


Название: Re: Сбор трафика через Radius
Отправлено: SlavikUA от 22 Ноября 2020, 15:54:56
Народ глянув лог файл радіуса а там:
ERROR: rlm_sql_mysql : ERROR 1048 (Column 'uid' cannot be null):23000
помилка пишеться з частотою до 30 секунд, таке враження що це період акаунтінгу

Перевірив процедури мускула вроді все добре, все працює клієнти отримують інтернет, трафік отримую (деколи пише про помилки при виводі на графік)
База зараз вся не задіяна працює тільки частина клієнтів решта на іншому обладнанні ще не переведені можливо це причина?


Название: Re: Сбор трафика через Radius
Отправлено: Efendy от 23 Ноября 2020, 00:56:53
ну, с такими неиформативными данными только пальцем в небо поможет. Или запускай радиус с ключем -x и смотри в консоль какой именно запрос выдает ошибку или пробуй в консоли mysql как бы самому семулировать процесс авторизации и эккаунтинга, но последнее трудно, нужно понимать процедуры mysql