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

Главная категория => Nodeny Plus => Тема начата: fet4 от 14 Ноября 2017, 19:54:32



Название: DHCP + Opt82 + Radius
Отправлено: fet4 от 14 Ноября 2017, 19:54:32
Привет всем!
Кто какое имя пользователя передает через радиус в случае авторизации по opt 82 (device_mac+port)?



Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 14 Ноября 2017, 22:24:19
это типа шутки или как?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Ноября 2017, 10:22:48
В чем Вы видите шутку?
Допустим при схеме vlan-per-user в качестве username выступает номер vlan.
В моем случае я авторизую клиента по opt82 и тут немного сложней получается.
Можно ли как-то учитывать еще два атрибута прилетающих от радиуса в процедурах mysql
Код:
DHCP-Agent-Circuit-Id
DHCP-Agent-Remote-Id


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 15 Ноября 2017, 10:24:48
Не, я думаю не шутка, в dhcp по дефолту в атрибут username записывается мак-адрес абона. Дальше он передается в процедуру radcheck. Порт и мак устройства никуда не передается. Я думаю можно radcheck изменить, чтобы она принимала и проверяла эти параметры. Надо будет глянуть...


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Ноября 2017, 12:16:41
Не, я думаю не шутка, в dhcp по дефолту в атрибут username записывается мак-адрес абона. Дальше он передается в процедуру radcheck. Порт и мак устройства никуда не передается. Я думаю можно radcheck изменить, чтобы она принимала и проверяла эти параметры. Надо будет глянуть...
Это будет то что нужно. Готов оплатить Ваш труд. Есть стенд на котором можно проверить.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 15 Ноября 2017, 12:50:12
Не, я думаю не шутка, в dhcp по дефолту в атрибут username записывается мак-адрес абона.
Ну я это и имел ввиду.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Ноября 2017, 13:12:54
Не, я думаю не шутка, в dhcp по дефолту в атрибут username записывается мак-адрес абона.
Ну я это и имел ввиду.
Ну можно же сделать username например mac+dev_mac+port или dev_mac+port ?  Не красиво конечно получится.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 15 Ноября 2017, 15:24:00
Тут не вопрос как можно сделать, а вопрос в том как кодирует опцию то устройство, которое вы в качестве дхцп сервера используете. В соответсвии с этим нужно переработать процедуру обработки и настройки радиус сервера. На самом деле - это только вершина айсберга под названием "авторизация по опции 82". Ягодки начнутся потом, когда вы поймете - что это не совсем то, что вы хотели.... а то что хотели делается слегка другими средствами. Поэтому для начала опишите ЧТО именно вы хотите получить.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Ноября 2017, 22:51:53
В данный момент используется модуль dhcp на основе isc-dhcp-server. Пользователи авторизуются по option82, часть из них по mac+dev_mac+port, другая часть по dev_mac+port (один на порту).

Есть задача перенести авторизацию через freeradius, в качестве dhcp сервера выступает accel-ppp что в принципе не столь важно кто им будет, главное чтобы радиус отдавал то что нужно. Разобравшись в вопросе я понял что мне не хватает всего-лишь правильных mysql процедур в которых бы учитывался не только mac адрес клиента.

Вот пример прилетающих атрибутов через радиус. Скорей всего они передаются в не измененном виде которые приходят с коммутаторов.
Код:
<Relay-Agent {Agent-Circuit-ID _000400720019} {Agent-Remote-ID _ 0006ec228025b5e0}>

Если в чем-то я не прав поправьте.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 16 Ноября 2017, 09:16:45
И да и нет. Я не зря поросил написать что именно вы хотите а не как вы это хотите сделать. Объясню на примере isc-dhcp. Обычно от дхцп в таких случаях хотят чтобы абонент получал адрес в ответ на запрос с любого мака. Все бы хорошо но в большинстве случаев это прямо противоречит самому протоколу дхцп например в случаях, действующего лизинга. В такие моменты абонент будет получать отказ «но фри лизе». И тут вдруг оказывается что используемый дхцп по другому не умеет. А вы точно уверены что ваш аксель настолько хорош что стоит под него делать новые процедуры? Чем вообще вызвана необходимость использования акселя? Просто тем что у вас линукс?  Или чем?


Название: Re: DHCP + Opt82 + Radius
Отправлено: elite от 16 Ноября 2017, 12:55:50
Cell
дядька, от тут ты точно не прав
accel - действительно крутая штука


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Ноября 2017, 13:10:19
Цитировать
Обычно от дхцп в таких случаях хотят чтобы абонент получал адрес в ответ на запрос с любого мака
По-моему так и должно быть, как клиент сможет авторизоваться на порту если у него не будет Ip? А неизвестные маки и их Ip уже редиректить на заглушку авторизации. В случае с радиусом можно можно выдавать Access-Reject и обрабатывать как угодно.

Цитировать
А вы точно уверены что ваш аксель настолько хорош что стоит под него делать новые процедуры?
Думаю если бы были такие процедуры их можно было бы применять где угодно на том же микроте с минимальными правками и со всем остальным что умеет радиус.

Цитировать
Чем вообще вызвана необходимость использования акселя? Просто тем что у вас линукс?  Или чем?
Да. С accel и линуксом я подружился, я знаю их по мере своих потребностей. Тот же микрот я не знаю и мне больше по душе голый линуск. А на фре насколько мне известно dhcp через радиус развернуть нельзя.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 16 Ноября 2017, 14:43:46
Ладно. Чего вы спорите? Если не учитывать мак свича и порт, то вы эти (http://nodeny.com.ua/wiki/index.php/Dhcp%2BRadius) процедуры используете?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Ноября 2017, 15:26:12
Да на тестовом сервере их пробовал, по маку работает без вопросов.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 16 Ноября 2017, 17:44:53
Попробуй:

Код:
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64), IN dev_mac VARCHAR(64), IN port VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(12);
    DECLARE usr_ip VARCHAR(15);
    DECLARE usr_id INT;
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT REPLACE(dev_mac, ':', '') INTO dev_mac;
    SELECT uid INTO usr_id FROM mac_uid
        WHERE mac=usr_mac AND device_mac=dev_mac AND device_port=port;
    IF usr_id IS NOT NULL AND usr_id>0 THEN
        SELECT get_ip(usr_id) INTO usr_ip;
        UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
        UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;
    ELSE
        UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-3600);
        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0 AND type='dynamic'
            AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), dev_mac, port, 0)
        ON DUPLICATE KEY
            UPDATE uid=0, ip=INET_ATON(usr_ip), device_mac=dev_mac, device_port=port,
                time=UNIX_TIMESTAMP();
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid
            WHERE mac=usr_mac AND device_mac=dev_mac AND device_port=port;
    END IF;
    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
    SELECT NULL, login, 'Session-Timeout', '600', '=';
END$$
DELIMITER ;


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 16 Ноября 2017, 20:06:05
Cell
дядька, от тут ты точно не прав
accel - действительно крутая штука
Во-первых я не говорил что он плох, по этому я не понимаю почему я точно не прав.
Во-вторых разу уж ты точно знаешь что это крутая штука, так обоснуй каким-то другим способом. Например расскажи как ведет себя аксель, когда у него в лизинге находится какой-то ип адрес скажем А от порта скажем Б и вдруг с порта Б приходит запрос на получение адреса для совершенно другого устройства. Ситуация вполне жизненная - абонент выключил свой комп и включил ноутбук соседа или утюг подключил к сети или еще что-то.
Я, например не знаю, как он себя ведет, но ты, видимо поюзав его основательно (ну для того чтобы сказать что я ТОЧНО не прав) как раз знаешь это очень хорошо.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 16 Ноября 2017, 20:07:18
Цитировать
Обычно от дхцп в таких случаях хотят чтобы абонент получал адрес в ответ на запрос с любого мака
По-моему так и должно быть, как клиент сможет авторизоваться на порту если у него не будет Ip? А неизвестные маки и их Ip уже редиректить на заглушку авторизации. В случае с радиусом можно можно выдавать Access-Reject и обрабатывать как угодно.
Научитесь сначала читать, а потом понимать то что написано.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 17 Ноября 2017, 21:21:54
Efendy насколько я понял надо бы еще передать эти два параметра в sql.conf
Код:
authorize_check_query = "call radcheck('%{User-Name}', '%{DHCP-Agent-Remote-Id}', '%{DHCP-Agent-Circuit-Id}')"

И потом обработать их в radcheck.

Или вы хотите просто посмотреть что отдает данная Вами процедура radreply?

Cell
Цитировать
Например расскажи как ведет себя аксель, когда у него в лизинге находится какой-то ип адрес скажем А от порта скажем Б и вдруг с порта Б приходит запрос на получение адреса для совершенно другого устройства.
Я проверю как он ведет себя. Но думаю до выдачи дело не дойдет т.к. ip-source-guard на коммутаторе заблокирует такое поведение до момент пока связка на порту Б не закончится.

