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

Главная категория => Модули NodenyPlus => Тема начата: warzoni от 23 Февраля 2018, 13:39:10



Название: CoA проверка работы
Отправлено: warzoni от 23 Февраля 2018, 13:39:10
Здравствуйте установил запустил, есть вопросы по модулю.

1) Я так понимаю в радиусе надо активировать coa ? что бы он слушал порт который в конфиге ?

2) как мне увидеть работу модуля, что он делает и какие ошибки сыпятся. запускаю perl noserver.pl -vv -g=coa.cfg.pm

и тишина не видно что бы он что-то отправлял. или пытался.

Помогите пожалуйста.

 


Название: Re: CoA проверка работы
Отправлено: elite от 23 Февраля 2018, 14:04:54
конфиг правильный?


Название: Re: CoA проверка работы
Отправлено: warzoni от 23 Февраля 2018, 14:12:47
Ну я оставил конфиг по дефолту хоть посмотреть шлет не шлет.

Изменил только тут

$radclient = '/usr/local/bin/radclient -x';
$host = '127.0.0.1:3799';
$secret = 'hardpass5'; - установил хардпасс ( включил COA в фрирадиусе 2 )

/usr/local/bin/radclient - тут путь рабочий.

Я просто даже не вижу что бы он пытался выполнить команды к радиусу. логов не чего нет, тишина как в танке.





Название: Re: CoA проверка работы
Отправлено: warzoni от 23 Февраля 2018, 15:03:23
Все разобрался всем спасибо. Зарботал


Название: Re: CoA проверка работы
Отправлено: elite от 24 Февраля 2018, 18:21:10
ну и нам расскажи, что было


Название: Re: CoA проверка работы
Отправлено: warzoni от 25 Февраля 2018, 14:13:37
Там в скрипте perl debug не пахал - пока на форуме посмотрел запуск с отладкой скрипта, потом пакет дебиана установил, потом все запустилось.

Есть одна неприятность COA - и не знаю как её решить, если клиент подключается - параметры ставят шейпера все ок, но если он отключится и сразу подключится то шейпер отключается и клиент качает сколько угодно, COA  не проверяет стоит шейпер не стоит, отослал запрос и ждет покуда абонент не отсоединится, и ключик не погаснет.



Название: Re: CoA проверка работы
Отправлено: warzoni от 25 Февраля 2018, 15:47:04
Заметил еще не приятную вещь.

COA Отправляет дисконект - когда абонент авторизован и баланс в норме, при этом отправка дисконекта закономерна по времени, Сначала шейпер отправляет - потом через время дисконект, и так постоянно.


При посылке диссконекта лог пишит такую штуку.

25.02.2018 17:13:56 Освобожден ip=192.168.3.6 uid=1 start=1519567883 last=1519567883

- Я не пойму статистический пул зачем его освобождать.


Название: Re: CoA проверка работы
Отправлено: Efendy от 25 Февраля 2018, 17:47:53
Ты уверен, что биллинг считает клиента авторизованным? Напомню концепцию NoDeny по данному вопросу. Клиент считается авторизованным некоторое время после его активности. Обычно этой активностью является подключение и аккаунтинг. Если нет определенного времени аккаунтина - клиент считается неавторизованным. Это легко увидеть в админке - пропадает ключик рядом с учетной записью.

Почему не считать клиента авторизованным с момента подключения до момента когда он отключится? Очень просто. Нет стопроцентной гарантии получения сигнала отключения. Например, в случае дхцп клиент вырубит комп и мы будем считать, что он авторизован вечно, если он не пошлет пакет освобождения адреса. Или в случае пппое если будет разрыв связи пппое-сервера с биллингом, то биллинг не получит сигнал отключения и будет считать, что отключенный абонент все еще авторизован.

В случае пппое у нас есть классная штука - аккаунтинг - пппое сервер время от времени присылает инфо по трафику, а биллинг как раз считает это признаком активности клиента (не трафик, а сам пакет аккаунтинга). В случае dhcp  не все сервера поддерживают аккаунтинг. Поэтому есть модуль эмуляции аккаунтинга - модуль dhcp в папке kernel.


Название: Re: CoA проверка работы
Отправлено: warzoni от 25 Февраля 2018, 17:54:55
Ну хорошо, допустим.

nas - видит биллинг так как авторизация проходит по радиусу и получаем данные ip nas и прочею лабудень.

Что дальше он делает ? радиус передал параметры на nas , и как он потом проверяет ? - я запускал в радиусе дебаг и вот когда COA шлет дисконет в радиусе тишина, он даже не пытается что то делать.

как мне проверить активность в  билинг. Надо найти затык.

Цитировать
В случае пппое у нас есть классная штука - аккаунтинг - пппое сервер время от времени присылает инфо по трафику, а биллинг как раз считает это признаком активности клиента

Возможно в этом проблема, щас проверю.



Название: Re: CoA проверка работы
Отправлено: warzoni от 25 Февраля 2018, 18:16:55
Вроде разобрался, переменная acct-interim-interval - вроде  пошло.

Но выше вопрос остается открытым, я беру  отключаюсь, потом подключаюсь, и шейпер не выставляется заново. COA не видит изменений... Так как я понимаю, он думает что я авторизован и не надо не чего делать.


Название: Re: CoA проверка работы
Отправлено: elite от 25 Февраля 2018, 21:00:30
нужно использовать accounting stop


Название: Re: CoA проверка работы
Отправлено: Efendy от 25 Февраля 2018, 21:08:01
 coa не знает о том в каком состоянии клиент был до данного момента. Да и не нужно ему. Любая вещь, которая хранит состояние, требует синхронизации иначе при малейшем рассинхроне все посыпется. Если нужно что-то выключить и не знаешь что именно: выключай все и игнорь ошибки. Если тебе надо что-то включить и ты не знаешь включено оно или нет - выключи с игнором ошибки и включи. Иначе, повторюсь, нужна синхронизация - делать запросы на оборудование и смотреть его состояние


Название: Re: CoA проверка работы
Отправлено: elite от 25 Февраля 2018, 21:56:55
Если использовать процедуру accounting stop, то при отключении абонента сессия будет сразу завершаться на биллинге, не надо ждать таймаута
Как вариант еще записывать в параметры авторизации ид сессии от браса, если меняется ид, модуль СоА будет заново высылать радиус-атрибуты


Название: Re: CoA проверка работы
Отправлено: warzoni от 25 Февраля 2018, 23:46:24
Да я понял , что COA на этом этапе закончил свою работу, и в итоге контроль мы не получим. а без него все печально выгладит особенно когда речь идет не об 1к пациэнтов.

Давайте тогда вернемся к баранам. И помогите соорудить проверку. Поверте очень сложно разберется думаю, что это должно было работать )))

Цитировать
параметры авторизации ид сессии от браса, если меняется ид, модуль СоА будет заново высылать радиус-атрибуты

