<?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=Pppoe</id>
	<title>Pppoe - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=Pppoe"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:22:05Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 09:02, 21 квітня 2017</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2017-04-21T09:02:05Z</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;&amp;lt;h2&amp;gt;PPPoE на Mikrotik&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возможна работа как со статическими (когда ip прописан явно в учетке абонента и никогда не меняется), так и с динамическими ip. Во втором случае в админке NoDeny создадим пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip - &amp;quot;динамический&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mikrotik_radius.gif]]&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;
===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 id,name,'Password' AS Attribute,AES_DECRYPT(passwd,'hardpass') AS Value,'=='&lt;br /&gt;
    FROM users WHERE name=login;&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_id INT;&lt;br /&gt;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;&lt;br /&gt;
&lt;br /&gt;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;&lt;br /&gt;
  SELECT get_ip(usr_id) INTO usr_ip;&lt;br /&gt;
&lt;br /&gt;
  SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';&lt;br /&gt;
  SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';&lt;br /&gt;
  SELECT NULL,login,'Framed-Protocol','PPP','=';&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`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255))&lt;br /&gt;
BEGIN&lt;br /&gt;
  DECLARE usr_id INT;&lt;br /&gt;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;&lt;br /&gt;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;&lt;br /&gt;
  SELECT get_ip(usr_id) INTO usr_ip;&lt;br /&gt;
  CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':','')));&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 `radstop`;&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE PROCEDURE `radstop`(IN login VARCHAR(64))&lt;br /&gt;
BEGIN&lt;br /&gt;
  DECLARE usr_id INT;&lt;br /&gt;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;&lt;br /&gt;
  DELETE FROM auth_now WHERE ip = get_ip(usr_id) 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('test');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где test - это логин существующего абонента. В ответе должны получить ip, который привязан к абоненту, либо, если ни один ip не привязан - будет выдан свободный из пула ip биллинга. Если получаем ошибку:&lt;br /&gt;
&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 login pass 127.0.0.1 0 hardpass5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где login и test соответственно логин и пароль реально существующей клиентской записи в NoDeny. Если получаем ошибку ''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-Accept packet from host 127.0.0.1 port 1812, id=138, length=38&lt;br /&gt;
	Framed-IP-Address = 10.0.0.10&lt;br /&gt;
	Framed-IP-Netmask = 255.255.255.255&lt;br /&gt;
	Framed-Protocol = PPP&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;
Продолжаем настройку. Добавим микротик (10.1.0.11) в  настройки радиуса:&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;
Здесь  1.1.1.1 - ip Микротика (тот ip, который смотрит на сервер NoDeny - смотрите схему выше)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
radius add address=1.1.1.2 secret=hardpass5 service=ppp&lt;br /&gt;
radius incoming set accept=yes&lt;br /&gt;
ppp aaa set accounting=yes use-radius=yes interim-update=50&lt;br /&gt;
ppp profile set default local-address=2.2.2.2 dns-server=2.2.2.2&lt;br /&gt;
interface pppoe-server server add interface=ether1 service-name=pppoe-in authentication=chap&lt;br /&gt;
ip firewall nat add chain=srcnat action=src-nat to-addresses=2.2.2.2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PPPoE с привязкой к мак==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='bash'&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;
В конце файла находим строку ''authorize_check_query = ...'' и меняем ее на:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
authorize_check_query = &amp;quot;call radcheck('%{User-Name}', '%{Calling-Station-Id}')&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы добавили в процедуру radcheck параметр ''Calling-Station-Id'' - в этом параметре mikrotik передает мак абонента. Когда клиент пытается сконнектиться, radius запускает процедуру radcheck и передает ей логин и мак. В случае если логин существует в базе данных и к нему подвязан точно такой же мак - процедура должна вернуть radius-у пароль абонента. Радиус сверяет пароль полученный от клиента с его реальным и при совпадении создает pppoe-сессию. В случае, если мак иной - процедура ничего не должна возвращать, в этом случае radius будет считать, что такого логина не существует.&lt;br /&gt;
&lt;br /&gt;
В mysql меняем процедуру radcheck:&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), IN usr_mac VARCHAR(64))&lt;br /&gt;
BEGIN&lt;br /&gt;
  DECLARE usr_id INT;&lt;br /&gt;
  DECLARE usr_pass VARCHAR(64) DEFAULT NULL;&lt;br /&gt;
  SELECT LOWER(REPLACE(usr_mac, ':', '')) INTO usr_mac;&lt;br /&gt;
  SELECT id, AES_DECRYPT(passwd,'hardpass') INTO usr_id, usr_pass&lt;br /&gt;
    FROM users WHERE name=login;&lt;br /&gt;
  IF usr_id IS NOT NULL AND&lt;br /&gt;
    (SELECT 1 FROM mac_uid WHERE uid=usr_id AND mac=usr_mac)&lt;br /&gt;
  THEN&lt;br /&gt;
    SELECT usr_id, login, 'Password' AS Attribute, usr_pass AS Value, '==';&lt;br /&gt;
  END IF;&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 radcheck('11', '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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+--------+-------+-----------+------------+----+&lt;br /&gt;
| usr_id | login | Attribute | Value      | == |&lt;br /&gt;
+--------+-------+-----------+------------+----+&lt;br /&gt;
|      1 | 11    | Password  | 2234157631 | == |&lt;br /&gt;
+--------+-------+-----------+------------+----+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь: 11 - логин абонента, 00:11:22:33:44:55 - мак адрес, 2234157631 - пароль&lt;br /&gt;
&lt;br /&gt;
Проверим ситуацию, когда абонент сменил мак адрес&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
call radcheck('11', '00:11:11:11:11:11');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ответ должны получить 0 строк.&lt;br /&gt;
&lt;br /&gt;
Запускаем radius с выводом данных на консоль:&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;
Пытаемся подсоединиться по pppoe и в консоли должны увидеть следующее:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
[sql]   expand: call radcheck('%{User-Name}', '%{Calling-Station-Id}') -&amp;gt; call radcheck('11', '00:11:22:33:44:55')&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>