Цитировать
Научитесь сначала читать, а потом понимать то что написано.
Давайте делом заниматься.  :)


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 17 Ноября 2017, 23:43:23
я не хочу ничего смотреть) я написал процедуру, которая по идее должна работать. Почему по идее? Я ее потестил локально, т.е она работает. Дальше уже надо смотреть не ошибся ли я в логике. Ибо логика при опции 82 и без несколько отличается, хотя кажется, что по сути ничего не меняется: в одном случае у клиента проверяется мак, в другом случае мак+устройство+порт. Вроде бы отличий нет за исключением количества проверяемого. Но на самом деле есть, например, если меняется устройство или порт, то у нас есть 2 варианта поведения:
1) если абонента перетыкнули в другой порт или сменили свич, то необходимо "забыть" связку и назначить новую после ввода пароля в личном кабинете
2) послать нафик ибо это могла быть вовсе не ситуация с перетыканием в другой порт, а кто-то пытается подменить мак
Я выбрал первый вариант ибо он наиболее вероятен, в противном случае придется все эти ситуации разруливать в админке постоянно выслушивая по телефону "долбоебы, когда у меня будет инет". С другой стороны если таки будет хакер, то самой попыткой подменить мак он затрет связку валидного абона и тому придется заново вводить пароль. Думаю этим можно принебречь


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 18 Ноября 2017, 00:09:21
Efendy
Да первый вариант лучше.
"Один на порту" будет отрабатывать ?
Я правильно понял мы меняем всего-лишь radreply по данной документации (h__p://nodeny.com.ua/wiki/index.php/Dhcp%2BRadius)?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 18 Ноября 2017, 01:11:18

Я проверю как он ведет себя. Но думаю до выдачи дело не дойдет т.к. ip-source-guard на коммутаторе заблокирует такое поведение до момент пока связка на порту Б не закончится.
......
Давайте делом заниматься.  :)
Давайте.
Вы ошибаетесь. До выдачи дойдет ))) вы плохо представляете как этот гуард работает. Если вы сильно прикрутите правила на порту и разрешите только 1 мак - тем самым усложните жизнь и себе и абонентам. Потому что вам придется сбрасывать связку всякий раз при смене устройства. Это не очень удобно, особенно если лизинг у вас будет не 10 минут а побольше. Да в любом случае даже 10 минут -  это много. Адрес должен выдаваться мгновенно и в соответствии  с номером порта и устройства - вот это правильное поведение. А уж потом... всякие там снупинги-гуарды. Я к чему все это веду: нужно сначала определиться с самим дхцп - умеет он поступать так как положено в данной ситуации или нет. Я очень-приочень много времени потратил на организацию работы по опции82. Пришлось патчить dhcpd   чтобы он повторно выдавал адрес из занятого пула - иначе не красивенько вообще получалось. До такой степени не красивенько, что просто вымораживало. Но самое хреновое в этой ситуации то, что все свичи ведут себя с этой сраной опцией по разному. Бюджетные длинки за 90 баксов вообще через жопу с ней обоходятся. Нет, саму опцию нормально отправляют, тут вопросов нет, но реализация IPSG это какой-то ..... в общем желаю вам терпения ))))  Хорошо, если вы под проект закупили сразу штук 300 каких-нибудь нормальных свитчей. Иначе намучаетесь.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 18 Ноября 2017, 11:28:13
radreply, поддерживающее "один на порту" + я добавил фичу, что для незарегистрированных юзеров будет стараться выдавать один и тот же ip при переключениях:
Код:
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64), IN dev_mac VARCHAR(64), IN port VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(12);
    DECLARE usr_ip VARCHAR(15);
    DECLARE usr_id INT;
    DECLARE one_connect INT;
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT REPLACE(dev_mac, ':', '') INTO dev_mac;
    SELECT uid, oneconnect INTO usr_id, one_connect FROM mac_uid
        WHERE device_mac=dev_mac AND device_port=port
            AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''))
        LIMIT 1;
    IF usr_id IS NOT NULL AND usr_id > 0 THEN
        SELECT get_ip(usr_id) INTO usr_ip;
        UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
        UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;
        IF one_connect > 0 THEN
            UPDATE mac_uid SET mac=NULL
                WHERE mac=usr_mac AND oneconnect=0;
            UPDATE mac_uid SET mac=usr_mac
                WHERE device_mac=dev_mac AND device_port=port AND oneconnect>0;
        END IF;
    ELSE
        UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-3600);
        UPDATE mac_uid SET mac=NULL WHERE mac=usr_mac AND oneconnect>0;
        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0 AND type='dynamic'
            AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), dev_mac, port, 0)
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0 AND device_mac=dev_mac AND device_port=port, ip, INET_ATON(usr_ip)),
                uid=0, device_mac=dev_mac, device_port=port, time=UNIX_TIMESTAMP();
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid
            WHERE mac=usr_mac AND device_mac=dev_mac AND device_port=port;
    END IF;
    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
    SELECT NULL, login, 'Session-Timeout', '600', '=';
END$$
DELIMITER ;

Также не помешает добавить индекс:

Код:
alter table mac_uid add index (oneconnect);


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 20 Ноября 2017, 20:19:35
Efendy на этой неделе оттестирую и отпишусь. Спасибо.

Cell
У меня стоит 2 мака на порту свитча если "один на порту" и таких большинство, проблем нет. А зачем сбрасывать связку с "один на порту" там же мак не учитывается?!
Цитировать
Пришлось патчить dhcpd   чтобы он повторно выдавал адрес из занятого пула - иначе не красивенько вообще получалось
Я так понял это при статике? чтобы один и тот же адрес выдавался клиенту?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Декабря 2017, 13:18:13
Efendy
Тестирую Вашу процедуру и есть парус вопросов.

Option82 передается в неизменном виде
Код:
[sql]   expand: call radcheck_ipoe('%{User-Name}') -> call radcheck_ipoe('ec:08:6b:d9:96:e7')
[sql] User found in radcheck table
[sql]   expand: call radreply_ipoe('%{User-Name}','%{DHCP-Agent-Remote-Id}','%{DHCP-Agent-Circuit-Id}','%{NAS-Identifier}') -> call radreply_ipoe('ec:08:6b:d9:96:e7','0x00060012cf7ef380','0x766c616e323030','accel-ppp-ipoe')

Получится ли в процедуре radreply разобрать эти опции? И что делать если разные коммутаторы будут присылать по-разному?
В accel-ppp есть возможность разбирать это все с помощью Lua для каждого интерфейса/vlan и формировать username например так agent_circuit_id:agent_remote_id:mac

Может так будет проще и лучше?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 17 Декабря 2017, 20:09:02
Трудно переключать контекст и вникать о чем там речь была, попробую угадать, нужно распарсить строку '0x00060012cf7ef380' и выудить из нее мак и порт? Причем формат этой строки будет разный в зависимости от свича? Если тип свича присылать отдельным параметром, то в принципе можно распарсить, хоть mysql и тугой на строковые операции


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 18 Декабря 2017, 13:58:55
Трудно переключать контекст и вникать о чем там речь была, попробую угадать, нужно распарсить строку '0x00060012cf7ef380' и выудить из нее мак и порт? Причем формат этой строки будет разный в зависимости от свича? Если тип свича присылать отдельным параметром, то в принципе можно распарсить, хоть mysql и тугой на строковые операции
Тип свича вряд ли получиться присылать отдельным атрибутом, так как список возможных отправляемых атрибутов ограничен.
А что если все-таки присылать в User-Name нужные данные в правильном формате c83a35d309e0:e067b318340a:1 = [mac]:[dev_mac]:[port] и в sql процедуре просто распарсить на части их. Тем более если такая возможность есть.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 09 Января 2018, 12:36:53
Трудно переключать контекст и вникать о чем там речь была, попробую угадать, нужно распарсить строку '0x00060012cf7ef380' и выудить из нее мак и порт? Причем формат этой строки будет разный в зависимости от свича? Если тип свича присылать отдельным параметром, то в принципе можно распарсить, хоть mysql и тугой на строковые операции

Хотелось бы закончить связку :)

Цитировать
распарсить строку  и выудить из нее мак и порт
Давайте сделаем как вы предложили.

Цитировать
Причем формат этой строки будет разный в зависимости от свича? Если тип свича присылать отдельным параметром, то в принципе можно распарсить
В основном прилетают данные со свичей в одном формате, имеется несколько штук которые отличаются.

Что вообще хотелось бы получить от связки.

-сохранить функционал модуля dhcp (Один на порту, Фиксированное подключение)
-выдавать статический ip если он есть  в учетке
-выдавать с пула по тэгу.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 12 Января 2018, 14:14:09
Efendy

Radius call radreply_ipoe шлет такую конструкцию
Код:
(14) sql: EXPAND call radreply_ipoe('%{User-Name}','%{NAS-Identifier}')
(14) sql:    --> call radreply_ipoe('ec086bd996e7-0012cf7ef380-21','accel-ppp-ipoe')

radreply_ipoe
Код:
DELIMITER $$
CREATE DEFINER=`nodeny`@`%` PROCEDURE `radreply_ipoe`(IN `login` VARCHAR(64), IN `tag` VARCHAR(64))
BEGIN
    DECLARE rad_mac VARCHAR(12);
    DECLARE rad_dev_mac VARCHAR(12);
    DECLARE rad_port VARCHAR(6);
    DECLARE usr_id INT;
    DECLARE usr_onecon INT;
    DECLARE usr_ip VARCHAR(15);
   
    SELECT SUBSTRING_INDEX(login, '-', 1) INTO rad_mac;
    SELECT SUBSTRING_INDEX(login, '-', -1) INTO rad_port;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(login, '-', 2), '-', -1) INTO rad_dev_mac;
   
    SELECT uid, oneconnect INTO usr_id, usr_onecon FROM mac_uid
WHERE device_mac=rad_dev_mac AND device_port=rad_port
AND (mac=rad_mac OR (oneconnect>0 AND device_mac<>''))
        LIMIT 1;

IF usr_id IS NOT NULL AND usr_id > 0 THEN
SELECT get_ip_by_tag(usr_id, tag) INTO usr_ip;
UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;

        IF usr_onecon > 0 THEN
            UPDATE mac_uid SET mac=NULL WHERE mac=rad_mac AND oneconnect=0;
            UPDATE mac_uid SET mac=rad_mac WHERE device_mac=rad_dev_mac AND device_port=rad_port AND oneconnect>0;
        END IF;

    ELSE
        UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-3600);
        UPDATE mac_uid SET mac=NULL WHERE mac=rad_mac AND oneconnect>0;

        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0 AND type='dynamic'
