Radius атрибуты: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Немає опису редагування
мНемає опису редагування
 
(Не показано 8 проміжних версій цього користувача)
Рядок 15: Рядок 15:
ERX-Primary-Dns = 8.8.8.8
ERX-Primary-Dns = 8.8.8.8
</pre>
</pre>
В mysql необходимо выполнить
В mysql необходимо создать следующую функцию:


<pre>
<pre>
DROP FUNCTION strSplit;
DROP FUNCTION strSplit;
CREATE FUNCTION strSplit(x MEDIUMTEXT, delim MEDIUMTEXT, pos int) RETURNS MEDIUMTEXT
CREATE FUNCTION strSplit(x MEDIUMTEXT, delim MEDIUMTEXT, pos int) RETURNS MEDIUMTEXT DETERMINISTIC
RETURN  
RETURN  
     TRIM(BOTH '\r' FROM TRIM(
     TRIM(BOTH '\r' FROM TRIM(
    REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1), delim, '')
      REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1), delim, '')
     ));
     ));
</pre>
</pre>


'''Для Freeradius версии 2:'''
А в процедуру radreply добавить:
 
<pre>
<pre>
DROP PROCEDURE IF EXISTS `radreply`;
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
CREATE PROCEDURE `radreply`(IN .... )
BEGIN
BEGIN
   DECLARE usr_id INT;
   ...
   DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
   ...
   DECLARE add_attr MEDIUMTEXT;
   DECLARE add_attr MEDIUMTEXT;
   DECLARE line MEDIUMTEXT;
   DECLARE line MEDIUMTEXT;
   DECLARE i INT DEFAULT 1;
   DECLARE i INT DEFAULT 1;


   SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
   ...
   SELECT get_ip(usr_id) INTO usr_ip;
   ...
  ...
 
   SELECT radius_attr INTO add_attr FROM users_services
   SELECT radius_attr INTO add_attr FROM users_services
     WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;
     WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;
  SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';
  SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';
  SELECT NULL,login,'Framed-Protocol','PPP','=';


   attr_loop: WHILE TRUE DO
   attr_loop: WHILE TRUE DO
Рядок 61: Рядок 60:
</pre>
</pre>


'''Для Freeradius версии 3:'''
 
Проверяем в консоли mysql:
 
<pre>
call radreply(параметры);
</pre>
 
==Не забывайте==
Чтобы изменения отразились на уже подключенной услуге, вы должны переподключить услугу для абонента (завершить и подключить снова)
 
=Новое=
 
<pre>
DROP PROCEDURE IF EXISTS `rad_attr`;
DELIMITER $$
CREATE PROCEDURE `rad_attr`(IN login VARCHAR(64), IN state VARCHAR(3), IN add_attr MEDIUMTEXT)
BEGIN
  DECLARE line MEDIUMTEXT;
  DECLARE i INT DEFAULT 1;
 
  IF add_attr LIKE '%###%' THEN
      SELECT strSplit(add_attr, '###', IF(state='on', 1, 2)) INTO add_attr;
  END IF;
 
  attr_loop: WHILE TRUE DO
    SELECT strSplit(add_attr, '\n', i) INTO line;
    SET i = i + 1;
    IF i > 20 THEN LEAVE attr_loop; END IF;
    IF LENGTH(line) = 0 THEN ITERATE 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;
  END WHILE;
END$$
DELIMITER ;
</pre>
 
 
<pre>
<pre>
DROP PROCEDURE IF EXISTS `radreply`;
DROP PROCEDURE IF EXISTS `radreply`;
Рядок 67: Рядок 105:
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
BEGIN
    DECLARE usr_id INT;
  DECLARE usr_id INT;
    DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE usr_state VARCHAR(3);
    DECLARE add_attr MEDIUMTEXT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
    DECLARE line MEDIUMTEXT;
  DECLARE add_attr MEDIUMTEXT;
    DECLARE i INT DEFAULT 1;


    SELECT id INTO usr_id FROM users WHERE name=login AND password=AES_DECRYPT(passwd, 'hardpass') LIMIT 1;
  SELECT id,  state INTO usr_id, usr_state FROM users WHERE name=login LIMIT 1;
    IF( usr_id IS NOT NULL ) THEN
  SELECT get_ip(usr_id) INTO usr_ip;
        SELECT get_ip(usr_id) INTO usr_ip;
  SELECT radius_attr INTO add_attr FROM users_services
        SELECT radius_attr INTO add_attr FROM users_services
    WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;
          WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;


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


        attr_loop: WHILE TRUE DO
  CALL rad_attr(login, usr_state, add_attr);
          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;
    END IF;