Отличная идея и как мы сможем сказать биллингу что бы он запускал COA при смене ID (я так понимаю речь о Acct-Session-Id ?) - это было бы великолепно ! повторно отправлять скорость клиента если изменилась сессия его в ответе от NAS/,  при этом биллинг не разрывал связь !


Название: Re: CoA проверка работы
Отправлено: Efendy от 26 Февраля 2018, 00:19:01
Еще раз. Нельзя с закрытыми глазами играть в шахматы, если есть вероятность, что кто-то проходя мимо уберет одну из фигур. Позиция поменяется кординально. Этим мой биллинг и отличается от других, в которых ловят непонятные глюки "ну их мало ну и хуй с ними". Если мы хотим получить прочное решение - мы должны либо постоянно синхронизироваться, например, как это делает модуль микротика - он постоянно опрашивает микротик и вносит коррективы. Либо делать действие в режиме "мне ничего не известно, я просто удалю возможные комбинации и установлю то, что мне надо".

Что касается "изменилась сессия" - здесь происходит переподключение, следовательно именно в этот момент нам вообще СОА не нужен, можно атрибуты скорости отдать модулем "радиус-атрибуты" прямо в ответе radreply


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 00:32:43
Еще раз. Нельзя с закрытыми глазами играть в шахматы, если есть вероятность, что кто-то проходя мимо уберет одну из фигур. Позиция поменяется кординально. Этим мой биллинг и отличается от других, в которых ловят непонятные глюки "ну их мало ну и хуй с ними". Если мы хотим получить прочное решение - мы должны либо постоянно синхронизироваться, например, как это делает модуль микротика - он постоянно опрашивает микротик и вносит коррективы. Либо делать действие в режиме "мне ничего не известно, я просто удалю возможные комбинации и установлю то, что мне надо".

Что касается "изменилась сессия" - здесь происходит переподключение, следовательно именно в этот момент нам вообще СОА не нужен, можно атрибуты скорости отдать модулем "радиус-атрибуты" прямо в ответе radreply

Мы говорим о модуле, который не выполняет обычную функцию, когда клиент авторизирован выдавать скорость, авторизация идет по pptp - я отключился ( потом включился ) будь добр выдай скорость, он не пашет ( точнее пашет но 1 раз ) а что бы заработал будь добр выключил vpn на 150 секунд ( по модулю авторизации ) - тогда я тебе выдам скорость.... меня это  вело в заблуждения. Получается он не востребован...в данной конструкции с NAS ( Хотя он COA модуль на ходу меняет скорость, в итоге на ходу он только .... не знаю что делает.)

И вот надо найти конструктивное решения. 


Название: Re: CoA проверка работы
Отправлено: Efendy от 26 Февраля 2018, 01:16:09
1) Модуль радиус атрибутов
либо:
2) Ключ -a  при запуске noserver для coa, при этом нужно настроить процедуры так, чтобы сессия писалась в properties таблицы auth_now - делается элементарно. При изменении параметров в properties происходит передергивание coa


Название: Re: CoA проверка работы
Отправлено: fet4 от 26 Февраля 2018, 10:16:12
Цитировать
чтобы сессия писалась в properties таблицы auth_now - делается элементарно. При изменении параметров в properties происходит передергивание coa
А как там происходит проверка на изменение параметров? По каждой переменной ? Или изменение всей строки?

Стас, ты не вспомнил почему убрал radstop?


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 10:17:06
1) Модуль радиус атрибутов
либо:
2) Ключ -a  при запуске noserver для coa, при этом нужно настроить процедуры так, чтобы сессия писалась в properties таблицы auth_now - делается элементарно. При изменении параметров в properties происходит передергивание coa

1) Это всегда успеем есть кабинет. Спасибо большое.  :)

Тут тоже вопрос на засыпку.  ну получил я новую сессию через радиус атрибутив, а кто сравнивать будет её с старой сессией. И снова приехали... ?

2) - Если это элементарно то дайте наброски - я бы оттестировал работу.

С ключем "-a" запускаю это я видил в  noserver - Но вот процедуру хранения и сравнивания в базе это я не осилю.


Я так понимаю  формирования, происходит тут.

Код:
my $sql_get_auth_usr = <<SQL;
    SELECT u.id, u.balance, u.name, u.state, a.auth_start, a.ip, a.properties
        FROM (
        SELECT INET_NTOA(i.ip) AS ip, '' as properties, UNIX_TIMESTAMP() AS auth_start
            FROM users u JOIN ip_pool i ON i.uid=u.id WHERE u.lstate=1
                UNION ALL
        SELECT ip, properties, start AS auth_start FROM auth_now
    ) a
        JOIN ip_pool i ON INET_ATON(a.ip)=i.ip
        JOIN users u ON i.uid=u.id
    WHERE TRUE
SQL

Но еще надо помимо отладки кода, передать параметры от радиуса сессии что бы писались в properties.

Тут мы имеем  в sql.conf

Код:
        authorize_check_query = "call radcheck('%{User-Name}')"
        authorize_reply_query = "call radreply('%{User-Name}')"
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"

Код:
mysql> SELECT * FROM auth_now;
+-----+-------------+------------+------------+----------------------------------------+
| id  | ip          | start      | last       | properties                             |
+-----+-------------+------------+------------+----------------------------------------+
| 417 | 192.168.3.5 | 1519632363 | 1519632408 | mod=pppoe;user=10.1.6.252;nas=10.0.0.8 |
+-----+-------------+------------+------------+----------------------------------------+
1 row in set (0.00 sec)

Есть параметр start - last -  надо так-же сделать сесиии.... если одинакова не трогать если изменилась трогать этого юзера.


Название: Re: CoA проверка работы
Отправлено: Warlock от 26 Февраля 2018, 10:56:07
1) Модуль радиус атрибутов
либо:
2) Ключ -a  при запуске noserver для coa, при этом нужно настроить процедуры так, чтобы сессия писалась в properties таблицы auth_now - делается элементарно. При изменении параметров в properties происходит передергивание coa

1) Это всегда успеем есть кабинет. Спасибо большое.  :)

Тут тоже вопрос на засыпку.  ну получил я новую сессию через радиус атрибутив, а кто сравнивать будет её с старой сессией. И снова приехали... ?

2) - Если это элементарно то дайте наброски - я бы оттестировал работу.

С ключем "-a" запускаю это я видил в  noserver - Но вот процедуру хранения и сравнивания в базе это я не осилю.


Я так понимаю  формирования, происходит тут.

Код:
my $sql_get_auth_usr = <<SQL;
    SELECT u.id, u.balance, u.name, u.state, a.auth_start, a.ip, a.properties
        FROM (
        SELECT INET_NTOA(i.ip) AS ip, '' as properties, UNIX_TIMESTAMP() AS auth_start
            FROM users u JOIN ip_pool i ON i.uid=u.id WHERE u.lstate=1
                UNION ALL
        SELECT ip, properties, start AS auth_start FROM auth_now
    ) a
        JOIN ip_pool i ON INET_ATON(a.ip)=i.ip
        JOIN users u ON i.uid=u.id
    WHERE TRUE
