Биллинговая система Nodeny
23 Ноября 2024, 13:47:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: 1 [2]
  Печать  
Автор Тема: FAQ. Несколько ip на PPPoE  (Прочитано 13942 раз)
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #15 : 05 Февраля 2017, 17:19:24 »

Просмотрев данную тему, т.к. необходимо осуществить сабж, столкнулся с некоторыми проблемами, но всё таки довел до ума!

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

Я выкладываю рабочие процедуры, в которых уже нет этой проблемы, то есть работают логины типа:
test         абон получит 1ый ип
test+0     абон получит 1ый ип
test+1     абон получит 2ой ип если у него их 2, если только 1 то 1ий (и по аналогии 2,3,4 и т.д.)
test+N     абон получит N-1 ип если у него их N

и так, процедуры:

Код:
DROP FUNCTION IF EXISTS `get_ip_by_num`;
DELIMITER $$
CREATE FUNCTION `get_ip_by_num` ( user_id INTEGER UNSIGNED, num INTEGER)  
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15);
    
    IF( num IS NULL ) THEN SET num=0; END IF;
    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type='static' ORDER BY ip LIMIT num, 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type='static' ORDER BY ip 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,%';
    UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 300
        WHERE (uid = 0 OR uid = user_id)
            AND type = 'dynamic'
            AND realip = IF(real_ip>0,1,0)
        ORDER BY uid DESC, id ASC LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id LIMIT 1;
    RETURN user_ip;
END$$
DELIMITER ;

Не забудьте в процедуре radcheck изменить hardpass на свой ключ шифрования паролей из файла nodeny/sat.cfg

Код:
DROP PROCEDURE IF EXISTS `radcheck`;
DELIMITER $$
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64))
BEGIN
  DECLARE real_login VARCHAR(64) DEFAULT NULL;
  SELECT SUBSTRING_INDEX(login, '=2B', 1) INTO real_login;
  SELECT id, name, 'Password' AS Attribute, AES_DECRYPT(passwd,'hardpass') AS Value,'=='
  FROM users WHERE name=real_login;
END$$
DELIMITER ;

Код:
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
  DECLARE usr_id INT;
  DECLARE ip_index INT ;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE real_login VARCHAR(64) DEFAULT NULL;

  SELECT SUBSTRING_INDEX(login, '=2B', 1) INTO real_login;
  
  IF login REGEXP '[=2B][0-9]+$' THEN
   SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index;
  ELSE SET ip_index=0;END IF;
  
  SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1;
  SELECT get_ip_by_num(usr_id, ip_index) 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 ;

Код:
DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(IN `login` VARCHAR(64), IN `ip` VARCHAR(16), IN `properties` VARCHAR(255))
BEGIN
  DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  DECLARE real_login VARCHAR(64) DEFAULT NULL;
  DECLARE ip_index INT ;
  
  SELECT SUBSTRING_INDEX(login, '=2B', 1) INTO real_login;
  IF login REGEXP '[=2B][0-9]+$' THEN
   SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index;
  ELSE SET ip_index=0;END IF;
 
  SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1;
  SELECT get_ip_by_num(usr_id, ip_index) INTO usr_ip;
  CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':','')));
END$$
DELIMITER ;

кто подскажет, зачем нужен в процедуре radupdate на входе вторым параметром IN `ip` VARCHAR(16), он нигде в ней не используется

Код:
DROP PROCEDURE IF EXISTS `radstop`;
DELIMITER $$
CREATE PROCEDURE `radstop`(IN login VARCHAR(64))
BEGIN
  DECLARE usr_id INT;
  DECLARE ip_index INT ;
  DECLARE real_login VARCHAR(64) DEFAULT NULL;

  SELECT SUBSTRING_INDEX(login, '=2B', 1) INTO real_login;
  
  IF login REGEXP '[=2B][0-9]+$' THEN
   SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index;
  ELSE SET ip_index=0;END IF;
 
  SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1;
  DELETE FROM auth_now WHERE ip = get_ip_by_num(usr_id, ip_index) LIMIT 1;
END$$
DELIMITER ;

Предлагаю все эти процедуры добавить в коробку, так же процедура get_ip_by_num может полностью заменить процедуру get_ip

принимаю СПАСИБКИ в Карму

to be continued...
Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #16 : 05 Февраля 2017, 17:55:38 »

...продолжение

Во-вторых при тестировании всего этого в freeradius-2.2.9 при radiusd -X и radtest .. было замечено:
Код:
Found Auth-Type = PAP
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!    Replacing User-Password in config items with Cleartext-Password.     !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Please update your configuration so that the "known good"               !!!
!!! clear text password is in Cleartext-Password, and not in User-Password. !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


то есть оно просит в процедуре radcheck заменить это
Код:
 SELECT id, name, 'Password' AS Attribute,

на ето
Код:
 SELECT id, name, 'Cleartext-Password' AS Attribute,


Но В Н И М А Н И  Е ! ! !

ЭТОГО ДЕЛАТЬ НЕ НАДО! ! !
в freeradius-2.x.x работает по старому, а по новому нужно еще кучу настроек радиуса перековыривать

но по старому точно не будет работать в  freeradius-3.x.xтолько по новому

Т.к. freeradius-2.x.x больше обновляться не будет, и последняя стабильная версия  freeradius-2.2.9,

я уже себе на виртуалке для теста настроил  freeradius-3.0.12, но это труднее чем 2.x.x,
поэтому инструкцию пока не выкладываю (не готова)
Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
kostya_zpr
Пользователь
**

Карма: 1
Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #17 : 18 Мая 2017, 13:40:20 »

В такой реализации, как приведена в этой ветке, очень смущает строчка "WHERE uid = user_id AND type='static' ORDER BY ip "
То есть если добавить еще один адрес, меньший, чем последний, то все привязки поплывут
Никаких других механизмов фиксации ip по передаваемому логину не придумали?

Для нас тема очень актуальна, т.к. в N50.32 существует куча "корпоративных" абонентов, с индивидуальными логинами на общем счёте и не можем их нормально перенести

Насчет RADIUS - я у себя сделал так
Код:
/* For RADIUS 1.X */
DROP PROCEDURE IF EXISTS `radcheck`;

DELIMITER $$
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64))
BEGIN
  SELECT id,name,'Password' AS Attribute,AES_DECRYPT(passwd,'XXXXXX') AS Value,'=='
  FROM users WHERE name=login;
  END$$
DELIMITER ;

/* For RADIUS 2.X */
DROP PROCEDURE IF EXISTS `radcheck2`;

DELIMITER $$
CREATE PROCEDURE `radcheck2` (IN login VARCHAR(64))
BEGIN
  SELECT id,name,'Cleartext-Password' AS Attribute,AES_DECRYPT(passwd,'XXXXXX') AS Value,':='
  FROM users WHERE name=login;
  END$$
DELIMITER ;
Для второго Радиуса нужно указывать не '==', а ':=', ну и как было указано выше, 'Cleartext-Password' вместо 'Password'
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #18 : 20 Мая 2017, 07:57:16 »

Могу написать модуль, 50 у.е цена устраивает?
Записан
kostya_zpr
Пользователь
**

Карма: 1
Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #19 : 20 Мая 2017, 08:15:10 »

Пока сам попробую мозги поразмять Улыбающийся

Но из ответа следует:
1) данная фича еще не реализована, это не я плохо искал функционал
2) все реализуемо

Будут сложности - обращусь
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #20 : 20 Мая 2017, 11:47:01 »

https://youtu.be/A2yx5TcQzpQ

60 у.е
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!