AND tags LIKE CONCAT('%,', tag ,',%')
AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
ORDER BY RAND() LIMIT 1 FOR UPDATE;

        INSERT INTO mac_uid VALUES(
            NULL, rad_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), rad_dev_mac, rad_port, 0)
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0 AND device_mac=rad_dev_mac AND device_port=rad_port, ip, INET_ATON(usr_ip)),
         uid=0, device_mac=rad_dev_mac, device_port=rad_port, time=UNIX_TIMESTAMP();
        COMMIT;

        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid
WHERE mac=rad_mac AND device_mac=rad_dev_mac AND device_port=rad_port;

    END IF;

    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
END$$
DELIMITER ;

ip получаю с пула по тегу все хорошо, функцию get_ip_by_tag использую от сюда

h//p://nodeny.com.ua/wiki/index.php/%D0%92%D1%8B%D0%B4%D0%B0%D1%87%D0%B0_ip_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D1%82%D0%BE%D0%B3%D0%BE,_%D0%BA_%D0%BA%D0%B0%D0%BA%D0%BE%D0%BC%D1%83_NAS_%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD_%D0%B0%D0%B1%D0%BE%D0%BD%D0%B5%D0%BD%D1%82

Efendy можно в кратце логику работы radreply, поддерживающее "один на порту" последнее что вы дали, а то я не все понимаю и возможно что-то упущу при тестировании в сети, хотелось бы все ситуации проверить.

Radius call radupdate_ipoe
Код:
(28) sql: EXPAND call radupdate_ipoe('%{User-Name}','%{Framed-IP-Address}','nas=%{NAS-IP-Address}','%{NAS-Identifier}')
(28) sql:    --> call radupdate_ipoe('ec086bd996e7-0012cf7ef380-21','10.194.13.129','nas=172.19.0.12','accel-ppp-ipoe')

radupdate_ipoe
Код:
DELIMITER $$
CREATE DEFINER=`nodeny`@`%` PROCEDURE `radupdate_ipoe`(IN login VARCHAR(64), IN ipa VARCHAR(16),
    IN properties VARCHAR(255), tag VARCHAR(64))
BEGIN
DECLARE rad_mac VARCHAR(12);
    DECLARE rad_dev_mac VARCHAR(12);
    DECLARE rad_port VARCHAR(6);
    DECLARE usr_id INT;
    DECLARE usr_ip VARCHAR(15);
   
    SELECT SUBSTRING_INDEX(login, '-', 1) INTO rad_mac;
    SELECT SUBSTRING_INDEX(login, '-', -1) INTO rad_port;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(login, '-', 2), '-', -1) INTO rad_dev_mac;
 
    SELECT uid INTO usr_id FROM mac_uid
WHERE device_mac=rad_dev_mac AND device_port=rad_port
AND (mac=rad_mac OR (oneconnect>0 AND device_mac<>''))
        LIMIT 1;

    IF usr_id IS NULL
    THEN
        SELECT ip INTO usr_ip;
    ELSE
        SELECT get_ip_by_tag(usr_id, tag) INTO usr_ip;
    END IF;

    CALL set_auth(usr_ip, CONCAT('mod=dhcp;user=', rad_mac, ';', 'dev=', rad_dev_mac, ';', 'port=', rad_port, ';', REPLACE(properties,':','')));
UPDATE mac_uid SET time=UNIX_TIMESTAMP() WHERE ip=INET_ATON(ipa) LIMIT 1;
END$$
DELIMITER ;

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


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 13 Января 2018, 01:19:00
Я бегло просмотрел твою radreply, вроде бы все норм. Ты же взял за основу http://forum.nodeny.com.ua/index.php?topic=3016.msg32154#msg32154 ?

"Один на порту" означает, что нам не важен мак абона, поскольку мы по маку свича и порту итак знаем кто он. Поэтому используется подобное условие:
Код:
WHERE device_mac=dev_mac AND device_port=port AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''))

означает: найти запись в которой мак свича такой-то, порт такой-то. При этом если мак абонента такой-же как и зарегистрирован, то это наш абон. Если это условие сработает, то неважно, что он еще и один на порту. Но допустим он сменил комп и тогда условие mac=usr_mac не сработает, но есть условие ИЛИ: если данный порт помечен как "один на порту" (oneconnect>0), то тоже считаем, что запись наша. При этом для подстраховки проверяется, что задан мак свича.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 14 Января 2018, 12:53:10
Efendy
Да это твоя процедура, дополненная нужным мне функционалом.

Если не сложно глянь пожалуйста еще radupdate_ipoe, а то я не уверен в правильности так как пока еще делаю на ощупь.

На dhcp сервере у меня установлены renew-time=150,lease-time=300,max-lease-time=300 относительно этих параметров в биллинге или radius нужно подгонять таймауты обновлений дабы авторизация работала правильно?


Название: Re: DHCP + Opt82 + Radius
Отправлено: sever от 24 Января 2018, 11:48:52
Например расскажи как ведет себя аксель, когда у него в лизинге находится какой-то ип адрес скажем А от порта скажем Б и вдруг с порта Б приходит запрос на получение адреса для совершенно другого устройства. Ситуация вполне жизненная - абонент выключил свой комп и включил ноутбук соседа или утюг подключил к сети или еще что-то.


В аццеле при схеме влан на клиента работает всё хорошо, можно соседями ходить друг к другу со своими  ноутбуками.
У меня в процедурах проверяется номер влана, с которого пришёл запрос, а не мак абонента. Если этот влан на порту Б, без разницы что в него включать, абонент порта Б будет всегда получать адрес, основанный на влане, прописанном на порту и закреплённым за абонентом.
Если же прилетает несколько mac-адресов - настраивается в настройках аццеля, Replace/Reject/ либо shared (заменяем сессию если 2 мака, отбиваем её либо разрешаем выгребать адреса в одном влане).


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 24 Января 2018, 15:11:53
Это все элементарные вещи и все это понятно. Не понятно как поведет себя аксель, когда у него в не истекшем лизинге будет выдан адрес на один мак а с этого же  порта придет снова запрос на новый адрес. А? обосрется  он как ISC-DHCPD или выдаст этот же адрес новому устройству. Сдается мне что обосрется. Тут только делать лизинг довольно коротким и ждать когда он закончится.


Название: Re: DHCP + Opt82 + Radius
Отправлено: sever от 24 Января 2018, 16:15:30
Это все элементарные вещи и все это понятно. Не понятно как поведет себя аксель, когда у него в не истекшем лизинге будет выдан адрес на один мак а с этого же  порта придет снова запрос на новый адрес. А? обосрется  он как ISC-DHCPD или выдаст этот же адрес новому устройству. Сдается мне что обосрется. Тут только делать лизинг довольно коротким и ждать когда он закончится.

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


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 24 Января 2018, 17:20:40
Да по логам смотреть не интересно т.к. по истечении лизинга выдача одного и того же адреса является обычным поведением любого дхцп сервера согласно протокола. А вот выдача ДРУГОГО адреса во время действия лизинга в принципе тоже укладывается в протокол, но как раз для нас является неприемлемым (в разрезе рассматривания статических пулов адресов).


Название: Re: DHCP + Opt82 + Radius
Отправлено: sever от 24 Января 2018, 17:33:35
Из статического пула всегда выдаётся один и тот же адрес, который ты указал.
Из динамики если интересно, могу затестить при живой сессии в этом же влане подключиться с другого устройства.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 24 Января 2018, 19:08:37
Докладываю.
Если у клиента есть статика или ip еще числится за данных портом, не маком, в случае смены мака клиента выдается тот же ip.
Естественно в конфиге accel
Код:
single-session=replace


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 24 Января 2018, 22:23:56
во, это другое дело.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 29 Января 2018, 18:55:04
Подскажите, а как сделать что бы авторизация пользователя бралась с аккаунтинга радиуса для dhcp ? Как в pppoe сессия отпала, ключ через 1-2 минуты так же исчез.
Сейчас для dhcp клиентов эта процедура занимает около 15 мин.?


Название: Re: DHCP + Opt82 + Radius
Отправлено: elite от 29 Января 2018, 20:07:43
не запускать модуль ядра дхцп?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 30 Января 2018, 01:49:25
Подскажите, а как сделать что бы авторизация пользователя бралась с аккаунтинга радиуса для dhcp ? Как в pppoe сессия отпала, ключ через 1-2 минуты так же исчез.
Сейчас для dhcp клиентов эта процедура занимает около 15 мин.?
Запустить модуль dhcp либо в ядре либо отдельным процессом.

Тут кстати одна интересная фенечка вырисовывается с этими авторизациями.
Если брас удаленный, да еще и тормознутый типа микротика, то авторизация включается не мгновенно, а через какое-то время и юзер, при должной сноровке умудряется наблюдать в лучшем случае заглушку а в худшем тупящий белый экран. Поэтому я при подобных способах авторизации включаю "всегда онлайн" + модуль дхцп для зеленых ключиков



Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 30 Января 2018, 11:26:47
Цитировать
Запустить модуль dhcp либо в ядре либо отдельным процессом.
Он запущен в ядре.

Может быть это связано с тем какой mod=dhcp в radupdate процедуре? Или все таки действительно выключить модуль dhcp, где-то читал что он поддерживает авторизацию, но это актуально вроде для связки без radius и может он не нужен?

Цитировать
...то авторизация включается не мгновенно, а через какое-то время...
Не знаю, в версии без радиуса и с радиусом авторизация начинается верно, без радиуса по "events.pl commit", с радиусом по отработке radreply
А поддерживать авторизацию можно я так думаю по acct-interim-interval=60

 


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 30 Января 2018, 11:58:18
Модуль ядра нужен. Если у вас не воркает, значит нет аккаутинга. Смотри где его еще навключать можно. В микротике, например, он включается отдельным пунктом меню ip
Или может быть ошибка в процедуре radupdate - не мешало бы в дебаге подаблюдать что пишет.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 30 Января 2018, 12:23:43
Аккаунтинг есть.
Код:
(9) sql: EXPAND call radupdate_ipoe('%{User-Name}','%{Framed-IP-Address}','nas=%{NAS-IP-Address}','%{NAS-Identifier}','%{Acct-Session-Id}')
(9) sql:    --> call radupdate_ipoe('ec086bd996e7-00060012cf7e-1','10.194.12.110','nas=172.19.0.12','accel-ppp-ipoe','586929edd8884b8f')
(9) sql: Executing query: call radupdate_ipoe('ec086bd996e7-00060012cf7e-1','10.194.12.110','nas=172.19.0.12','accel-ppp-ipoe','586929edd8884b8f')
(9) sql: SQL query returned: success
(9) sql: 1 record(s) updated