SQL

Но еще надо помимо отладки кода, передать параметры от радиуса сессии что бы писались в properties.

Тут мы имеем  в sql.conf

Код:
        authorize_check_query = "call radcheck('%{User-Name}')"
        authorize_reply_query = "call radreply('%{User-Name}')"
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"

Код:
mysql> SELECT * FROM auth_now;
+-----+-------------+------------+------------+----------------------------------------+
| id  | ip          | start      | last       | properties                             |
+-----+-------------+------------+------------+----------------------------------------+
| 417 | 192.168.3.5 | 1519632363 | 1519632408 | mod=pppoe;user=10.1.6.252;nas=10.0.0.8 |
+-----+-------------+------------+------------+----------------------------------------+
1 row in set (0.00 sec)

Есть параметр start - last -  надо так-же сделать сесиии.... если одинакова не трогать если изменилась трогать этого юзера.

в радиусе в sql.conf в postauth_query и accounting_update_query добавляешь ses=%{Acct-Session-Id}


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 11:24:42
Код:
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}','user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')"


Имеем такое в добовлении в радиус.


в базе получаем сесии.

Код:
mysql> SELECT * FROM auth_now;
+-----+-------------+------------+------------+-------------------------------------------------------------+
| id  | ip          | start      | last       | properties                                                  |
+-----+-------------+------------+------------+-------------------------------------------------------------+
| 468 | 192.168.3.5 | 1519635668 | 1519636968 | mod=pppoe;user=10.1.6.252;nas=10.0.0.8;ses=1e51614f183fc2ec |
| 477 | 192.168.3.3 | 1519636014 | 1519636981 | mod=pppoe;user=10.0.0.10;nas=10.0.0.8;ses=1e51614f183fc2eb  |
+-----+-------------+------------+------------+-------------------------------------------------------------+

Срабатывает COA при разных манипуляциях и скорость передается на лету. все хорошо.

p.s Warlock спасибо, и в правду элементарно.


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 13:13:29
продолжаю по COA ( нужен совет )

Если пациент заблокирован - $coa_connect__state_off  - какие есть варианты в заблокированном виде, выдать айпи с другово пулла(статика динамика пофиг) который в админке, или   может как-то тегом привязаться. это одно условия в этом состоянии другова делать ему не чего не надо.


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 17:45:17
продолжаю по COA ( нужен совет )

Если пациент заблокирован - $coa_connect__state_off  - какие есть варианты в заблокированном виде, выдать айпи с другово пулла(статика динамика пофиг) который в админке, или   может как-то тегом привязаться. это одно условия в этом состоянии другова делать ему не чего не надо.

Что решений нету ?  на простой ноте закончим работу ?:)


Название: Re: CoA проверка работы
Отправлено: Efendy от 26 Февраля 2018, 20:33:52
Какое решение? Захотеть за тебя принять какой-либо из вариантов?


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 21:19:39
Когда клиент заблокирован отправлял запрос, из пула адресов. Например по тегам. Создал я пул например 172.1.1.1/24 ( динамичиский с тегом block )  и когда клиент блокируется, его отсоединяет COA дисконектом, и уже при следующем подключении, у него статус заблокированный , Я так понимаю тут должен срабатывать $coa_connect__state_off  - и вот мне бы  отправлять один из адресов из динамичиского пула, например который с тегом.

А когда  проведется оплата, сработает $coa_connect__state_on - и coa отошлет данные из формы клиента, фиксированный айпи.

Efendy

1) выше сесии нужны для поддержки контроля, это отсеяло многие проблемы - это целесообразно даже тем кто будет внедрять COA

2) я добиваюсь, что бы не городить огород с фаерволом, я просто хочу выдавать айпишники из динамического пула в билленге,  буду выдавать страницу заглушки, вот и все, что я пытаюсь сделать. и заминка только что бы взять состояние пользователя блокированного ( и динамический пул ) и один из айпи выдать ему на время блокировки. Это очень целесообразно что бы nas работал легко и без принуждения.

3) я думаю тут завязана проблемма с радиус с отдачей айпи от NAS, ну и хер сним пусть отваливается по таймауту, будут понимать, что нету инета и заглушка будет это показывать, пока идет время тамайута.

В итоге получаю не вмешивания в систему билинга и в принципе рабочий COA ))) для обычных целей.


Название: Re: CoA проверка работы
Отправлено: Efendy от 26 Февраля 2018, 22:30:39
Ты пишешь слишком сумбурно, я не все понимаю. Ты хочешь чтобы в СОА в атрибутах передавался ip, который нужно установить абону? Нет. Лучше по СОА  его только дисконнектить, затем уже при подключении выдавать ip из гостевого пула, если он заблокирован или по обычной схеме, если включен


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 22:33:24
 Лучше по СОА  его только дисконнектить, затем уже при подключении выдавать ip из гостевого пула, если он заблокирован.
Вот это хочу... именно, да мысли дело такое..)

А когда баланс пополнен, выдавать айпи из назначенного абоненту.

но без dhcp ( он не нужен )


Название: Re: CoA проверка работы
Отправлено: Efendy от 26 Февраля 2018, 22:55:45
выдавать ip по какому протоколу? Если без dhcp, значит по pppoe? Или по какой технологии?


Название: Re: CoA проверка работы
Отправлено: warzoni от 26 Февраля 2018, 22:57:12
выдавать ip по какому протоколу? Если без dhcp, значит по pppoe? Или по какой технологии?

Да pppoe


Название: Re: CoA проверка работы
Отправлено: warzoni от 27 Февраля 2018, 08:54:15
Код:
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
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;

  SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';
  SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';
  SELECT NULL,login,'Framed-Protocol','PPP','=';
END$$
DELIMITER ;

Я так понимаю в этой процедуре,  надо отдавать при статусе заблокирован динамический айпи, из пула, с тегом например block.

И тогда мы получаем всех блокированных на динамический пул, а не блокированных как обычно, при этом тег который будет на пуле для блокированных исключит пересечения между пулами.


Название: Re: CoA проверка работы
Отправлено: Efendy от 27 Февраля 2018, 09:57:39
Да


Название: Re: CoA проверка работы
Отправлено: warzoni от 27 Февраля 2018, 11:07:30
Может дадите процедуру,  попробую, по тестирую.


