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

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

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« : 29 Сентября 2017, 00:35:43 »

Сегодня ночью решил посмотреть что там у вас не получается с freeradius-ом версии 3.

По шагам, что я сделал:

  • sql.conf из поставки биллинга нам не нужен. копируем только clients.conf
  • грохаем все в папке /usr/local/etc/raddb/sites-enabled/ - у меня там было 2 файла: inner-tunnel и default
  • в этой же папке создаем файлик nodeny с таким содержимым:
Код:
server default {
    listen {
        type = auth
        ipaddr = *
        port = 1812
    }
    authorize {
            sql
            chap
            pap
    }
    authenticate {
            Auth-Type PAP {
                pap
            }
    }
    preacct {
            acct_unique
            preprocess
    }
    accounting {
            sql
            exec
    }
    session {
            radutmp
            sql
    }
    post-auth {
            sql
    }
    Post-Auth-Type REJECT {
            sql
    }
}

В папке /usr/local/etc/raddb/mods-enabled/ создаем файл sql:
Код:
# -*- text -*-

sql {
driver = "rlm_sql_mysql"
mysql {
warnings = auto
}
dialect = "sqlite"

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}')"
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\
                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
}

mysql-процедуры надо слегка подправить: Password заменить на Cleartext-Password, == заменить на :=
Код:
DROP PROCEDURE IF EXISTS `radcheck`;
DELIMITER $$
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64))
BEGIN
  SELECT id,name,'Cleartext-Password' AS Attribute,AES_DECRYPT(passwd,'hardpass') AS Value,':='
    FROM users WHERE name=login;
END$$
DELIMITER ;
    Обратите внимание, что у вас могут отличаться процедуры ибо они слегка разные для pppoe, dhcp + различные фичи в них вставляли

    При тестировании радиус ругался на eap, поэтому я вообще грохнул файл /usr/local/etc/raddb/mods-enabled/eap
« Последнее редактирование: 24 Января 2018, 00:26:56 от Efendy » Записан
Tooreagen
Старожил
****

Карма: -7
Offline Offline

Сообщений: 257


Просмотр профиля Email
« Ответ #1 : 29 Сентября 2017, 18:15:21 »

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

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #2 : 30 Сентября 2017, 09:25:51 »

Я специально сюда написал, чтобы протестировали, а потому уже в документацию
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #3 : 07 Октября 2017, 18:50:05 »

не работает ( в любом случае выдает реджект (

Код:
(0) ERROR: No Auth-Type found: rejecting the user via Post-Auth-Type = Reject

Процедуры выполняются правильно и ип находит как положено. Но выдает все равно реждект.
« Последнее редактирование: 07 Октября 2017, 19:44:14 от Cell » Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #4 : 08 Октября 2017, 10:11:30 »

В общем эта нездоровая хрень под названием фрирадиус3 имеет свой прибабах ))) не понимает он пустые пароли и считает что пароль не передан. После долгого траха на тему юзанья этого дела для DHCP конфиг был изменен вот так, чтобы всегда был ответ в виде ACСEPT т.к нам выдает или свой ип либо динамический. Т.е. в любом случае ответ положительный.
Код:
server default {
    listen {
        type = auth
        ipaddr = *
        port = 1812
    }
    authorize {
            sql
             update control {
                             Auth-Type := "Accept"
                            }
    }
authenticate {
            Auth-Type PAP {
                pap
            }
          }
    preacct {
            acct_unique
            preprocess
    }
accounting {
            detail
            sql
            exec
    }
   session {
            radutmp
            sql
    }
  post-auth {
            sql
            }
 Post-Auth-Type REJECT {
            sql
    }
}
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #5 : 08 Октября 2017, 13:57:02 »

Т.е. все работает и можно добавить в документацию? Файл (ссылку) /usr/local/etc/raddb/mods-enabled/eap пришлось удалить или итак работает?
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #6 : 08 Октября 2017, 17:13:44 »