END$$
END$$
DELIMITER ;
DELIMITER ;
</pre>
</pre>


Проверяем в консоли mysql
Если в блоке с радиус-атрибутами будут идти подряд 3 символа # - это будет означать, что до этих символов будут применены атрибуты если учетная запись в незаблокированном состоянии, а после - если в заблокированном. Например:


<pre>
<pre>
call radreply('Test1');
attr1=val1
attr2=val2
###
attr1=val3
attr8=val4
</pre>
</pre>
Где Test1 логин абонента.

Поточна версія на 07:03, 29 червня 2023

Модуль позволяет добавлять произвольные атрибуты в radreply пакет radius-сервера в зависимости от тарифа абонента. Это может быть альтернативой скрипту noserver, который управляет фаерволом или скоростями на mikrotik. В этом случае правила скорости (либо иные другие) будет устанавливать сам сервер PPPoE или DHCP. Например, необходимо чтобы radius отдавал следующее:

    Service-Type = Framed-User
    Framed-Protocol = PPP
    Framed-IP-Address = 192.168.100.5
    Framed-IP-Netmask = 255.255.255.255
    ERX-Service-Activate:1+= "pppoe_local(10m,10m,15m,15m)"
    ERX-Primary-Dns = 8.8.8.8

Здесь атрибут ERX-Service-Activate устанавливает скорость абоненту по разным направлениям.

После установки модуля, в безлимитных услугах появится параметр Radius, в который следует вписать дополнительные radius-атрибуты по-одному на каждую строку, например:

ERX-Service-Activate:1+= "pppoe_local(10m,10m,15m,15m)"
ERX-Primary-Dns = 8.8.8.8

В mysql необходимо создать следующую функцию:

DROP FUNCTION strSplit;
CREATE FUNCTION strSplit(x MEDIUMTEXT, delim MEDIUMTEXT, pos int) RETURNS MEDIUMTEXT DETERMINISTIC
RETURN 
    TRIM(BOTH '\r' FROM TRIM(
       REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1), delim, '')
    ));

А в процедуру radreply добавить:

DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN .... )
BEGIN
  ...
  ...
  DECLARE add_attr MEDIUMTEXT;
  DECLARE line MEDIUMTEXT;
  DECLARE i INT DEFAULT 1;

  ...
  ...
  ...

  SELECT radius_attr INTO add_attr FROM users_services
    WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 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;
END$$
DELIMITER ;


Проверяем в консоли mysql:

call radreply(параметры);

Не забывайте

Чтобы изменения отразились на уже подключенной услуге, вы должны переподключить услугу для абонента (завершить и подключить снова)

Новое

DROP PROCEDURE IF EXISTS `rad_attr`;
DELIMITER $$
CREATE PROCEDURE `rad_attr`(IN login VARCHAR(64), IN state VARCHAR(3), IN add_attr MEDIUMTEXT)
BEGIN
  DECLARE line MEDIUMTEXT;
  DECLARE i INT DEFAULT 1;

  IF add_attr LIKE '%###%' THEN
      SELECT strSplit(add_attr, '###', IF(state='on', 1, 2)) INTO add_attr;
  END IF;

  attr_loop: WHILE TRUE DO
    SELECT strSplit(add_attr, '\n', i) INTO line;
    SET i = i + 1;
    IF i > 20 THEN LEAVE attr_loop; END IF;
    IF LENGTH(line) = 0 THEN ITERATE 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;
  END WHILE;
END$$
DELIMITER ;


DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
  DECLARE usr_id INT;
  DECLARE usr_state VARCHAR(3);
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE add_attr MEDIUMTEXT;

  SELECT id,  state INTO usr_id, usr_state FROM users WHERE name=login LIMIT 1;
  SELECT get_ip(usr_id) INTO usr_ip;
  SELECT radius_attr INTO add_attr FROM users_services
    WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1;

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

  CALL rad_attr(login, usr_state, add_attr);
END$$
DELIMITER ;

Если в блоке с радиус-атрибутами будут идти подряд 3 символа # - это будет означать, что до этих символов будут применены атрибуты если учетная запись в незаблокированном состоянии, а после - если в заблокированном. Например:

attr1=val1
attr2=val2
###
attr1=val3
attr8=val4