Название: Re: CoA проверка работы
Отправлено: Efendy от 27 Февраля 2018, 15:33:47
Код:
DROP FUNCTION IF EXISTS `get_ip`;
DELIMITER $$
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15) DEFAULT 0;
    DECLARE row_cnt INTEGER;
    DECLARE ip_id INTEGER;
    DECLARE tries INTEGER DEFAULT 30;
    DECLARE id_min INTEGER;
    DECLARE id_max INTEGER;
    DECLARE blocked INTEGER DEFAULT 0;

    SELECT 1 INTO blocked FROM users WHERE state='off' AND id=user_id LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static' AND blocked = 0 LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%';

    SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
            AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
        LIMIT 1;

    IF( ip_id IS NOT NULL) THEN
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
            WHERE id = ip_id AND uid = user_id;
        SELECT ROW_COUNT() INTO row_cnt;
        IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
    END IF;

    SELECT MAX(id), MIN(id) INTO id_max, id_min
        FROM ip_pool
        WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0);

    sel_ip: WHILE tries > 0 DO
        SELECT id, INET_NTOA(ip) INTO ip_id, user_ip
            FROM ip_pool
            WHERE uid = 0
                AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min)
                AND id <= id_max
                AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
                LIMIT 1;
        IF( user_ip IS NOT NULL) THEN
            UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600
                WHERE id = ip_id AND uid = 0;
            SELECT ROW_COUNT() INTO row_cnt;
            IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
            SET tries = tries - 5;
        END IF;
        SET tries = tries - 1;
    END WHILE;

END$$
DELIMITER ;


Название: Re: CoA проверка работы
Отправлено: warzoni от 27 Февраля 2018, 16:56:34
На первый взгляд все завелось и работает. и даже так как надо работает.

Буду пока тестировать.  отпишусь по результатам.


Название: Re: CoA проверка работы
Отправлено: tom от 27 Февраля 2018, 19:42:24
Можна в тему питання.
Тестово просто дропаю сесію
$coa_connect__state_off = {
    type     => 'disconnect',
    template => 'Framed-IP-Address={{ip}}',
};
але модуль чому відправляє ір здвоєним. Де я міг накосячити?
  sending:  = 'Framed-IP-Address=10.1.1.35,10.1.1.35'
  to:       = '/usr/local/bin/radclient -x 10.254.254.208:3799 disconnect nas11'


Походу саме змінна ip - такий параметр отримує..


Название: Re: CoA проверка работы
Отправлено: warzoni от 27 Февраля 2018, 20:17:45
у тебя переменная {{ip}} выдает значения два ip,ip - так быть не должно.


Название: Re: CoA проверка работы
Отправлено: tom от 27 Февраля 2018, 20:27:57
я це розумію.. але чому.. не розумію


Название: Re: CoA проверка работы
Отправлено: warzoni от 27 Февраля 2018, 22:20:41
Ну вот и смотрите - что от радиуса прилетает, может где-то допустили ошибку в конфигах радиуса,еще раз мануал прочтите.

Радиус смотрите в дебаг режиме.


Название: Re: CoA проверка работы
Отправлено: tom от 27 Февраля 2018, 23:25:15
Ну все норм прилітає, ір видає як треба, з пула. Все гуд.


Название: Re: CoA проверка работы
Отправлено: tom от 27 Февраля 2018, 23:44:24
Ось і причина
mysql> SELECT u.id, u.balance, u.name, u.state, a.auth_start, a.ip, a.properties FROM ( SELECT INET_NTOA(i.ip) AS ip, '' as properties, UNIX_TIMESTAMP() AS auth_start FROM users u JOIN ip_pool i ON i.uid=u.id WHERE u.lstate=1 UNION ALL SELECT ip, properties, start AS auth_start FROM auth_now ) a JOIN ip_pool i ON INET_ATON(a.ip)=i.ip JOIN users u ON i.uid=u.id WHERE TRUE  AND (i.tags LIKE '%,NAS1,%');
+-------+---------+--------+-------+------------+-----------+-----------------------------------------------+
| id    | balance | name   | state | auth_start | ip        | properties                                    |
+-------+---------+--------+-------+------------+-----------+-----------------------------------------------+
| 30478 |    0.00 | 304782 | off   | 1519767803 | 10.1.1.57 |                                               |
| 30478 |    0.00 | 304782 | off   | 1519737772 | 10.1.1.57 | mod=ipoe;user=000c42de54bd;nas=10.254.254.208 |

тепер тре зрозуміти нафіга воно два рази записує в таблиую?! одну й ту ж звязку


Название: Re: CoA проверка работы
Отправлено: Efendy от 28 Февраля 2018, 06:32:29
У абона "всегда онлайн" учетка? Выключи это. "Всегда онлайн" означает, что абон не использует авторизацию и она эмулируется


Название: Re: CoA проверка работы
Отправлено: Efendy от 28 Февраля 2018, 09:36:33
Стас, ты не вспомнил почему убрал radstop?
Кажется нашел почему. radstop удаляет запись из таблицы текущих авторизаций auth_now - это норм, но он не сохраняет запись в логе авторизаций auth_log. Можно добавить сохранение, но у нас получается 2 места где это осуществляется - в модуле ядра и в процедуре. А это плохо в каком плане - каждый раз, когда мы захотим добавить какую-то фичу при завершении авторизации, например, сохранить в логе температуру администратора - нам придется это делать в двух местах. Если таких мест немного, то ок, но если постоянно размазывать функционал - мы просто концы с концами не сведем и запутаемся. Уже такое наблюдается - целый зоопарк радиус процедур для пппое, дхцп, с тегами и без и т.д.


Название: Re: CoA проверка работы
Отправлено: tom от 28 Февраля 2018, 12:11:55
У абона "всегда онлайн" учетка? Выключи это. "Всегда онлайн" означает, что абон не использует авторизацию и она эмулируется
Стас - світла ти голова!! ))
Може варто придумати якусь перевірку на "дурака". Ато той хто поставить завжди онлайн і СОА перестає працювати у клієнта..


Название: Re: CoA проверка работы
Отправлено: Efendy от 28 Февраля 2018, 12:27:12
Подумаю как


Название: Re: CoA проверка работы
Отправлено: fet4 от 28 Февраля 2018, 12:43:03
Стас, ты не вспомнил почему убрал radstop?
Кажется нашел почему. radstop удаляет запись из таблицы текущих авторизаций auth_now - это норм, но он не сохраняет запись в логе авторизаций auth_log. Можно добавить сохранение, но у нас получается 2 места где это осуществляется - в модуле ядра и в процедуре. А это плохо в каком плане - каждый раз, когда мы захотим добавить какую-то фичу при завершении авторизации, например, сохранить в логе температуру администратора - нам придется это делать в двух местах. Если таких мест немного, то ок, но если постоянно размазывать функционал - мы просто концы с концами не сведем и запутаемся.

Теперь понятно, radstop нужная вещь, будет реально видно когда сессия на брасе передергивается.

Цитировать
Уже такое наблюдается - целый зоопарк радиус процедур для пппое, дхцп, с тегами и без и т.д.

Ну а как по другому? У всех разные потребности. Я рад бы использовать штатные инструменты не выдумывая другого, которые решали бы задачи сети