Т.е. все работает и можно добавить в документацию? Файл (ссылку) /usr/local/etc/raddb/mods-enabled/eap пришлось удалить или итак работает?
Да, это симлинк, его нужно удалять. У меня с вышеуказанными изменениями в режиме RADIUS+DHCP(Mikrotik) работает на ура
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #7 : 08 Октября 2017, 19:35:01 »

если кому пригодиться, аля используют вместе с dhcp паралельно pppoe авторизации то лучше делать проверку хотя бы по нас-иденти и для микротиков или иных по dhcp обнулять пароль
Цитировать
authorize {
            if (NAS-Identifier == accel-nas-3) {
                                    update request {
                                                User-Password = ""
                                                }
                                     sql
                                    }
                    }
            else {
                                    sql
                                }

}
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1227

In LAN we trust!

358714596
Просмотр профиля
« Ответ #8 : 08 Октября 2017, 21:25:57 »

если кому пригодиться, аля используют вместе с dhcp паралельно pppoe авторизации то лучше делать проверку хотя бы по нас-иденти и для микротиков или иных по dhcp обнулять пароль
Зачем?
Записан
Pa4ka
Старожил
****

Карма: 4
Offline Offline

Сообщений: 281

591884591
Просмотр профиля Email
« Ответ #9 : 09 Октября 2017, 11:52:45 »

если кому пригодиться, аля используют вместе с dhcp паралельно pppoe авторизации то лучше делать проверку хотя бы по нас-иденти и для микротиков или иных по dhcp обнулять пароль
Зачем?
да и действительно, лучше бы ничего я и не писал на виходных)
просто была у меня беда с пустыми паролями вот вспомнил, думал будет лучше а оказалось как всегда))

Кстати затестил freeradius 3(на чистую), добавил еще секцию аккаунтинг, иначе у меня почему то не слушался аккаунтинг порт 1813
Цитировать
listen {
        type = acct
        ipaddr = *
        port = 1813
    }
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #10 : 14 Октября 2017, 18:39:44 »

Кстати, аккаунтинг у вас заработал? Фишка в том, что по логам радиуса запросы идут, но процедура rudupdate не запускается. Поковырял я и у меня вот что вышло:

Код:
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}')"
        accounting {
            query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                    'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
            type {
                start {
                    query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                            'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
                }
            }
        }
        post-auth {
        query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\
                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
        }
}

Здесь как бы 3 одинаковых запроса. По идее post-auth и start выполнятся в одно время, но я помню в radius-е 2й версии аккаунтинг не сразу начинался, а через период аккаунтинга, поэтому там я заюзал post-auth - он запускается сразу после успешной авторизации. В общем, для подстраховки лучше оставить и post-auth и start
Записан
sedo26
Постоялец
***

Карма: 0
Offline Offline

Сообщений: 100


Просмотр профиля Email
« Ответ #11 : 17 Октября 2017, 18:00:21 »

Сегодня установил радиус3, обновились пакеты:
        perl5: 5.20.3_15 -> 5.24.3
        p5-Net-SSLeay: 1.78 -> 1.81
        p5-Socket: 2.021 -> 2.024
        p5-List-MoreUtils: 0.416 -> 0.425
        p5-List-SomeUtils-XS: 0.52 -> 0.55
        p5-Params-Validate: 1.24 -> 1.29
        p5-Variable-Magic: 0.59 -> 0.61
        p5-Package-Stash-XS: 0.28_1 -> 0.28_2
        p5-Sub-Identify: 0.12 -> 0.14
        p5-DateTime: 1.39 -> 1.44
        p5-JSON-XS: 3.02 -> 3.04
        p5-DBD-mysql: 4.037 -> 4.043
        p5-DBI: 1.636 -> 1.637

После этого перестал работать поиск ни по началу, ни по фрагменту.... В дебаге - пусто.

в логе апача

Код:
[cgi:error] [pid 62084] [client 192.168.108.26:65068] AH01215: Wide character in print at /usr/local/nodeny/web/calls.pm line 498


