<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=Dhcp_%2B_Radius_3</id>
	<title>Dhcp + Radius 3 - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=Dhcp_%2B_Radius_3"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:23:15Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 17:31, 22 червня 2023</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2023-06-22T17:31:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Выдача ip может быть основана на разных критериях, например:&lt;br /&gt;
* авторизация по мак-адресу клиента (преимущественно используется в неуправляемых сетях)&lt;br /&gt;
* по комбинации мак клиента, мак свича, порт свича&lt;br /&gt;
* по номеру vlan&lt;br /&gt;
* по имени nas, vlan свича, vlan клиента&lt;br /&gt;
* по имени nas, маку и vlan клиента&lt;br /&gt;
Вариантов может быть множество, в зависимости от того, что придумает админ. Но суть везде одна: на radius приходят параметры, с которыми подключается клиент, а radius возвращает обычно ip и/или любое множество иных параметров.&lt;br /&gt;
&lt;br /&gt;
В данном документе будет описан самый простой вариант: авторизация по мак-адресу клиента. Потом сложнее.&lt;br /&gt;
&lt;br /&gt;
Мы настраиваем Radius так, чтобы он &amp;quot;принимал&amp;quot; любого, в том числе неизвестного, клиента, поскольку неизвестным клиентам будет выдан ip из пула динамических адресов. После чего у клиента появится возможность через личный кабинет зарегистрировать свое подключение и данный мак-адрес перестанет быть неизвестным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Установка Radius==&lt;br /&gt;
&lt;br /&gt;
Поскольку понадобится radius с модулем mysql, установим его не из бинарных пакетов (''pkg install freeradius''), а из портов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/ports/net/freeradius3 &amp;amp;&amp;amp; make install clean&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Обязательно поставим галку напротив опции MYSQL'''&lt;br /&gt;
&lt;br /&gt;
Автозапуск:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sysrc radiusd_enable=&amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Конфигурирование===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/&lt;br /&gt;
rm /usr/local/etc/raddb/sites-enabled/default &lt;br /&gt;
ee /usr/local/etc/raddb/sites-enabled/nodeny&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставляем следующий текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server default {&lt;br /&gt;
    listen {&lt;br /&gt;
        type = auth&lt;br /&gt;
        ipaddr = *&lt;br /&gt;
        port = 1812&lt;br /&gt;
    }&lt;br /&gt;
    listen {&lt;br /&gt;
        type = acct&lt;br /&gt;
        ipaddr = *&lt;br /&gt;
        port = 0&lt;br /&gt;
    }&lt;br /&gt;
    authorize {&lt;br /&gt;
        sql&lt;br /&gt;
        update control {&lt;br /&gt;
          Auth-Type := Accept&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    authenticate {&lt;br /&gt;
    }&lt;br /&gt;
    preacct {&lt;br /&gt;
        acct_unique&lt;br /&gt;
        preprocess&lt;br /&gt;
    }&lt;br /&gt;
    accounting {&lt;br /&gt;
        sql&lt;br /&gt;
    }&lt;br /&gt;
    session {&lt;br /&gt;
        radutmp&lt;br /&gt;
        sql&lt;br /&gt;
    }&lt;br /&gt;
    post-auth {&lt;br /&gt;
        sql&lt;br /&gt;
    }&lt;br /&gt;
    Post-Auth-Type ACCEPT {&lt;br /&gt;
        sql&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sql конфиг===&lt;br /&gt;
В консоли:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ee /usr/local/etc/raddb/mods-enabled/sql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставляем следующий текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sql {&lt;br /&gt;
    driver = &amp;quot;rlm_sql_mysql&amp;quot;&lt;br /&gt;
    mysql {&lt;br /&gt;
        warnings = auto&lt;br /&gt;
    }&lt;br /&gt;
    server = &amp;quot;localhost&amp;quot;&lt;br /&gt;
    port = 3306&lt;br /&gt;
    login = &amp;quot;nodeny&amp;quot;&lt;br /&gt;
    password = &amp;quot;hardpass&amp;quot;&lt;br /&gt;
    radius_db = &amp;quot;nodeny&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    read_groups = no&lt;br /&gt;
    authorize_reply_query = &amp;quot;call radreply('%{User-Name}')&amp;quot;&lt;br /&gt;
    accounting {&lt;br /&gt;
        reference = &amp;quot;%{tolower:type.%{Acct-Status-Type}.query}&amp;quot;&lt;br /&gt;
        type {&lt;br /&gt;
            start {&lt;br /&gt;
                query = &amp;quot;call radupdate('%{User-Name}','%{Framed-IP-Address}',\&lt;br /&gt;
                        'user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
            interim-update {&lt;br /&gt;
                query = &amp;quot;${..start.query}&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
            stop {&lt;br /&gt;
                query = &amp;quot;call radstop('%{User-Name}', '%{Framed-IP-Address}')&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    post-auth {&lt;br /&gt;
        query = &amp;quot;call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\&lt;br /&gt;
                'user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mysql процедуры==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE nodeny CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP PROCEDURE IF EXISTS `radreply`;&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))&lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE usr_mac VARCHAR(12);&lt;br /&gt;
    DECLARE usr_ip VARCHAR(15);&lt;br /&gt;
    DECLARE usr_id INT;&lt;br /&gt;
    SELECT REPLACE(login, ':', '') INTO usr_mac;&lt;br /&gt;
    SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac;&lt;br /&gt;
    IF usr_id IS NOT NULL AND usr_id&amp;gt;0 THEN&lt;br /&gt;
        SELECT get_ip(usr_id) INTO usr_ip;&lt;br /&gt;
        UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid&amp;lt;&amp;gt;usr_id;&lt;br /&gt;
        UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;&lt;br /&gt;
    ELSE&lt;br /&gt;
        START TRANSACTION;&lt;br /&gt;
        SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool&lt;br /&gt;
            WHERE uid=0 AND type='dynamic' AND `release` &amp;lt; UNIX_TIMESTAMP()&lt;br /&gt;
            ORDER BY RAND() LIMIT 1 FOR UPDATE;&lt;br /&gt;
        INSERT INTO mac_uid VALUES(&lt;br /&gt;
            NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), 0, 0, 0, '')&lt;br /&gt;
        ON DUPLICATE KEY&lt;br /&gt;
            UPDATE ip=IF(ip&amp;gt;0,ip,INET_ATON(usr_ip)), time=UNIX_TIMESTAMP();&lt;br /&gt;
        COMMIT;&lt;br /&gt;
        SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;&lt;br /&gt;
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600&lt;br /&gt;
            WHERE ip = INET_ATON(usr_ip);&lt;br /&gt;
    END IF;&lt;br /&gt;
    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';&lt;br /&gt;
    SELECT NULL, login, 'Session-Timeout', '600', '=';&lt;br /&gt;
END$$&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP PROCEDURE IF EXISTS `radupdate`;&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE PROCEDURE `radupdate`(&lt;br /&gt;
    IN login VARCHAR(64), IN ipa VARCHAR(16), IN properties VARCHAR(255))&lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE usr_mac VARCHAR(16);&lt;br /&gt;
    SELECT REPLACE(login, ':', '') INTO usr_mac;&lt;br /&gt;
    CALL set_auth(ipa, CONCAT('mod=dhcp;user=', usr_mac, ';', REPLACE(properties,';','')));&lt;br /&gt;
    UPDATE mac_uid SET time=UNIX_TIMESTAMP() WHERE ip=INET_ATON(ipa) LIMIT 1;&lt;br /&gt;
END$$&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CALL radreply('00:11:22:33:44:55');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Если получаем ошибку:&lt;br /&gt;
&lt;br /&gt;
* ''ERROR 1146 (42S02): Table 'nodeny.mac_uid' doesn't exist'' - не установлен модуль dhcp&lt;br /&gt;
* ''ERROR 1048 (23000): Column 'ip' cannot be null'' - забыли создать пул ip адресов типа &amp;quot;динамический&amp;quot;&lt;br /&gt;
* ''ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=''' - выполним:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE nodeny CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
и пересоздаем процедуры&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>