Название: Re: CoA проверка работы
Отправлено: warzoni от 01 Марта 2018, 23:13:02
1) Добавил
в радиусе в sql.conf в postauth_query и accounting_update_query добавляешь ses=%{Acct-Session-Id}
2) Добавил
Код:
DROP FUNCTION IF EXISTS `get_ip`;
DELIMITER $$
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15) DEFAULT 0;
    DECLARE row_cnt INTEGER;
    DECLARE ip_id INTEGER;
    DECLARE tries INTEGER DEFAULT 30;
    DECLARE id_min INTEGER;
    DECLARE id_max INTEGER;
    DECLARE blocked INTEGER DEFAULT 0;

    SELECT 1 INTO blocked FROM users WHERE state='off' AND id=user_id LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static' AND blocked = 0 LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%';

    SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
            AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
        LIMIT 1;

    IF( ip_id IS NOT NULL) THEN
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
            WHERE id = ip_id AND uid = user_id;
        SELECT ROW_COUNT() INTO row_cnt;
        IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
    END IF;

    SELECT MAX(id), MIN(id) INTO id_max, id_min
        FROM ip_pool
        WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0);

    sel_ip: WHILE tries > 0 DO
        SELECT id, INET_NTOA(ip) INTO ip_id, user_ip
            FROM ip_pool
            WHERE uid = 0
                AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min)
                AND id <= id_max
                AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
                LIMIT 1;
        IF( user_ip IS NOT NULL) THEN
            UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600
                WHERE id = ip_id AND uid = 0;
            SELECT ROW_COUNT() INTO row_cnt;
            IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
            SET tries = tries - 5;
        END IF;
        SET tries = tries - 1;
    END WHILE;

END$$
DELIMITER ;

После тестов, появилась фигня не большая.

Когда юзер в статусе on.  COA  Посылает дисконект, и следом изменения скорости. COA перестал реагировать на статус off и отрубает включенного пользователя.



Название: Re: CoA проверка работы
Отправлено: Efendy от 02 Марта 2018, 01:07:32
 Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании


Название: Re: CoA проверка работы
Отправлено: warzoni от 02 Марта 2018, 10:07:52
Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании

Я попробую. не хотелось городить на nas скрипт по выборке клиентов. что бы их отключать. Когда есть coa_disconnect - и он работает. и мог бы выполнять свои функции.

Просто у меня назначается новый айпи, и этот переходу между состояниями on - off - модуль теряется в передаче данных IP - так как назначается ip динамический.

и мы получаем такую ситуацию.

Клиент не отключается, и весит сессия. с его скоростью. а COA отправляет данные на новый IP - а если бы дисконект работал бы только когда клиент заблокирован, он бы перед сменой айпи отключал бы абонента.


Название: Re: CoA проверка работы
Отправлено: warzoni от 02 Марта 2018, 10:20:35
Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании



Я попробую.


Название: Re: CoA проверка работы
Отправлено: warzoni от 02 Марта 2018, 11:03:11
А как передать в COA имя юзера ? хочу попробовать передать имя юзера, и по нему изменить ip когда состояния off


Название: Re: CoA проверка работы
Отправлено: fet4 от 02 Марта 2018, 11:26:00
По-моему по имени нельзя менять сессию по user-name используйте session id


Название: Re: CoA проверка работы
Отправлено: Efendy от 02 Марта 2018, 12:55:11
По-моему по имени нельзя менять сессию по user-name используйте session id
Думаю да, потому что на имени может быть несколько сессий (не в данном случае, а в принципе)


Название: Re: CoA проверка работы
Отправлено: warzoni от 02 Марта 2018, 15:00:36
Efendy

Я постарался разобраться. диссконект отрублю нахер.

COA будет передавать унекальное значения через шейпер ну например. 168/359

Код:
 ifname | username | calling-sid |     ip     | rate-limit | type | comp | state  |  uptime
--------+----------+-------------+------------+------------+------+------+--------+----------
 ppp0   | test     | 10.1.6.252  | 172.1.1.52 | 168/359    | pptp | mppe | active | 00:00:13

Все хорошо прекрасно. Но вопрос теперь что бы удалить его не сильно криво, тут я так понимаю надо заюзать cli telnet + perl.

Искать интерфейсы  с значением 168/359 - и  отсоединять. Например раз в 5 минут

В cli есть поиск по совпадениям.

show sessions match rate-limit 168/359 - выдает скорость заблоченных

К ним надо применять команду

terminate if ppp0 soft - где ppp0 - это интерфейс юзера.

----

Я поискал по форуму попытался найти образцы только у Warlock - было нечто востребовано.

Но для меня не подходит...

Efendy

Вы можете помочь создать, что бы делало поиск и отключало клиентов. я бы по тестировал. Я думаю это будет полезно в будещем тем кто захотят создать полу независимый NAS ( мать бы его так )

---

Ну или в место COA диссконект заюзать radstop -  может он правильно будет вырубать клиентов. мне все равно надо чем то их отключать, когда COA меняет значения, иначе, они будут веселиться   и радоваться что их не отрубили.







Название: Re: CoA проверка работы
Отправлено: Efendy от 03 Марта 2018, 09:46:43
COA и нужен для того, чтобы не городить заходы телнетами или ссх.

Чтобы тебе получить на выходе, что ты хочешь, тебе на время нужно стать COA. Заходишь на устройство и выполняешь команды, которые нужны чтобы абону прописалась какая-то скорость. Записываешь на бумажке. Затем тебе нужно изменить скорость, что нужно сделать? А хз. Ой вернее тоже выполнить какие-то команды и записать их на бумажке.

Я не понимаю что там сложно. COA дает команды, устройство выполняет. Никого дисконнектить не нужно. Просто забудь об этом. Это запрещено женевской конвенцией. Просто подумай какие команды нужно выполнить чтобы изменить скорость клиента не киляя его


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 11:12:54
COA и нужен для того, чтобы не городить заходы телнетами или ссх.

Чтобы тебе получить на выходе, что ты хочешь, тебе на время нужно стать COA. Заходишь на устройство и выполняешь команды, которые нужны чтобы абону прописалась какая-то скорость. Записываешь на бумажке. Затем тебе нужно изменить скорость, что нужно сделать? А хз. Ой вернее тоже выполнить какие-то команды и записать их на бумажке.

Я не понимаю что там сложно. COA дает команды, устройство выполняет. Никого дисконнектить не нужно. Просто забудь об этом. Это запрещено женевской конвенцией. Просто подумай какие команды нужно выполнить чтобы изменить скорость клиента не киляя его

Да все и работает как надо, просто когда юзера блокирует надо послать команду на отключения,  - Как отправить на nas команду стоп ( radius ) когда клиент переходить в статус блокированный ?

попробую так работать. пусть скрипт рубит.

Код:
#!/usr/bin/perl
use Control::CLI;
use Data::Dumper;
use Logger::Syslog;
use File::Basename;

logger_prefix(basename($0));
info("Starting at ".localtime());

my $hostname="127.0.0.1";
my $port="2000";
my $username='123';
my $password='12345';
my $cmd_1 = 'show sessions ifname,rate-limit';
my $cmd_2 = 'show sessions ifname,username,rate-limit match rate-limit 168/359';
my $cmd_3 = 'terminate if $iface soft ';