И ключи есть. Просто долго гаснут когда клиента сессия завершается.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 30 Января 2018, 12:52:37
По таймауту должно выключаться 150 секунд.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 30 Января 2018, 13:10:32
По таймауту должно выключаться 150 секунд.

После последнего аккаунтинга?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Cell от 30 Января 2018, 23:26:59
угу


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 01 Февраля 2018, 14:54:18
При ручном добавлении мака в учётке пользователя ключик активируется не с тем ip который выдан  в данный момент ему dhcp-сервером. В чем может быть проблема?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 01 Февраля 2018, 17:36:17
Мак добавляешь в момент когда абон уже авторизован?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 01 Февраля 2018, 19:31:19
Да, устройство получило ip но еще не привязано ни к кому, добавляю мак и добавляется в учетку совсем другой Ip не тот который в данный момент, если устройством перезапросить, то выдается уже этот ip который светится в учетке.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 01 Февраля 2018, 20:36:20
Абонент подключился по dhcp. Мак неизвестный. Поэтому он не авторизован и данный ip не привязан еще к учетке.  Ты добавляешь мак и сразу же в учетке сам прописывается левый ip?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 01 Февраля 2018, 22:37:58
Цитировать
Абонент подключился по dhcp. Мак неизвестный. Поэтому он не авторизован и данный ip не привязан еще к учетке.  
Это понятно. Все логично так и есть.

Цитировать
Ты добавляешь мак и сразу же в учетке сам прописывается левый ip?
Да, ну не сразу, а после аккаунтинга очередного.
Т.е. нахожу мак
Цитировать
Dhcp выдал по данному маку ip = 10.194.14.205, однако пока еще клиент не зарегистрировался

Все хорошо это Ip который на интерфейсе у клиента. Потом добавляю клиенту мак,свитч, порт. И через минуту прописывается ip левый, ну не совсем левый, с нужного пула, возможно когда-то выдавался но не 10.194.14.205 который по идее должен прописаться. И если сделать на клиенте ребут то он получит как раз тот который прописался.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 02 Февраля 2018, 10:04:52
Я понял в чем проблема. Исправлю, но хочу четко понимать некоторые моменты - ты говоришь об аккаунтинге. У тебя в dhcp идет аккаунтинг?  В isc-dhcpd вроде нет аккаунтинга и там мы решили сделать маленькое время выдачи аренды адреса. Но это не аккаунтинг. Еще есть модуль ядра dhcp - он эмулирует аккаунтинг. Ты аккаунтинг от него имеешьввиду или реально от dhcpd?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 02 Февраля 2018, 11:05:58
Да в dhcp. Ты наверно забыл что в этой теме пилим DHCP через RADIUS с OPTION 82. Вот через радиус и происходит аккаунтинг раз в минуту.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 03 Февраля 2018, 10:51:19
Скачай заново модуль dhcp


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 03 Февраля 2018, 13:47:58
Обновил модуль.

Все равно при добавлении мака в ручную, в учетке появляется ip не тот который у клиента в данный момент.

Так же есть баг если клиент авторизован через pppoe и ему добавляешь mac для авторизации через dhcp то мак привязывается к тому ip который авторизован через pppoe


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 04 Февраля 2018, 12:19:39
а тот ip который выдан еще не известному маку, он вообще попадает под условия в каком диапазоне должен быть выдан ip?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 04 Февраля 2018, 13:10:12
Да попадает. Ip выдается по тегу с пула. С нужного пула и выдается.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 06 Февраля 2018, 15:12:49
Я правильно понимаю аккаунтинг с радиуса должен прилетать немного чаще чем значение в /usr/local/nodeny/kernel/auth.cfg  - timeout => 150 ? Да бы авторизация поддерживалась?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 07 Февраля 2018, 00:40:45
Я кажется понял в чем проблема, завтра попробую пофиксить. Проблема, что я на 3ж, но надеюсь получится


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 07 Февраля 2018, 11:49:12
После твоего фикса последнего, при добавлении в ручную в админке мака, сделать это получается со второго раза. Т.е. есть связка, удаляю старую, добавляю новую - пишет типа "Связка не удалась", еще раз добавляю и все ок.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 07 Февраля 2018, 20:00:02
Покажи какая ошибка в дебаг-режиме на странице сохранения. Если на титульной странице включить дебаг-режим, то практически все сохранения будут идти с большим белым пространством, на котором написано redirect. Нужно не нажимая redirect нажать debug и сделать скриншот ошибки


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 08 Февраля 2018, 22:44:12
Сел заскринить ошибку сегодня и прикинь не мог получить ее все добавлялось успешно. Что я делал - брал учетку, удалял в ней мак, добавлял снова мак, добавлял в другую учетку этот мак, все добавлялось. А Ip каждый раз разный выдавался с нужного пула, хотя само устройство не перезагружалось.

Что я делал до этого когда получал ошибку?

Поменял тип данных столбца device_port на varchar(6)
И в /usr/local/nodeny/modules/dhcp/create.o_mac_uid.pl
Код:
my $device_port = ses::input_int('device_port');
на
Код:
my $device_port = ses::input('device_port');

Да бы в него записывались не только целые числа, а и порты вида 1/12, 0/2:6 и т.д.
Для чего ? Возникла ситуация в сети когда одинаковый номер порта был у двух разных клиентов и естественно не давал работать обоим.
А что тогда у них разное было ? А разный у них был номер юнита, т.к. свичи были в стеке, т.е порты были такого вида 1/13 и 3/13.
Подумав, решил что нужно так же и хранить все это и изменил.

Могли ли эти изменения еще на что-то повлиять например, выдавать ошибку при создании, может там были какие-то не состыковки?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 10 Февраля 2018, 09:29:04
Полностью не вник, что ты написал. Напишу как я тестировал. У абона включается комп, мак которого еще нигде в биллинге не светился. Dchp выдает рандомный ip из пула биллинга. При этом в таблице mac_uid создается запись ip + mac + device_mac + device_port. Uid в этой записи = 0. Оператор открывает учетную запись этого абонента и нажимает кнопку "добавить мак". В поле мак-адрес вписывает мак абона и нажимает "сохранить". При этом после сохранения видно, что в поле "порт" и "мак устройства" добавились корректные данные (те, которые я написал выше device_mac и device_port). Более того, если в mysql посмотреть таблицу mac_uid и выбрать запись uid=id_абона, то и ip должен быть тем, что был выдан абоненту когда его мак еще не был занесен. Кстати, ip хранятся в виде числа, их надо расшифровывать так: INET_NTOA(ip).

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

Ну и порт переделаю в текстовый вид чуть позже

  


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Февраля 2018, 15:20:03
Обновил сегодня модуль и что получаю.

Цитировать
Оператор открывает учетную запись этого абонента и нажимает кнопку "добавить мак". В поле мак-адрес вписывает мак абона и нажимает "сохранить". При этом после сохранения видно, что в поле "порт" и "мак устройства" добавились корректные данные (те, которые я написал выше device_mac и device_port)

mac не привязан
Код:
 SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac   | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| 6434302 | ec086bd996e7 | 180489656 |   0 | 1518698735 | 0012cf7ef380 | 1/21        |          0 |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+

Добавляю чисто мак, без указания устройства и порта. Как мы видим устройство и порт не подтягивается, а ip сохраняется тот который выдан.
Код:
 SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+------------+-------------+------------+
| 6434377 | ec086bd996e7 | 180489656 |   4 | 1518698915 |            |             |          0 |
+---------+--------------+-----------+-----+------------+------------+-------------+------------+

Проходит аккаунтинг и что мы видим? Связка удалилась и ip поменялся.
Код:
SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac   | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| 6434377 | ec086bd996e7 | 180488872 |   0 | 1518699128 | 0012cf7ef380 | 1/21        |          0 |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+

Дальше, если указать мак, устройство и порт. То все хорошо, подвязывается нужный ip и клиент работает без передергиваний.
Код:
 SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac   | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| 6434454 | ec086bd996e7 | 180488872 |   4 | 1518699308 | 0012cf7ef380 | 1/21        |          0 |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+

Если добавлять мак со всеми полями включая галку один на порту. То вываливается с ошибкой "Создание привязки не выполнено" и запись в mac_uid WHERE mac=? AND uid=0 затирается.
Debug
Код:
0.115583	
181 Db.pm::rollback
rollback (fail: DELETE FROM mac_uid WHERE mac=? AND uid=0)

При повторном добавлении, добавляется но без ip. Клиентское устройство приходится передергивать.
Код:
SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+----+-----+------+--------------+-------------+------------+
| id      | mac          | ip | uid | time | device_mac   | device_port | oneconnect |
+---------+--------------+----+-----+------+--------------+-------------+------------+
| 6434656 | ec086bd996e7 |  0 |   4 |    0 | 0012cf7ef380 | 1/21        |          2 |
+---------+--------------+----+-----+------+--------------+-------------+------------+


Как я понимаю где-то не правильно учитывается oneconnect. Т.к. если галку не ставить то все добавляется успешно и ip правильный. Но в основном у всех один на порту. Поэтому это критично.