на
Код:
sub ajRender
{
    $ses::debug && push @$ses::cmd, {
        id     => 'debug',
        data   => Debug->show,
        action => 'insert',
    };
    eval 'use JSON';
    $@ && die $@;
    print join( "\n",
          'Content-type: text/html; charset=utf-8',
          'Cache-Control: no-store, no-cache, must-revalidate'
        ).
         "\n\n".
         to_json($ses::cmd);
    exit;
}
« Последнее редактирование: 17 Октября 2017, 18:22:51 от sedo26 » Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #12 : 17 Октября 2017, 20:53:50 »

Это частая проблема. Нужно удалить p5-JSON-XS и p5-common-sense, затем установить заново

P.S. Это относилось к тексту, который был до редактирования. Ну попробуй, мож поможет
Записан
sedo26
Постоялец
***

Карма: 0
Offline Offline

Сообщений: 100


Просмотр профиля Email
« Ответ #13 : 18 Октября 2017, 08:08:28 »

Это частая проблема. Нужно удалить p5-JSON-XS и p5-common-sense, затем установить заново

P.S. Это относилось к тексту, который был до редактирования. Ну попробуй, мож поможет

Помогло, спасибо.
Записан
sedo26
Постоялец
***

Карма: 0
Offline Offline

Сообщений: 100


Просмотр профиля Email
« Ответ #14 : 18 Октября 2017, 18:38:19 »

Но клиент так пока ИП не получает

Использовал:
nodeny
Код:
server default {
    listen {
        type = auth
        ipaddr = *
        port = 1812
    }
    authorize {
            sql
             update control {
                             Auth-Type := "Accept"
                            }
    }
authenticate {
            Auth-Type PAP {
                pap
            }
          }
    preacct {
            acct_unique
            preprocess
    }
accounting {
            detail
            sql
            exec
    }
   session {
            radutmp
            sql
    }
  post-auth {
            sql
            }
 Post-Auth-Type REJECT {
            sql
    }
}

файл 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}')"
        accounting {
            query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                    'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
            type {
                start {
                    query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                            'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
                }
            }
        }
        post-auth {
        query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\
                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')"
        }
}

Mysql процедуры
Код:
ALTER DATABASE nodeny CHARACTER SET utf8 COLLATE utf8_general_ci;

DROP PROCEDURE IF EXISTS `radcheck`;
DELIMITER $$
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64))
BEGIN
  SELECT id,name,'Cleartext-Password' AS Attribute,AES_DECRYPT(passwd,'hardpass') AS Value,':='
    FROM users WHERE name=login;
END$$
DELIMITER ;

DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$

CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(12);
    DECLARE usr_ip VARCHAR(15);
    DECLARE usr_id INT;
    SELECT REPLACE(login, ':', '') 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(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(), 0, 0, 0)
        ON DUPLICATE KEY
            UPDATE ip=IF(ip>0,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 NULL, login, 'Framed-IP-Address', usr_ip, '=';
    SELECT NULL, login, 'Session-Timeout', '600', '=';
END$$
DELIMITER ;

DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$

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

/usr/local/etc/raddb/mods-enabled/eap удалил

Лог радиуса при получении IP клиентом

(0) sql: EXPAND .query
(0) sql:    --> .query
(0) sql: Using query template 'query'
rlm_sql (sql): Reserved connection (1)
(0) sql: EXPAND call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address}')
(0) sql:    --> call radupdate('B8:70:F4:73:95:78','',                'user=1:b8:70:f4:73:95:78;nas=10.20.30.40')
(0) sql: Executing query: call radupdate('B8:70:F4:73:95:78','',                'user=1:b8:70:f4:73:95:78;nas=10.20.30.40')
(0) sql: ERROR: rlm_sql_mysql: ERROR 1318 (Incorrect number of arguments for PROCEDURE nodeny.radupdate; expected 4, got 3): 42000
(0) sql: SQL query returned: server error
rlm_sql (sql): Released connection (1)
(0)     [sql] = fail
(0)   } # post-auth = fail
(0) Using Post-Auth-Type Reject
(0) Post-Auth-Type sub-section not found.  Ignoring.

и так по кругу

Мак в биллинге не прописан(свежий клиент DHCP), ИП не получает никакой.

Микрот отвечает что:

radius authentication failed for B8:70:F4:73:95:78 radius server is not responding

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

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