$cli = new Control::CLI('TELNET');
$cli->connect(Host      => $hostname,
              Port      => $port,);
$cli->login(Username    => $username,
            Password        => $password,);
my @arr = split("\n",$cli->cmd($cmd_2));
@arr = get_iface_array(\@arr);

foreach $elem (@arr) {
    my @in_array = @{$elem};
    my $iface = $in_array[0];
    info ("Delete iface: ".$iface." for username: ".$in_array[1]);
    $cli->cmd("terminate if ${iface} soft");
}


$cli->disconnect;
info("Stopped at ".localtime());

sub get_iface_array() {
        my @result;
        my @in_array = @{$_[0]};
        foreach $elem (@in_array) {
                @parts = ($elem =~ m/(ppp\d+)|([\d\/]+)/g);
                my @res;
                foreach $elem2 (@parts) {
                        if ($elem2 ne undef) {
                                push @res,$elem2;
                        }
                }
                if ($#res > 0) {
                        push @result, \@res;
                }
        }
        return @result;
}


Название: Re: CoA проверка работы
Отправлено: Warlock от 03 Марта 2018, 12:09:03
Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 12:57:03
Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить

Сессия будет рубится только в случаи блокировки пользователя. А если разрешен, работай себе на здоровье.


Название: Re: CoA проверка работы
Отправлено: Efendy от 03 Марта 2018, 14:03:30
Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить

Сессия будет рубится только в случаи блокировки пользователя. А если разрешен, работай себе на здоровье.
Зачем? Чтобы юзер бегал перегружал свой роутер, проклинал провайдера, стеснялся звонить спросить причину отсуствия интернета с последующим переходом к конкурентам?

Не надо никогда не давать создавать сессию! Это ваш канал связи с пользователем. Вы можете его переслать на страницу с сообщением "пополни счет в этом терминале или возьми кредит", абон может зайти на страницу и увидеть свой баланс, может оплатить через платежный сервис если в фаерволе открыть доступ только к "платежным ip". Все, что ты должен делать - это регулировать скорость и доступы


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 16:21:34
Я Вас прекрасно понимаю. В nodeny все прекрасно работает. Но у меня обычные просьбы, при этом я как и все не хочу не куда лезть сильно, и малой кровью отделаться.

Нам это требуется, в данной схеме что мы делаем, значит это надо делать.. Вы не сделали nodeny plus под линукс, а нам надо под линукс, возможно тогда бы мы не задовали глупых вопросов, и

настроили все по мануалу, и NAS бы работал с фаерволом, и не надо было думать, и тестировать работу и прочию хрень тратить время и т п.

Но увы что имеем то имеем. Поэтому продолжаем дисскусию в духе ( пусть клиенты идут до конкурентов ))

Пока запустились,это конечно не финиш но уже что-то.  :)

Efendy - с работой главное программиста - не часто говорить зачем.  :) Обленишся быстро ))) Но это пока не к вам вы на высоте и стараетесь, это видно.


Название: Re: CoA проверка работы
Отправлено: Warlock от 03 Марта 2018, 16:45:29
Ты вообще разобрался как работает модуль?
если вдруг нет, то попробую я.
в create.cfg.coa.cfg.pm есть такие параметры
$coa_connect__state_on - тут указываешь, что нужно послать, когда у пользователя все нормально и он только что подключился.
$coa_connect__state_off - тут указываешь, что нужно послать, когда пользователь заблокирован (нет тарифа или просто заблокирован) - и он только что подключился.
$coa_disconnect - тут указываешь, что нужно послать, когда пользователь УЖЕ подключен.
Расскажу как в моем случае работает $coa_disconnect. Когда пользователь подключен, у него деактивируются 2 профайла (т.к. мы не хотим разбираться, включен ему доступ или нет) а дальше уже в зависимости от его статуса активируется $coa_connect__state_on либо $coa_connect__state_off.


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 17:06:18
Ты вообще разобрался как работает модуль?
если вдруг нет, то попробую я.
в create.cfg.coa.cfg.pm есть такие параметры
$coa_connect__state_on - тут указываешь, что нужно послать, когда у пользователя все нормально и он только что подключился.
$coa_connect__state_off - тут указываешь, что нужно послать, когда пользователь заблокирован (нет тарифа или просто заблокирован) - и он только что подключился.
$coa_disconnect - тут указываешь, что нужно послать, когда пользователь УЖЕ подключен.
Расскажу как в моем случае работает $coa_disconnect. Когда пользователь подключен, у него деактивируются 2 профайла (т.к. мы не хотим разбираться, включен ему доступ или нет) а дальше уже в зависимости от его статуса активируется $coa_connect__state_on либо $coa_connect__state_off.

$coa_connect__state_on - прекрасно работает.
$coa_connect__state_off - прекрасно работает.

Два параметра выполняют свои функции.

Но ранее в теме, мне дали процедуру, которая говорит, когда пользователь заблокирован, то при подключении выдавать, ip из динамического пула с тегом block/

И тут все прекрасно работает ( НО появилась не приятная вещь ) а конкретно.

COA - передает параметр $coa_connect__state_off - с новый айпи из пула(block). Естественно такова юзера нету на насе, и мы получаем отпиливания. и клиент дальше сидит и работает как не в чем не бывало. Пока не разорвет сессию. потом при следующем подключении он получит ай-пи из пула block - и его кинет на страницу заглушки.

Дополню.  и вот когда  юзер уходит в заблокированные, nodeny посылает сигнал $coa_disconnect  -- и тут бы все хорошо было бы !

Но мы добавили в таблицу ses= что бы COA постоянно передавал скоростя юзеров которые изменили сесси. И все было бы прекрасно по логике. но $coa_disconnect - работает не от статуса OFF юзера в таблице а от изменений в таблице ))))


Название: Re: CoA проверка работы
Отправлено: Efendy от 03 Марта 2018, 18:02:29
Давай по-порядку. Заблокированный абон делает dhcp-запрос. Радиус выдает ему ip из пула blocked. Дальше срабатывает $coa_connect__state_off, в котором есть и ip  и сессия, в чем проблема? Опиши подробней


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 18:21:56
Давай по-порядку. Заблокированный абон делает dhcp-запрос. Радиус выдает ему ip из пула blocked. Дальше срабатывает $coa_connect__state_off, в котором есть и ip  и сессия, в чем проблема? Опиши подробней

Проблема - в том, что когда состояния абона переходить из on - off или из off - on  ( ip меняется ) и не radius передает новый айпи, а COA напрямую в NAS. в насе стоит accel-ppp  и он должен изменить айпи абону.

Радиус - не может активную сессию изменить без отключения.

Так-вот когда айпи меняется, COA передает на NAS новый айпи, а нас говорит что такова айпи нету, и делать я не чего не буду. и абону надо переподключится что бы изменился айпи.


