<?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%2BRadius</id>
	<title>Dhcp+Radius - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=Dhcp%2BRadius"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:23:17Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 07:01, 31 травня 2023</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2023-05-31T07:01:33Z</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;* В админке NoDeny создадим пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip обязательно должен быть &amp;quot;динамический&amp;quot;.&lt;br /&gt;
* Если у нас Nodeny Plus, с главного сайта NoDeny скачаем модуль dhcp и установим его: ''perl install.pl -x''. В NoDeny Next модуль уже включен в базу.&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/freeradius2 &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;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&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;
authorize {&lt;br /&gt;
        sql&lt;br /&gt;
}&lt;br /&gt;
authenticate {&lt;br /&gt;
        Auth-Type PAP {&lt;br /&gt;
                pap&lt;br /&gt;
        }&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;
        detail&lt;br /&gt;
        sql&lt;br /&gt;
        exec&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;
&amp;lt;/pre&amp;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;
echo radiusd_enable=YES &amp;gt;&amp;gt; /etc/rc.conf&lt;br /&gt;
ee /usr/local/etc/raddb/radiusd.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раскомментируем строку (найти проще всего так: ctrl+y, затем текст &amp;quot;sql.conf&amp;quot;, затем enter):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$INCLUDE sql.conf&lt;br /&gt;
&amp;lt;/pre&amp;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/sql.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменим postauth_query и accounting_update_query:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        postauth_query = &amp;quot;call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\&lt;br /&gt;
                'nas=%{NAS-IP-Address}')&amp;quot;&lt;br /&gt;
        accounting_update_query = &amp;quot;call radupdate('%{User-Name}','%{Framed-IP-Address}',\&lt;br /&gt;
                'nas=%{NAS-IP-Address}')&amp;quot;&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 `radcheck`;&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64))&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT Null, login, 'Cleartext-Password' AS Attribute, '' AS Value,':=';&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 `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;br /&gt;
&lt;br /&gt;
==Запускам Radius==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
/usr/local/etc/rc.d/radiusd start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
radtest 00:11:22:33:44:55 '' 127.0.0.1 0 hardpass5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если получаем ошибку ''radclient:: Failed to find IP address for имя_нашего_сервера'' - в /etc/hosts не прописано имя нашего сервера.&lt;br /&gt;
&lt;br /&gt;
Должны получить примерно такой ответ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=63, length=38&lt;br /&gt;
	Framed-IP-Address = 10.0.4.175&lt;br /&gt;
	Session-Timeout = 600&lt;br /&gt;
	Acct-Interim-Interval = 60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ином случае тушим radius и запускаем в режиме детального вывода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
/usr/local/etc/rc.d/radiusd stop&lt;br /&gt;
radiusd -X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Продолжаем настройку. В настройки радиуса добавим ip нашего dhcp-сервера. Например, это будет микротик с ip = 1.1.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
ee /usr/local/etc/raddb/clients.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавляем:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client 1.1.1.1 {&lt;br /&gt;
        secret      = hardpass5&lt;br /&gt;
        shortname   = Mikrotik&lt;br /&gt;
        nastype     = cisco&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разрешим в фаерволе radius-запросы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
echo '${f} add 2065 allow udp from any to any 67, 1812' &amp;gt;&amp;gt; /etc/rc.firewall&lt;br /&gt;
ipfw add 2065 allow udp from any to any 67, 1812&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверим, что модуль dhcp запускается при старте nokernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&amp;gt;&lt;br /&gt;
cd /usr/local/nodeny&lt;br /&gt;
perl nokernel.pl -L&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после установки модуля dhcp необходимо перезапустить nokernel.&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>