Так же забегая наперед, хотелось бы добавить функцию "один на устройстве" аналог один на порту, но учитывается только мак устройства при авторизации. Большая часть  клиентов на pon так и работают, порт устройства прилетающего в опиции 82 меняется на 1, тем самым эмулируя "один на устройстве" хотя в реальности там есть физический номер порта который хотелось бы видеть в связке но не учитывать т.к. он меняется периодически.


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 15 Февраля 2018, 15:49:52
Цитировать
Тут такой момент. Я сначала сделал перенос только ip и ты, вероятно, тогда обновился. Но позже я еще сделал перенос мака устройства и порта
Когда ты последний раз обновлял dhcp модуль?

P.S. Мой затуп, я не обновил модуль. Обнови

Должно быть так:
   
Код:
SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac   | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| 6434302 | ec086bd996e7 | 180489656 |   0 | 1518698735 | 0012cf7ef380 | 1/21        |          0 |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
Цитировать
Добавляю чисто мак, без указания устройства и порта:
Код:
SELECT * FROM `mac_uid` WHERE mac='ec086bd996e7';
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| id      | mac          | ip        | uid | time       | device_mac   | device_port | oneconnect |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+
| 6434302 | ec086bd996e7 | 180489656 |   4 | 1518698735 | 0012cf7ef380 | 1/21        |          0 |
+---------+--------------+-----------+-----+------------+--------------+-------------+------------+


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Февраля 2018, 18:39:35
Да, теперь подтягиваются устройство и порт. Т.е. так правильно добавлять, чисто мак клиента, а потом галку один на порту ставить?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 15 Февраля 2018, 22:33:19
Запуск модуля dhcp вообще нужен если есть аккаунтинг через радиус?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 15 Февраля 2018, 23:10:05
Запуск модуля dhcp вообще нужен если есть аккаунтинг через радиус?
да


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 15 Февраля 2018, 23:11:09
Да, теперь подтягиваются устройство и порт. Т.е. так правильно добавлять, чисто мак клиента, а потом галку один на порту ставить?
по идее можно сразу ставить мак и один на порту, а устройство и порт подтянутся


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Февраля 2018, 13:05:22
to Tom
Я не авторизую по vlan но представляю примерно как это сделать, тем самым увеличив функционал модуля dhcp до всех современных потребностей сетей которые работают по dhcp через radius.

Без изменений модуля dhcp
можно тупо отсылать в качестве имени пользователя vlan, который в свою очередь будет записываться в поле mac таблицы mac_uid, по нему и будет происходит авторизация, минус такого способа, не будет видно маков клиента.

можно записывать vlan допустим в device_mac, а в порт единицу и указать один на порту, так же будет работать логика vlan per user, костыльно выглядит конечно.

с изменением dhcp модуля
Сделать еще одно условие и доп поле "Один на устройстве", если "ДА" то при авторизации проверять только поле device_mac в которое можно занести вместо dev_mac номер vlan. Тем самым решив вопрос vlan per user и когда клиент действительно один на устройстве.

Все поля полезные mac, device_mac, port в них может хранится нужная информация для диагностики и определения от куда клиент пришел, но она не всегда нужна при авторизации по-этому было бы удобно исключать любое из них.

Стас что скажешь ? по-этому поводу?


Название: Re: DHCP + Opt82 + Radius
Отправлено: tom от 16 Февраля 2018, 14:10:38
Записувати влани - відразу ні, це непотрібне навантаження на колцентр та інженерів.. вони мають вибрати точку підключення, в ідеалі. Де підтягнеться ід svlan. І вказати номер порта, що згенерує cvlan. Це я собі так уявляю. І тут вже саме цікаве.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Февраля 2018, 14:18:38
Цитировать
вони мають вибрати точку підключення, в ідеалі.
Где ? Когда?

Код:
І вказати номер порта, що згенерує cvlan.
Биллинг хранит то что прилетает к нему, а не наоборот.

Тогда можно добавить еще одну сущность в виде  столбца в mac_uid "vlan" и записывать туда еще и vlan и доп. поле "vlan per user", если да, то проверяем только это поле.


Название: Re: DHCP + Opt82 + Radius
Отправлено: tom от 16 Февраля 2018, 14:21:34
Ну а як привязати клієнта до порта/свіча? При введені в базу потрібно вказати де цей клієнт включений, після цього вже буде його авторизація. Миж вводим данні мака, при авторизації по маку клієнта?! Тим чи іншим способом.. В ідеалі і тут можна, по логіну паролю.. Але це вже інше тема. Поки, мені не зрозуміло, яким чином зберігати параметри авторизаціїї клієнта. Якщо в окремому полі зберігати данні типу vlan2501.101 - ну це вже суперечить вимогам Стаса про створення додаткових полів в БД. Та ще й виникає проблема, коли з accel переходити на жун, там взагалі прилітає щось типу ge-1/0/0:100-1005.


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Февраля 2018, 14:26:46
Tom вы путаетесь с понятиями.

Сначала вы хотите привязать к vlan, потом "до порта/свіча".

Цитировать
При введені в базу потрібно вказати де цей клієнт включений, після цього вже буде його авторизація.
Зачем? Есть механизм который сам его привяжет к той или иной сущности при вводе логина и пароля в личном кабинете, нужно только указать к чему именно привязать и потом прислать биллингу всю эту необходимую информацию откуда пришел запрос.

UPD
Код:
окремому полі зберігати данні типу vlan2501.101 - ну це вже суперечить вимогам Стаса про створення додаткових полів в БД.
Я думаю он сам добавит если не придумает как по другому выйти с положения. Потому что это нужные вещи.

Цитировать
Та ще й виникає проблема, коли з accel переходити на жун, там взагалі прилітає щось типу ge-1/0/0:100-1005.
Конечно это все нужно правильно формировать на входе в биллинг, уменя допустим вот так выглядят логины по опции 82 которые потом я уже в sql процедуре разбираю на части.
Код:
 ifname |            username             |    calling-sid    |      ip       | type  | comp | state  |   uptime
--------+---------------------------------+-------------------+---------------+-------+------+--------+-------------
 ipoe2  | 10feed5ded85-dcd2fc5cbfe8-0/2   | 10:fe:ed:5d:ed:85 | 10.194.0.74   | ipoe  |      | active | 10.10:43:24
 ipoe7  | f81a678b481d-0012cf8c0260-3/20  | f8:1a:67:8b:48:1d | 10.194.0.167  | ipoe  |      | active | 10.10:11:07
 ipoe0  | 30b5c25e55c3-0012cf8c0260-1/13  | 30:b5:c2:5e:55:c3 | 10.194.9.61   | ipoe  |      | active | 6.16:17:20
 ipoe1  | d46e0e506a69-0012cf8c0260-3/18  | d4:6e:0e:50:6a:69 | 10.194.0.28   | ipoe  |      | active | 5.16:05:37
 ipoe9  | 78447659340e-e067b317a3b8-0/2:6 | 78:44:76:59:34:0e | 10.194.0.6    | ipoe  |      | active | 5.02:49:02


Название: Re: DHCP + Opt82 + Radius
Отправлено: tom от 16 Февраля 2018, 14:36:20
Tom вы путаетесь с понятиями.

Сначала вы хотите привязать к vlan, потом "до порта/свіча".

Цитировать
При введені в базу потрібно вказати де цей клієнт включений, після цього вже буде його авторизація.
Зачем? Есть механизм который сам его привяжет к той или иной сущности при вводе логина и пароля в личном кабинете, нужно только указать к чему именно привязать и потом прислать биллингу всю эту необходимую информацию откуда пришел запрос.
Ну це вже інше питання, чи це вводить вручну, чи автоматом.. Питання як його зберігати і відпрацьовувати. Я не путаюсь, це білінг путається )) В нього ж немає таких параметрів як svlan-ідентифікатор свіча і cvlan-ідентифікатор порта, а є в нього Мак устройства і Порт устройства. Через них і робив костиль поки. Тільки я не знаю як на рівні радіуса розпарсить username. І тоді ще має бути хитра процедура пошуку клієнта - де спочатку по svlanу знаходим ід устройства, після цього запускаєм пошук клієнта з ід устройства і порта(який ми добудемо з cvlana)


Название: Re: DHCP + Opt82 + Radius
Отправлено: tom от 16 Февраля 2018, 14:38:36
10feed5ded85-dcd2fc5cbfe8-0/2 - це увас такий юзернейм прилітає?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 16 Февраля 2018, 14:41:45
Код:
В нього ж немає таких параметрів як svlan-ідентифікатор свіча і cvlan-ідентифікатор порта, а є в нього Мак устройства і Порт устройства
А записать в Мак устройства і Порт устройства нужные Вам данные религия не позволяет?) Это же всего-лишь строки

Цитировать
10feed5ded85-dcd2fc5cbfe8-0/2 - це увас такий юзернейм прилітає?
Да mac-device_mac-port


Название: Re: DHCP + Opt82 + Radius
Отправлено: tom от 16 Февраля 2018, 14:56:09
Код:
В нього ж немає таких параметрів як svlan-ідентифікатор свіча і cvlan-ідентифікатор порта, а є в нього Мак устройства і Порт устройства
А записать в Мак устройства і Порт устройства нужные Вам данные религия не позволяет?) Это же всего-лишь строки
Вони записані але криво. 1) Тип поля Мак устройства приводиться до виду мак адреса.. Ладно можна пережити, може то й правильно 2)порт записуємо. Але що з ними робити? хто і де має парсити юзернейм? А якщо мережа ще гібридна - вланперюзер, і авторизація по маку)))