Название: Re: CoA проверка работы
Отправлено: Efendy от 03 Марта 2018, 18:30:52
состояния абона переходить из on - off или из off - on  ( ip меняется )
почему меняется ip? Если абон подключен и ты ему просто меняешь параметр "заблокирован" на "да", то ip не меняется. Или у тебя меняется?


Название: Re: CoA проверка работы
Отправлено: warzoni от 03 Марта 2018, 18:32:27
состояния абона переходить из on - off или из off - on  ( ip меняется )
почему меняется ip? Если абон подключен и ты ему просто меняешь параметр "заблокирован" на "да", то ip не меняется. Или у тебя меняется?

Да меняется.

Код:
DROP FUNCTION IF EXISTS `get_ip`;
DELIMITER $$
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15) DEFAULT 0;
    DECLARE row_cnt INTEGER;
    DECLARE ip_id INTEGER;
    DECLARE tries INTEGER DEFAULT 30;
    DECLARE id_min INTEGER;
    DECLARE id_max INTEGER;
    DECLARE blocked INTEGER DEFAULT 0;

    SELECT 1 INTO blocked FROM users WHERE state='off' AND id=user_id LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static' AND blocked = 0 LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%';

    SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
            AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
        LIMIT 1;

    IF( ip_id IS NOT NULL) THEN
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
            WHERE id = ip_id AND uid = user_id;
        SELECT ROW_COUNT() INTO row_cnt;
        IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
    END IF;

    SELECT MAX(id), MIN(id) INTO id_max, id_min
        FROM ip_pool
        WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0);

    sel_ip: WHILE tries > 0 DO
        SELECT id, INET_NTOA(ip) INTO ip_id, user_ip
            FROM ip_pool
            WHERE uid = 0
                AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min)
                AND id <= id_max
                AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
                LIMIT 1;
        IF( user_ip IS NOT NULL) THEN
            UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600
                WHERE id = ip_id AND uid = 0;
            SELECT ROW_COUNT() INTO row_cnt;
            IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
            SET tries = tries - 5;
        END IF;
        SET tries = tries - 1;
    END WHILE;

END$$
DELIMITER ;

COA надо когда он заблокирован выдавать IP из пула (динамичиского) с тегом blocked - а когда он оплачивает, возвращать его статистический айпи.


Название: Re: CoA проверка работы
Отправлено: ivanmfan от 06 Марта 2018, 10:40:32
состояния абона переходить из on - off или из off - on  ( ip меняется )
почему меняется ip? Если абон подключен и ты ему просто меняешь параметр "заблокирован" на "да", то ip не меняется. Или у тебя меняется?

Да меняется.

Код:
DROP FUNCTION IF EXISTS `get_ip`;
DELIMITER $$
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15) DEFAULT 0;
    DECLARE row_cnt INTEGER;
    DECLARE ip_id INTEGER;
    DECLARE tries INTEGER DEFAULT 30;
    DECLARE id_min INTEGER;
    DECLARE id_max INTEGER;
    DECLARE blocked INTEGER DEFAULT 0;

    SELECT 1 INTO blocked FROM users WHERE state='off' AND id=user_id LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static' AND blocked = 0 LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%';

    SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
            AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
        LIMIT 1;

    IF( ip_id IS NOT NULL) THEN
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
            WHERE id = ip_id AND uid = user_id;
        SELECT ROW_COUNT() INTO row_cnt;
        IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
    END IF;

    SELECT MAX(id), MIN(id) INTO id_max, id_min
        FROM ip_pool
        WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0);

    sel_ip: WHILE tries > 0 DO
        SELECT id, INET_NTOA(ip) INTO ip_id, user_ip
            FROM ip_pool
            WHERE uid = 0
                AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min)
                AND id <= id_max
                AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
                LIMIT 1;
        IF( user_ip IS NOT NULL) THEN
            UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600
                WHERE id = ip_id AND uid = 0;
            SELECT ROW_COUNT() INTO row_cnt;
            IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
            SET tries = tries - 5;
        END IF;
        SET tries = tries - 1;
    END WHILE;

END$$
DELIMITER ;

COA надо когда он заблокирован выдавать IP из пула (динамичиского) с тегом blocked - а когда он оплачивает, возвращать его статистический айпи.

Рекомендую переделать на один пул и слать просто l4-redirect или через ipset рулить. Ну вот представь сделают фикс COA. У абонента заканчивается тариф, его блокирует отправляет COA disconect этому юзеру. А юзер то пока не запросит новый IP будет считать что интернет отвалился, начнутся звонки в ТП. Реально не понимаю удобство с разными пулами. Есть уже хорошие рабочие конфиги на форуме под один пул


Название: Re: CoA проверка работы
Отправлено: warzoni от 07 Марта 2018, 13:22:58
ivanmfan, Да этот вариант приемлем более чем пул.

Помогите разобратся что бы  l4-redirect - добавлял ip клиента в table ipset, в режиме ppptp. я пробывал,  параметр передается, но accel-pppd - не добавляет в таблицу.. Если я не ошибаюсь это фишка для IPOE.


Название: Re: CoA проверка работы
Отправлено: warzoni от 07 Марта 2018, 13:48:42
ivanmfan, Да этот вариант приемлем более чем пул.

Помогите разобратся что бы  l4-redirect - добавлял ip клиента в table ipset, в режиме ppptp. я пробывал,  параметр передается, но accel-pppd - не добавляет в таблицу.. Если я не ошибаюсь это фишка для IPOE.

Отправляю coa

echo "L4-Redirect=1,User-Name=test,Framed-IP-Address=192.168.26.3" | radclient -x 10.0.0.8:4565 coa hardpass5

на nas приходит пакет

[2018-03-07 06:46:37]:  info: ppp0: recv [RADIUS CoA-Request id=6b <L4-Redirect 1> <User-Name "test"> <Framed-IP-Address 192.168.26.3>]

--
И тишина.

root@debian:~# ipset list
Name: l4-redirect
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16504
References: 0
Members:




Название: Re: CoA проверка работы
Отправлено: tom от 09 Марта 2018, 04:12:33
Підкажіть, плз, коли авторизується клієнт, якого немає в базі - як спрацьовує модуль СОА? бо в мене поки зовсім не спрацьовує


Название: Re: CoA проверка работы
Отправлено: tom от 09 Марта 2018, 04:48:11
Ты вообще разобрался как работает модуль?
если вдруг нет, то попробую я.
в create.cfg.coa.cfg.pm есть такие параметры
$coa_connect__state_on - тут указываешь, что нужно послать, когда у пользователя все нормально и он только что подключился.
$coa_connect__state_off - тут указываешь, что нужно послать, когда пользователь заблокирован (нет тарифа или просто заблокирован) - и он только что подключился.
$coa_disconnect - тут указываешь, что нужно послать, когда пользователь УЖЕ подключен.
Расскажу как в моем случае работает $coa_disconnect. Когда пользователь подключен, у него деактивируются 2 профайла (т.к. мы не хотим разбираться, включен ему доступ или нет) а дальше уже в зависимости от его статуса активируется $coa_connect__state_on либо $coa_connect__state_off.
Або коні п'яні, або лижі не їдуть.
Стас - де правда?
Ось з мануала
В $coa_disconnect атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)


