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

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: 1 [2] 3 4 ... 16
  Печать  
Автор Тема: Микротик  (Прочитано 69390 раз)
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #15 : 26 Ноября 2015, 18:04:34 »

А как реализовано если много вланов на микротике должно быть?
Есть в районе коммутатор. Для NASа хотим поставить микротик.
Но щас реализовано просто VLAN на группу пользователей каждый влан свой пул адресов в бд.
Я запустил на виртуалке микротик и сервер, настроил, но он выбирает ИПы из другого пула адресов.
1. Как заставить микротик выдавать для конкретного влана конкретный пул адресов из базы?
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4794



Просмотр профиля
« Ответ #16 : 26 Ноября 2015, 18:50:18 »

Как раз недавно такое настроил одной сети. При этом были внесены небольшие изменения:

1) в таблице mac_uid поле mac было увеличено до 16 символов - перед маком сохраняется номер вилана.
2) файл радиуса /usr/local/etc/raddb/sql.conf:

Код:

        authorize_check_query = "call radcheck('%{User-Name}')"                       
        authorize_reply_query = "call radreply('%{User-Name}', '%{Called-Station-Id}')"
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\
                '%{Called-Station-Id}', 'nas=%{NAS-IP-Address}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                '%{Called-Station-Id}', 'nas=%{NAS-IP-Address}')"}
микротик в параметре Called-Station-Id присылает имя ... эээ... короче, на каждом вилане настроен dhcp с именем dhcp_номерvlan. Запросы с этого вилана будут идти на радиус, например, так: Called-Station-Id = dhcp_15. Здесь 15 - номер vlan

3) в mysql процедурах я сделал "отрезание" префикса dhcp_ (обратите внимание, что это имя прописано жестко в процедурах) и по оставшемуся числу берем подсетку. Например, для 15 получим  10.0.15.xx

Сами процедуры:

Код:
alter table mac_uid change mac `mac` varchar(16) DEFAULT NULL;

DROP FUNCTION IF EXISTS `get_ip_w_net`;
DELIMITER $$
CREATE FUNCTION `get_ip_w_net` (user_id INTEGER UNSIGNED, net INTEGER UNSIGNED)
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15);

    SELECT net * 256 INTO net;

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

    UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 300
    WHERE id = (SELECT id FROM (
        (SELECT id, uid FROM ip_pool
        WHERE uid = 0
            AND type = 'dynamic'
            AND realip = IF(real_ip>0,1,0)
            AND ip >= (INET_ATON('10.0.0.0') + net)
            AND ip <= (INET_ATON('10.0.0.255') + net)
        LIMIT 1)
            UNION
        (SELECT id, uid FROM ip_pool
        WHERE uid = user_id
            AND type = 'dynamic'
            AND realip = IF(real_ip>0,1,0)
            AND ip >= (INET_ATON('10.0.0.0') + net)
            AND ip <= (INET_ATON('10.0.0.255') + net)
        LIMIT 1)
    ) AS tbl ORDER BY uid DESC LIMIT 1);

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id
        AND ip >= (INET_ATON('10.0.0.0') + net)
        AND ip <= (INET_ATON('10.0.0.255') + net)
        LIMIT 1;
    RETURN user_ip;
END$$
DELIMITER ;

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


DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64), IN net VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(16);
    DECLARE usr_ip VARCHAR(15);
    DECLARE usr_id INT;
    DECLARE usr_state VARCHAR(10);
    DECLARE add_attr MEDIUMTEXT;
    DECLARE line MEDIUMTEXT;
    DECLARE i INT DEFAULT 1;

    SELECT REPLACE(net, 'dhcp_', '') INTO net;
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT CONCAT(net, usr_mac) INTO usr_mac;
    SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac;
    IF usr_id IS NOT NULL AND usr_id>0 THEN
        SELECT get_ip_w_net(usr_id, net) 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 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)
            AND ip >= (INET_ATON('10.0.0.0') + net*256)
            AND ip <= (INET_ATON('10.0.0.255') + net*256)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), 0, 0, 0)
        ON DUPLICATE KEY
            UPDATE ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP();
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;
    END IF;

    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, 'Session-Timeout', '900', '=';

    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 ;


DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(
    IN login VARCHAR(64), IN ipa VARCHAR(16), IN net VARCHAR(64), IN properties VARCHAR(255))
BEGIN
    DECLARE usr_mac VARCHAR(16);
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT REPLACE(net, 'dhcp_', '') INTO net;
    CALL set_auth(ipa, CONCAT('mod=dhcp;vlan=', net, ';user=', usr_mac, ';', REPLACE(properties,':','')));
    UPDATE mac_uid SET time=UNIX_TIMESTAMP() WHERE ip=INET_ATON(ipa) LIMIT 1;
END$$
DELIMITER ;

Если у вас пул не 10.0.xx.xx, то меняйте INET_ATON('10.0.0.0') + net на, например INET_ATON('192.168.0.0') + net и т.д

P.S. Рекомендую ознакомиться http://nodeny.com.ua:8080/wiki/index.php/%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D1%82%D0%B8%D0%BA
P.P.S. В процедурах добавлен код из модуля радиус атрибутов - если вам не нужна скорость по радиусу - удалите от attr_loop до END WHILE
« Последнее редактирование: 18 Января 2016, 20:01:53 от Efendy » Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #17 : 26 Ноября 2015, 19:01:57 »