Тре мабуть якось стандартизувати юзернейм. Наприклад, якщо прилітає лише мак клієнта- то це авторизація по маку, все інше рахується вже, що на порту 1 клієнт. Тут може бути два типа авторизації (взагалі навіть 3) - 1) Option 82 2)Vlan  per user 3) VLAN  per user з  QinQ.
в першому випадку авторизація мак пристрою (доречі сюди можна не мак тулити а ідентифікатор свіча, тоді можливо обєднати 1 і 3 варіант) і порт клієнта. 2-й влан ід - є унікальним для кожно клієнта (обмеження 4к клієнтів).3-й - svlan+cvlan. Знову ж таки, це моє бачення і не є догмою. Тому сюди пишу порадитися,  в т.ч. і з розробником, який повністю розуміє логіку свого продукта

P.S. це що описав, мабуть все таки заточено під accel. і обєднати 1 і 3 варіанти, мабуть тільки з аccel можливо.. бо ж Option 82 там інші ... Поки писав одна думка зявилась. Ща разрабам accel напишу..


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 17 Февраля 2018, 16:54:39
Запуск модуля dhcp вообще нужен если есть аккаунтинг через радиус?
Епт, я прочитал как "не нужен" и ответил "да". Запуск модуля dhcp не нужен


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 17 Февраля 2018, 17:07:49
Вы тут много написали и у меня нет времени вникать, поэтому опишу кратко, что я по этому поводу думаю.

Мы говорим об авторизации по вилану, порту и т.д. На самом деле, для биллинга вообще не важна эта сущность. Он рассматривает параметры от dhcp или иного сервера как некий идентификатор. Например, комбинация данных мак-свича-порт - это некий идентификатор. А может быть любой другой с разным количеством параметров. Если идентификатор не найден в базе (например изменился порт) - юзер считается неизвестным.

В таблице mac_uid я сделал аж 3 параметра: мак юзера, мак свича и иной како-либо параметр свича (например порт). А мог бы сделать вообще одним параметром, например, все эти данные склеивались бы в одну строку. Но чисто для удобства администрирования лучше чтобы мак устройства был отдельно - тогда админка может предложить выбор мака из списка устройств.

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

Кстати, в коде я обнаружил такой момент: если мак устройства больше 12 символов, то, все что перед ним считается vlan-ом. Видимо, я когда-то уже делал эту фичу для кого-то. Помню даже, что поле device_mac увеличивал в базе по количеству знаков. Но думаю, это было лишним, можно ж vlan хранить в поле port. Да, его надо сделать текстовым и желательно перемиеновать (но из-за совместимости не получится)


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 17 Февраля 2018, 17:58:25
Стас все верно, схема у тебя продуманная и ее хватит на все случаи. Можно просто было бы добавить еще одну функцию чтобы указывать сколько полей нужно учитывать при авторизации. Тогда мы можем смело писать допустим в поле порт или мак устройства vlan и по нему авторизовать. На данный момент мы можем или по маку авторизовать или мак+порт. Отдельно по порту или устройству не можем, а это как раз дало бы свободу выбора в схемах авторизаций


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 17 Февраля 2018, 19:23:08
Стас а как правильно в mac_uid добавить столбец?
Сделал
Код:
ALTER TABLE `mac_uid` ADD `onedevice` TINYINT(1) UNSIGNED NULL DEFAULT '0' AFTER `oneconnect`;

Через некоторое время /usr/local/nodeny/modules/dhcp/events.pl завис в deadlock, пришлось удалить столбец.
Записей всего-то 900.
Как быть?


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 19 Февраля 2018, 16:17:49
Стас подскажи как сделать из checkbox, radio чтобы выбирался или первый или второй вариант но не два вместе.
Код:
    $tbl->add('*','lL',
        [ _('[p][p]',
            L('К данному порту не подключены другие абоненты/устройства'),
            L('При подключении мак не будет проверяться')) ],
        [ v::checkbox( name=>'oneconnect', value=>2, checked=>$d->{d}{oneconnect}) ],
     );

    $tbl->add('*','lL',
        [ _('[p][p]',
            L('К данному устройству не подключены другие абоненты/устройства'),
            L('При подключении мак и порт не будут проверяться')) ],
        [ v::checkbox( name=>'onedevice', value=>2, checked=>$d->{d}{onedevice}) ],
    );


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 19 Февраля 2018, 18:23:31
Код:
    $tbl->add('*','lL',
        [ _('[p][p]',
            L('К данному порту не подключены другие абоненты/устройства'),
            L('При подключении мак не будет проверяться')) ],
        [ v::radio( name=>'oneconnect', value=>1, checked=>$d->{d}{oneconnect}) ],
    );

    $tbl->add('*','lL',
        [ _('[p][p]',
            L('К данному устройству не подключены другие абоненты/устройства'),
            L('При подключении мак и порт не будут проверяться')) ],
        [ v::radio( name=>'oneconnect', value=>2, checked=>$d->{d}{onedevice}) ],
    );
Обратить внимание:
  • имя переменной должно быть одинаковым в обоих radio ибо только так они будут считаться группой
  • value должны быть разными, чтобы при сабмите было видно какой пункт выбран
  • checked остается так же как и у тебя есть сейчас
  • необходимо модифицировать функцию апдейта так, чтобы при oneconnect = 1 устанавливалось oneconnect=1,onedevice=0; при oneconnect = 2 устанавливалось oneconnect=0,onedevice=1
  • в твоем случае третьего не дано - либо oneconnect либо onedevice будут установлены. Либо добавлять еще один radio


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 19 Февраля 2018, 19:11:51
В create.o_mac_uid.pl есть такая функция o_update, а в ней кусок кода

Код:
...
    my $device_mac = ses::input('device_mac');
    my $device_port = ses::input_int('device_port');
    my $oneconnect = ses::input_int('oneconnect');
...

Если я после добавлю условие например такое

Код:

if ($oneconnect == 1) {
  my $oneconnect = 1;
  my $onedevice = 0;
} elsif ($oneconnect == 2) {
  my $oneconnect = 0;
  my $onedevice = 1;
}


Правильно так будет?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 19 Февраля 2018, 23:34:25
нет. my ограничивает область видимости переменной. Нужно до условия определить переменные, а в самом условии не юзать my:

Код:
my $onedevice;
if ($oneconnect == 1) {
  $oneconnect = 1;
  $onedevice = 0;
} elsif ($oneconnect == 2) {
  $oneconnect = 0;
  $onedevice = 1;
}
С другой стороны зачем устанавливать $oneconnect = 1 когда $oneconnect == 1?
Код:
my $onedevice;
if ($oneconnect == 1) {
  $onedevice = 0;
} elsif ($oneconnect == 2) {
  $oneconnect = 0;
  $onedevice = 1;
}
Но проще так:
Код:
$oneconnect = $oneconnect == 1 ? 1 : 0;
my $onedevice = 1 - $oneconnect;
Или даже так:
Код:
$oneconnect = ($oneconnect == 1) + 0;
my $onedevice = 1 - $oneconnect;
Либо так:
Код:
my $onedevice = --$oneconnect == 1?  $oneconnect-- : $oneconnect++;


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 27 Февраля 2018, 13:38:55
Сегодня обнаружил еще один баг

Есть клиент dhcp у которого НЕ стоит "Один на порту" и тут он меняет ноутбук. По идее у него должно писаться "Вы сменили компьютер... Получить доступ в интернет" где он вводит логин и пароль, а вместо этого ему пишет "Доступ в интернет отсутствует т.к. вы не атворизованы... Если вы пользуетесь через высокоскоростно... " до того момента пока не удалишь его ip в учетке. Удаляешь Ip и начинает правильно писать "Вы сменили компьютер... Получить доступ в интернет".

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


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 27 Октября 2018, 15:35:19
Стас проскакивает ситуация во время новой активации связки mac=uid клиентом, что новая активация забирает чужую связку работающего юзера или недавно получавшего этот ip, предположительно это происходит из-за того что связка находится по ip, насколько я понимаю по другому не найти ее в момент активации клиентом через браузер и когда ip в динамике выдается, один и тот же адрес иногда попадает разным клиентам и тут находится связка с уже проставленным uid и она перезаписывается новым uid.

Предположительно нужно сделать проверку тут /usr/local/nodeny/modules/dhcp/create.user.dhcp.pl
Код:
   # у клиента сейчас гостевой ip - выдадим новый
    my $new_ip = $usr->{ips}[0]{ipn};
    $rows = Db->do("UPDATE mac_uid SET uid=?, ip=? WHERE ip=INET_ATON(?)", $uid, $new_ip, $ses::ip);
    Db->ok or Error $lang::user::soft_error;
Добавить проверку WHERE uid=0 или подобную в UPDATE.

Что думаешь Стас?


Название: Re: DHCP + Opt82 + Radius
Отправлено: Efendy от 28 Октября 2018, 09:19:18
А как получается, что выдается один и тот же ip?

P.S. Я не сразу отвечаю, потому что занят другой задачей (переделкой модуля snmp) и чтобы вникнуть в логику dhcp, которая слегка ебанутая, приходится долго вспоминать что там к чему


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 28 Октября 2018, 20:10:35
Цитировать
А как получается, что выдается один и тот же ip?
Предполагаю так, работает клиент, потом отключается, ip через час освобождается, но походу ip не затирается в mac_uid ?! и тут подключается гость, получает этот Ip, регистрируется и в mac_uid находится по ip, якобы его связку.

Цитировать
P.S. Я не сразу отвечаю, потому что занят другой задачей (переделкой модуля snmp) и чтобы вникнуть в логику dhcp, которая слегка ебанутая, приходится долго вспоминать что там к чему
Та это пиздец, я уже думаю рисовать все связи на бумаге между маками и другими сущностными в dhcp режиме, что бы построить правильный алгоритм.


Название: Re: DHCP + Opt82 + Radius
Отправлено: FlySky11 от 11 Сентября 2019, 16:09:47
Всем привет
Прошу у вас помощи

Есть проблема с отображением авторизации по DHCP

Схема:
Микротик(дхцп на влан) - радиус - билинг - сателит

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