Название: Re: CoA проверка работы
Отправлено: tom от 09 Марта 2018, 14:51:08
І ще, маленький ньюанс. При потраплянні клієнта перший раз в кабінет, коли запитує адресу і телефон, не можливо коректно ввести вулицю, оськільки є ще поле Місто/Район. В якому файлі копатися, щоб привязати НАС, або тег ір - до міста/району? Чи це може Стас зробити?


Название: Re: CoA проверка работы
Отправлено: warzoni от 09 Марта 2018, 16:07:59
каким боком тут COA ? не там пишите.

Цитировать
Підкажіть, плз, коли авторизується клієнт, якого немає в базі - як спрацьовує модуль СОА? бо в мене поки зовсім не спрацьовує

Если в базе клиента нет то и COA посылать не будет.


Название: Re: CoA проверка работы
Отправлено: tom от 10 Марта 2018, 03:31:38
Є стандартні засоби білінга, що посилають невідомого клієнта на заглушку, а потім, після привязки ір-мак до уід клієнта, дропає його і далі вже відпрацьовує СОА?


Название: Re: CoA проверка работы
Отправлено: Efendy от 10 Марта 2018, 09:48:05
Ты вообще разобрался как работает модуль?
если вдруг нет, то попробую я.
в create.cfg.coa.cfg.pm есть такие параметры
$coa_connect__state_on - тут указываешь, что нужно послать, когда у пользователя все нормально и он только что подключился.
$coa_connect__state_off - тут указываешь, что нужно послать, когда пользователь заблокирован (нет тарифа или просто заблокирован) - и он только что подключился.
$coa_disconnect - тут указываешь, что нужно послать, когда пользователь УЖЕ подключен.
Расскажу как в моем случае работает $coa_disconnect. Когда пользователь подключен, у него деактивируются 2 профайла (т.к. мы не хотим разбираться, включен ему доступ или нет) а дальше уже в зависимости от его статуса активируется $coa_connect__state_on либо $coa_connect__state_off.
Або коні п'яні, або лижі не їдуть.
Стас - де правда?
Ось з мануала
В $coa_disconnect атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)
Он прав и дока права. Посылается в обоих случаях. Скрипт noserver постоянно мониторит состояние клиентов и если оно удовлетворяет условиям включения - запускает процедуру обработки включения, если нет - запускает процедуру обработки выключения. Если какие-то данные изменились - запускает сначала процедуру выключения, затем включения.

Чтоб все было четко:
1) я называю процедурой обработки включения/выключения посколько это не обязательно может быть команда включения/выключения чего-либо. Все зависит от функций fw_usr_on и fw_usr_off.
2) fw_usr_off (в данном случае coa_disconnect) вызывается в двух случаях: при дисконнекте абонента, а также при изменении его данных.


Название: Re: CoA проверка работы
Отправлено: tom от 10 Марта 2018, 12:45:05
Цитировать
и он только что подключился.
Що мається на увазі - був запит від радіуса, наприклад, чи в білінгу пройшла авторизація і зявився зелений ключик?
Чому запитую - бо наприклад при дісконекті, клієнта підключиться швидше чим зникне ключик з ір. Відповідно дропнуть клієнта для отримання нових данних, не сильно виходить (


Название: Re: CoA проверка работы
Отправлено: Efendy от 10 Марта 2018, 16:26:11
Модуль COA, а если быть точнее noserver, который им управляет, не смотрит были ли запросы на радиус, не реагирует на какие-то сигналы и т.д. Все, что он делает - периодически мониторит состояние клиентов. По полученным данным принимает решение запустить fw_usr_on или fw_usr_off.

1) noserver: так, посмотрим кто авторизован и кому доступ разрешен? ага, никто
2) noserver: так, посмотрим кто авторизован и кому доступ разрешен? ага, никто
3) юзер подключился
4) noserver: так, посмотрим кто авторизован и кому доступ разрешен? ага, никто
5) радиус дернул процедуры mysql и у абона установился признал "авторизован"
6) noserver: так, посмотрим кто авторизован и кому доступ разрешен? опа. есть такой юзер, запускаю fw_usr_on
7) noserver: так, посмотрим кто авторизован и кому доступ разрешен? есть такой юзер. Но мы уже запускали fw_usr_on, поэтому не запускаем
8 ) noserver: так, посмотрим кто авторизован и кому доступ разрешен? есть такой юзер. Но мы уже запускали fw_usr_on, поэтому не запускаем
9) юзер дисконнектился
10) noserver: так, посмотрим кто авторизован и кому доступ разрешен? есть такой юзер. Но мы уже запускали fw_usr_on, поэтому не запускаем
11) noserver: так, посмотрим кто авторизован и кому доступ разрешен? есть такой юзер. Но мы уже запускали fw_usr_on, поэтому не запускаем
12) модуль ядра auth: чето давно нет вестей от такого-то юзера, убираю у него признак "авторизован"
12) noserver: так, посмотрим кто авторизован и кому доступ разрешен? опа, юзер пропал из выборки. запускаю fw_usr_off
13) noserver: так, посмотрим кто авторизован и кому доступ разрешен? ага, никто
14) юзер подключился
15) радиус дернул процедуры mysql и у абона установился признал "авторизован"
16) noserver: так, посмотрим кто авторизован и кому доступ разрешен? опа. есть такой юзер, запускаю fw_usr_on
17) в тарифе юзера сработал скрипт изменения скорости в инет
18) noserver: так, посмотрим кто авторизован и кому доступ разрешен? опа. есть такой юзер, при этом у него изменилась скорость. Запускаю fw_usr_off. Запускаю fw_usr_on


Название: Re: CoA проверка работы
Отправлено: tom от 10 Марта 2018, 16:32:15
Викликається при зміні тарифу офф, це мабуть під дхцп чи мікротік? Бо я з асселем будую, поки не знаю для чого офф..

І для себе ще виявив свою помилку в розумінні тексту

Процедура включення - state_on і  state_off
Процедура відключення -  disconnect - поки для неї не придумав примінення.


Название: Re: CoA проверка работы
Отправлено: Efendy от 10 Марта 2018, 16:38:15
Викликається при зміні тарифу офф, це мабуть під дхцп чи мікротік? Бо я з асселем будую, поки не знаю для чого офф..

І для себе ще виявив свою помилку в розумінні тексту

Процедура включення - state_on і  state_off
Процедура відключення -  disconnect - поки для неї не придумав примінення.
Да, disconnect может тебе и не понадобится.


Название: Re: CoA проверка работы
Отправлено: tom от 10 Марта 2018, 16:44:17
Дякую. Все розяснилось