Ага, тогда докуплю еще модуль радиус атрибуты.
Сегодня только купил модуль микротика, вдумчиво читаю пробую.
Спасибо за помощь.
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4794



Просмотр профиля
« Ответ #18 : 26 Ноября 2015, 19:11:30 »

Ты сначала настрой без виланов, а то радиус атрибуты + виланы сразу будет сложнова-то отладить
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #19 : 26 Ноября 2015, 19:15:14 »

Ты сначала настрой без виланов, а то радиус атрибуты + виланы сразу будет сложнова-то отладить
так и сделаю
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #20 : 27 Ноября 2015, 11:38:24 »

Пробую добиться результата по влану но вот такая ошибка если процедура
Цитировать
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64), IN net VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(16);
    DECLARE usr_ip VARCHAR(15);
    DECLARE usr_id INT;
    DECLARE usr_state VARCHAR(10);
    DECLARE add_attr MEDIUMTEXT;
    DECLARE line MEDIUMTEXT;
    DECLARE i INT DEFAULT 1;

    SELECT REPLACE(net, 'dhcp_', '') INTO net;
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT CONCAT(net, usr_mac) INTO usr_mac;
    SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac;
    IF usr_id IS NOT NULL AND usr_id>0 THEN
        SELECT get_ip_w_net(usr_id, net) 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 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)
            AND ip >= (INET_ATON('10.0.0.0') + net*256)
            AND ip <= (INET_ATON('10.0.0.255') + net*256)
            ORDER BY RAND() LIMIT 1 FOR UPDATE;
        INSERT INTO mac_uid VALUES(
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), 0, 0, 0)
        ON DUPLICATE KEY
            UPDATE ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP();
        COMMIT;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;
    END IF;

    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, 'Session-Timeout', '900', '=';
END$$
DELIMITER ;
Цитировать
CALL radreply('00:11:22:33:44:55');
ERROR 1318 (42000): Incorrect number of arguments for PROCEDURE nodeny_test1.radreply; expected 2, got 1
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4794



Просмотр профиля
« Ответ #21 : 27 Ноября 2015, 12:07:53 »

Я с вас удивляюсь. Ты поставил задачу выдать свою сеть в каждом вилане. Почему ты не указал вилан?

Код:
CALL radreply('00:11:22:33:44:55', 'dhcp_1');
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #22 : 27 Ноября 2015, 17:43:28 »

Выдало ип абоненту если
правильно ли так?
/usr/local/etc/raddb/sql.conf
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}')"
колед стейшн ид
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}', '%{Called-Station-Id}')"
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #23 : 27 Ноября 2015, 19:47:59 »

Выдало ип абоненту если
правильно ли так?
/usr/local/etc/raddb/sql.conf
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}')"
колед стейшн ид
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}', '%{Called-Station-Id}')"
да ето не верно, я просто методом тыка
ип клиент получает из базы, но авторизация уже в билинге не показывается
помогите пожалуйста)
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #24 : 28 Ноября 2015, 16:24:28 »

Выдало ип абоненту если
правильно ли так?
/usr/local/etc/raddb/sql.conf
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}')"
колед стейшн ид
Цитировать
       authorize_reply_query = "call radreply('%{User-Name}', '%{Called-Station-Id}')"
да ето не верно, я просто методом тыка
ип клиент получает из базы, но авторизация уже в билинге не показывается
помогите пожалуйста)
Все получилось, я просто не внимательно первый пункт прочитал где:
Цитировать
1) в таблице mac_uid поле mac было увеличено до 16 символов - перед маком сохраняется номер вилана.
поставил номер вилана и все заработало.
Записан
k291
Старожил
****

Карма: -10
Offline Offline

Сообщений: 454


Просмотр профиля
« Ответ #25 : 27 Марта 2016, 19:34:14 »

В Н+ ктото решил проблему с ping`ом из билинга на клиента за Mikrotik`ом?
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #26 : 28 Марта 2016, 08:11:47 »

В Н+ ктото решил проблему с ping`ом из билинга на клиента за Mikrotik`ом?
route add сеть_клиента/маска ip мікротіка
Записан
shadowxxx
Пользователь
**

Карма: 1
Offline Offline

Сообщений: 38


Просмотр профиля Email
« Ответ #27 : 18 Апреля 2016, 12:09:21 »

Возникла проблема! Кто ее реши - поделитесь. или может подскажите как разрулить нагрузку по процам.
/usr/bin/perl /usr/local/nodeny/noserver.pl -g=_mikrotik1.cfg.pm -d   
этот модуль грузит одно из ядер на 100 процентов (от 70-100) и это не зависит от времени суток. Кто как решил. ?
Записан
shadowxxx
Пользователь
**

Карма: 1
Offline Offline

Сообщений: 38


Просмотр профиля Email
« Ответ #28 : 18 Апреля 2016, 16:16:57 »

Если можно. Подскажите как доделалть модуль микротика, так что бы перл мог работать или по всем ядрам или хотябы б указывать количество ядер. потому что ядро 2.16 гигагерц забить это жестоко и не двигаться дальше. ну поставлю я 3.2 гигагерца, а дальше куда?
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1231

In LAN we trust!

358714596
Просмотр профиля
« Ответ #29 : 19 Апреля 2016, 11:50:17 »

А что за процессор?
Записан
Страниц: 1 [2] 3 4 ... 16
  Печать  
 
Перейти в:  

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