Загвоздка вот в чем
Модуль дхцп не запущен с автозагрузки убран
Авторизация с гостевим ип отображаеться нормально и ип по истичению вемени пропадает
А вот авторизация со статическим ип не появляеться вообще(при етом еще и нета нет)
(роути и прочее прописано)
при запуске модуля дхцп авторизация появляеться но не отображаеться каким методом, инет тоже есть, НО при физическом оключении соединение больше не пропадает вообще



Конфиги все с доки по FreeRadius3 с изменьонной процедурой radreply для функции get_ip_by_tag (тоже сделано по доке)

Помогите пожалуйста, работает вся схема кроме етого =((((


Название: Re: DHCP + Opt82 + Radius
Отправлено: NodenY45 от 12 Ноября 2019, 20:24:30
Аккаунтинг есть.
Код:
(9) sql: EXPAND call radupdate_ipoe('%{User-Name}','%{Framed-IP-Address}','nas=%{NAS-IP-Address}','%{NAS-Identifier}','%{Acct-Session-Id}')
(9) sql:    --> call radupdate_ipoe('ec086bd996e7-00060012cf7e-1','10.194.12.110','nas=172.19.0.12','accel-ppp-ipoe','586929edd8884b8f')
(9) sql: Executing query: call radupdate_ipoe('ec086bd996e7-00060012cf7e-1','10.194.12.110','nas=172.19.0.12','accel-ppp-ipoe','586929edd8884b8f')
(9) sql: SQL query returned: success
(9) sql: 1 record(s) updated

И ключи есть. Просто долго гаснут когда клиента сессия завершается.

поделитесь своими радиус-процедурами для accel, radreply/radupdate_ipoe
Спасибо! :)


Название: Re: DHCP + Opt82 + Radius
Отправлено: skreep от 12 Ноября 2019, 23:43:11

поделитесь своими радиус-процедурами для accel, radreply/radupdate_ipoe
Спасибо! :)
[/quote]

Код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `radreply`(IN login VARCHAR(64), IN r_id VARCHAR(64), IN c_id VARCHAR(64))
    DETERMINISTIC
BEGIN
DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE add_attr MEDIUMTEXT;
  DECLARE line MEDIUMTEXT;
  DECLARE i INT DEFAULT 1;
  DECLARE usr_mac VARCHAR(12);
  DECLARE c_ID_m  VARCHAR(12) DEFAULT NULL;
  DECLARE r_ID_m  VARCHAR(12) DEFAULT NULL;
 
 SELECT REPLACE(c_id,'0x', '') INTO c_ID_m;   
 SELECT REPLACE(r_id,'0x', '') INTO r_ID_m;
 
 
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT uid INTO usr_id FROM mac_uid WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''));
    SELECT radius_attr INTO add_attr FROM users_services WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;
   
    IF usr_id IS NOT NULL AND usr_id>0 THEN
   
    SELECT get_ip(usr_id) INTO usr_ip;
        UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
        UPDATE mac_uid SET mac=usr_mac, ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''));
        SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
attr_loop:  WHILE TRUE DO
    SELECT strSplit(add_attr, '
', i) INTO line;
    IF LENGTH(line) = 0 OR i > 20 THEN LEAVE attr_loop; END IF;
    IF line LIKE '%+=%' THEN
        SELECT NULL,login,strSplit(line, '+=', 1),REPLACE (strSplit(line, '+=', 2),'\r',''),'+=';
    ELSEIF line LIKE '%=%' THEN
        SELECT NULL,login,strSplit(line, '=', 1),REPLACE (strSplit(line, '=', 2),'\r',''),'=';
    END IF;
    SET i = i + 1;
            END WHILE;
ELSE
        UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-360);
        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0
        AND type='dynamic'
        AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), r_ID_m,c_ID_m , 0, '')
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0,ip,INET_ATON(usr_ip)), time=UNIX_TIMESTAMP(),device_mac=r_ID_m, device_port=c_ID_m;
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;
SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
END IF;
END$$
DELIMITER ;

Код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `radupdate`(IN login VARCHAR(64), IN ipa VARCHAR(16), IN properties VARCHAR(255), IN ses VARCHAR(32), IN r_id VARCHAR(64), IN c_id VARCHAR(64), IN trafin BIGINT(20), IN trafout BIGINT(20))
    DETERMINISTIC
BEGIN
 DECLARE usr_id INT;
 DECLARE usr_mac VARCHAR(12) DEFAULT NULL;
 DECLARE c_ID_m  VARCHAR(12) DEFAULT NULL;
 DECLARE r_ID_m  VARCHAR(12) DEFAULT NULL;
 
 SELECT REPLACE(c_id,'0x', '') INTO c_ID_m;   
 SELECT REPLACE(r_id,'0x', '') INTO r_ID_m;

 
 SELECT REPLACE(login, ':', '') INTO usr_mac;
 SELECT uid INTO usr_id FROM `mac_uid` WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>'')) limit 1;   

 UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 300 WHERE ip = INET_ATON(ipa);

 IF( usr_id > 0 ) THEN
 
  CALL set_auth(ipa, CONCAT('mod=ipoe;',REPLACE(properties,':','')));
  INSERT INTO ses_traf SET ses_id=ses, traf_in=trafin, traf_out=trafout, time=UNIX_TIMESTAMP(), uid=usr_id;
 
 END IF;
END$$
DELIMITER ;
Ось десь так у мене працює, авторизує по маку ОЛТ та маку ОНУ, freeradius3, трафік через радіус також рахує


Название: Re: DHCP + Opt82 + Radius
Отправлено: fet4 от 13 Ноября 2019, 11:09:48
Мой radreply

Код:
DELIMITER $$
CREATE DEFINER=`nodeny`@`%` PROCEDURE `radreply_ipoe`(IN `login` VARCHAR(64), IN `tag` VARCHAR(64))
BEGIN
DECLARE rad_mac VARCHAR(12);
    DECLARE rad_dev_mac VARCHAR(12);
    DECLARE rad_port VARCHAR(12);
    DECLARE usr_id INT;
DECLARE usr_ip VARCHAR(15);
    DECLARE usr_onecon INT;
DECLARE usr_onedev INT;
    DECLARE usr_state VARCHAR(3);
    DECLARE add_attr MEDIUMTEXT;
    DECLARE line MEDIUMTEXT;
    DECLARE i INT DEFAULT 1;

SELECT SUBSTRING_INDEX(login, '-', 1) INTO rad_mac;
    SELECT SUBSTRING_INDEX(login, '-', -1) INTO rad_port;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(login, '-', 2), '-', -1) INTO rad_dev_mac;
    
    SELECT uid, oneconnect, onedevice INTO usr_id, usr_onecon, usr_onedev FROM mac_uid
WHERE (device_mac=rad_dev_mac AND device_mac<>'' AND onedevice>0)
OR (device_mac=rad_dev_mac AND device_mac<>'' AND device_port=rad_port
AND device_port<>'' AND oneconnect>0 AND onedevice=0)
OR (mac=rad_mac AND oneconnect=0 AND onedevice=0) LIMIT 1;

IF usr_id IS NOT NULL AND usr_id > 0 THEN
SELECT get_ip_by_tag(usr_id, tag) INTO usr_ip;
SELECT state INTO usr_state  FROM users WHERE id = usr_id;
SELECT radius_attr INTO add_attr FROM users_services
     WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;

UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;

IF usr_onecon > 0 OR usr_onedev > 0 THEN
            UPDATE mac_uid SET mac=NULL WHERE mac=rad_mac AND oneconnect=0 AND onedevice=0;
IF usr_onecon > 0 THEN
             UPDATE mac_uid SET mac=rad_mac WHERE device_mac=rad_dev_mac
AND device_port=rad_port AND oneconnect>0 AND onedevice=0;
END IF;
IF usr_onedev > 0 THEN
             UPDATE mac_uid SET mac=rad_mac, device_port=rad_port
WHERE device_mac=rad_dev_mac AND onedevice>0;
END IF;
        END IF;

IF usr_onecon = 0 AND usr_onedev = 0 THEN
UPDATE mac_uid SET device_mac=rad_dev_mac, device_port=rad_port
WHERE mac=rad_mac AND uid=usr_id AND oneconnect=0 AND onedevice=0;
END IF;

    ELSE

   UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-3600);
        UPDATE mac_uid SET mac=NULL WHERE mac=rad_mac AND (oneconnect>0 OR onedevice>0);

        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool WHERE uid=0
AND type='dynamic'
AND `release` < UNIX_TIMESTAMP()
AND tags LIKE CONCAT('%,', tag, ',%')
ORDER BY RAND() LIMIT 1 FOR UPDATE;

        INSERT INTO mac_uid VALUES(
            NULL, rad_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), rad_dev_mac, rad_port, 0, 0)
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0 AND device_mac=rad_dev_mac AND device_port=rad_port, ip, INET_ATON(usr_ip)),
uid=0, device_mac=rad_dev_mac, device_port=rad_port, time=UNIX_TIMESTAMP();
        COMMIT;

        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid
WHERE mac=rad_mac AND device_mac=rad_dev_mac AND device_port=rad_port;

    END IF;

    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';

    IF usr_id IS NOT NULL AND usr_id > 0 AND usr_state = 'on' AND add_attr IS NOT NULL
THEN
SELECT NULL, login, 'L4-Redirect', '1', '=';

    attr_loop: WHILE TRUE DO
   SELECT strSplit(add_attr, '\n', i) INTO line;
   IF LENGTH(line) = 0 OR i > 20 THEN LEAVE attr_loop; END IF;
   IF line LIKE '%+=%' THEN
       SELECT NULL,login,strSplit(line, '+=', 1),strSplit(line, '+=', 2),'+=';
   ELSEIF line LIKE '%=%' THEN
       SELECT NULL,login,strSplit(line, '=', 1),strSplit(line, '=', 2),'=';
   END IF;
   SET i = i + 1;
END WHILE;

ELSE
    SELECT NULL, login, 'L4-Redirect', '0', '=';
      SELECT NULL, login, 'Filter-Id', '1024', '=';
    END IF;

IF usr_id IS NOT NULL AND usr_id > 0 THEN
SELECT NULL, login, 'User-Id', usr_id, '=';
ELSE
SELECT NULL, login, 'User-Id', '0', '=';
END IF;
END$$
DELIMITER ;

Мой radupdate

Код:
DELIMITER $$
CREATE DEFINER=`nodeny`@`%` PROCEDURE `radupdate_ipoe`(IN `ipa` VARCHAR(16), IN `properties` VARCHAR(255))
BEGIN
CALL set_auth(ipa, CONCAT('mod=dhcp;',REPLACE(properties,':','')));
UPDATE mac_uid SET time=UNIX_TIMESTAMP() WHERE ip=INET_ATON(ipa) LIMIT 1;
END$$
DELIMITER ;


Название: Re: DHCP + Opt82 + Radius
Отправлено: NodenY45 от 13 Ноября 2019, 13:52:16

поделитесь своими радиус-процедурами для accel, radreply/radupdate_ipoe
Спасибо! :)

Код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `radreply`(IN login VARCHAR(64), IN r_id VARCHAR(64), IN c_id VARCHAR(64))
    DETERMINISTIC
BEGIN
DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE add_attr MEDIUMTEXT;
  DECLARE line MEDIUMTEXT;
  DECLARE i INT DEFAULT 1;
  DECLARE usr_mac VARCHAR(12);
  DECLARE c_ID_m  VARCHAR(12) DEFAULT NULL;
  DECLARE r_ID_m  VARCHAR(12) DEFAULT NULL;
 
 SELECT REPLACE(c_id,'0x', '') INTO c_ID_m;   
 SELECT REPLACE(r_id,'0x', '') INTO r_ID_m;
 
 
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT uid INTO usr_id FROM mac_uid WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''));
    SELECT radius_attr INTO add_attr FROM users_services WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;
   
    IF usr_id IS NOT NULL AND usr_id>0 THEN
   
    SELECT get_ip(usr_id) INTO usr_ip;
        UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
        UPDATE mac_uid SET mac=usr_mac, ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>''));
        SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
attr_loop:  WHILE TRUE DO
    SELECT strSplit(add_attr, '
', i) INTO line;
    IF LENGTH(line) = 0 OR i > 20 THEN LEAVE attr_loop; END IF;
    IF line LIKE '%+=%' THEN
        SELECT NULL,login,strSplit(line, '+=', 1),REPLACE (strSplit(line, '+=', 2),'\r',''),'+=';
    ELSEIF line LIKE '%=%' THEN
        SELECT NULL,login,strSplit(line, '=', 1),REPLACE (strSplit(line, '=', 2),'\r',''),'=';
    END IF;
    SET i = i + 1;
            END WHILE;
ELSE
        UPDATE mac_uid SET ip=0 WHERE uid=0 AND time<(UNIX_TIMESTAMP()-360);
        START TRANSACTION;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0
        AND type='dynamic'
        AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), r_ID_m,c_ID_m , 0, '')
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0,ip,INET_ATON(usr_ip)), time=UNIX_TIMESTAMP(),device_mac=r_ID_m, device_port=c_ID_m;
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;
SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
END IF;
END$$
DELIMITER ;

Код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `radupdate`(IN login VARCHAR(64), IN ipa VARCHAR(16), IN properties VARCHAR(255), IN ses VARCHAR(32), IN r_id VARCHAR(64), IN c_id VARCHAR(64), IN trafin BIGINT(20), IN trafout BIGINT(20))
    DETERMINISTIC
BEGIN
 DECLARE usr_id INT;
 DECLARE usr_mac VARCHAR(12) DEFAULT NULL;
 DECLARE c_ID_m  VARCHAR(12) DEFAULT NULL;
 DECLARE r_ID_m  VARCHAR(12) DEFAULT NULL;
 
 SELECT REPLACE(c_id,'0x', '') INTO c_ID_m;   
 SELECT REPLACE(r_id,'0x', '') INTO r_ID_m;

 
 SELECT REPLACE(login, ':', '') INTO usr_mac;
 SELECT uid INTO usr_id FROM `mac_uid` WHERE device_mac=r_ID_m AND device_port=c_ID_m AND (mac=usr_mac OR (oneconnect>0 AND device_mac<>'')) limit 1;   

 UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 300 WHERE ip = INET_ATON(ipa);

 IF( usr_id > 0 ) THEN
 
  CALL set_auth(ipa, CONCAT('mod=ipoe;',REPLACE(properties,':','')));
  INSERT INTO ses_traf SET ses_id=ses, traf_in=trafin, traf_out=trafout, time=UNIX_TIMESTAMP(), uid=usr_id;
 
 END IF;
END$$
DELIMITER ;
Ось десь так у мене працює, авторизує по маку ОЛТ та маку ОНУ, freeradius3, трафік через радіус також рахує

[/quote]

Спасибо, будем разбираться.
Подскажите, еще, какие радиус атрибуты вы передаете?

Я планирую, передавать гостевой сервис, с редиректом на заглушку, и через модуль CoA активировать следующий сервис с тарифом.
В верную сторону смотрю?


Название: Re: DHCP + Opt82 + Radius
Отправлено: skreep от 13 Ноября 2019, 14:16:40

Спасибо, будем разбираться.
Подскажите, еще, какие радиус атрибуты вы передаете?

Я планирую, передавать гостевой сервис, с редиректом на заглушку, и через модуль CoA активировать следующий сервис с тарифом.
В верную сторону смотрю?
[/quote]

Код:
/etc/freeradius/3.0/mods-available# cat sql
sql {
    driver = "rlm_sql_mysql"
    mysql {
        warnings = auto
    }
    server = "localhost"
    port = 3306
    login = "nodeny"
    password = "hardpass"
    radius_db = "nodeny"

    authorize_check_query = "call radcheck('%{User-Name}')"
    authorize_reply_query = "call radreply('%{User-Name}','%{DHCP-Agent-Remote-Id}','%{DHCP-Agent-Circuit-Id}')" ####, '%{User-Password}')"

    accounting {
        reference = "%{tolower:type.%{Acct-Status-Type}.query}"
        type {
            start {
                query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                        'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}','%{Acct-Session-Id}',\
                '%{DHCP-Agent-Remote-Id}','%{DHCP-Agent-Circuit-Id}',\
                (%{%{Acct-Input-Gigawords}:-0} * POWER(2, 32)) + %{%{Acct-Input-Octets}:-0},\
                (%{%{Acct-Output-Gigawords}:-0} * POWER(2, 32)) + %{%{Acct-Output-Octets}:-0})"
            }
            interim-update {
                query = "${..start.query}"
            }
            stop {
                query = "call radstop('%{User-Name}')"
            }
        }
    }

    post-auth {
                query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                        'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}','%{Acct-Session-Id}',\
                '%{DHCP-Agent-Remote-Id}','%{DHCP-Agent-Circuit-Id}',\
                (%{%{Acct-Input-Gigawords}:-0} * POWER(2, 32)) + %{%{Acct-Input-Octets}:-0},\
                (%{%{Acct-Output-Gigawords}:-0} * POWER(2, 32)) + %{%{Acct-Output-Octets}:-0})"
    }
}


Код:
[ipoe]
verbose=1
level=5

username=lua:username
password=ipoe
unit-cache=0
lua-file=/etc/accel-ppp.lua
lease-time=120 #120   #60
renew-time=90  #30
max-lease-time=600  #90
attr-dhcp-client-ip=Framed-IP-Address
gw-ip-address=10.111.0.1/20
#### guest ip network
#gw-ip-address=172.16.0.1/20
### redirect
attr-l4-redirect=L4-Redirect
attr-l4-redirect-ipset=L4-Redirect-ipset
#attr-l4-redirect-table=L4-Redirect-table
#l4-redirect-ipset=l4
#L4-Redirect-table=4051
####
proxy-arp=1
shared=1
ifcfg=1
mode=L2
start=dhcpv4
interface=re:ens160
vlan-mon=re:ens160,4080
vlan-timeout=60
vlan-name=%I.%N
#agent-remote-id=accel-ppp
attr-dhcp-opt82=DHCP-Option82
attr-dhcp-opt82-remote-id=DHCP-Agent-Remote-Id
attr-dhcp-opt82-circuit-id=DHCP-Agent-Circuit-Id

Я роблю таким чином, всі по замовчуванню заблоковані, відразу іх завертає на заглушку, потім спрацьовує модуль СОА і робить все так як вказано в обліковому запису. як на мене так менше мороки.
Модуль СОА запускається таким чином
/usr/bin/perl /usr/local/nodeny/noserver.pl -a -i -g=coa.cfg.pm -d &

В цьому позитивно, якщо втрачається зв'язок з радіусом то клієнти працюють і не відвалюються, і якщо зв'язок відновлено то відновлюється авторизація, і ніби не виникає момент що сесії на брасі є а в білінгу нема.

ось десь так воно робить. Авторизує по маку ону та маку олт


Название: Re: DHCP + Opt82 + Radius
Отправлено: serg от 27 Ноября 2022, 07:26:28
Всем доброго времени суток!

Может кто ни будь может поделится процедурами (radcheck, radreply, radupdate), задача такая:
Mikrotik + DHCP + Radius + Option82
Использую BDCOM 3310, BDCOM 3608

Да высше есть процедуры, я пробовал их но не смог решить свою задачу.

Хочу авторизовать абонов по мак ону и мак абона, также зглушка
Сейчас у меня все на одном сервере, на данный момент использую make_conf, подключаю нового абона, получает dhcp, идем на заглшка и регим по логину и паролю нового абона, меняю в подключение ip статический и таким оброзом привязываю абона по опции82.

Можно попросить еще поделится конфигами радиуса и настройками Mikrotik.