<?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:19Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv: /* Mysql процедуры */</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2020-04-21T14:51:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Mysql процедуры&lt;/span&gt;&lt;/span&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 сервер на FreeBSD&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будут задействованы:&lt;br /&gt;
* mpd5 в качестве pppoe-сервера &lt;br /&gt;
* freeradius2 - в качестве radius-сервера&lt;br /&gt;
&lt;br /&gt;
== Описание принципа работы ==&lt;br /&gt;
&lt;br /&gt;
Mpd позволяет клиентам подключаться к серверу по pppoe или pptp протоколу.&lt;br /&gt;
&lt;br /&gt;
* Mpd принимает запрос на соединение и обращается к radius для проверки соответствия логин/пароль. Radius запускает mysql-процедуру radcheck.&lt;br /&gt;
* Если в БД логин существует и соответствует паролю, то клиенту разрешается соединение. Обратите внимание, состояние клиента «заблокирован» или «не заблокирован» не влияет на сам факт соединения. Т.е. легальный абонент создает соединение и будет иметь доступ минимум к своей статистике, даже если доступ в интернет у него запрещен.&lt;br /&gt;
* После авторизации, radius передает mdp параметры соединения: ip, маску, а также другие данные, если необходимы (mysql-процедура radreply).&lt;br /&gt;
* После авторизации mpd запускает postauth_query: radius запускает mysql-процедуру radupdate, которая запускает процедуру set_auth, которая записывает в таблицу авторизаций auth_now данные текущей авторизации.&lt;br /&gt;
* Mpd настраивается таким образом, что с определенным периодом будет посылать radius-у accounting пакеты для каждого соединения. Эти пакеты будут интерпретироваться как keep-alive пакеты, сообщающие NoDeny, что соединение не зависло. Accounting_update_query ссылается на ту же процедуру radupdate, которая опять же вызывает set_auth. При этом если запись в таблице auth_now существует, то поле last будет обновлено текущим временем.&lt;br /&gt;
* Ядро NoDeny удаляет записи из таблицы auth_now, у которых поле last давно не обновлялось, т.е. удаляет по таймауту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможна работа как со статическими (когда ip прописан явно в учетке абонента и никогда не меняется), так и с динамическими ip. Во втором случае в админке NoDeny необходимо создать пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip - &amp;quot;динамический&amp;quot;.&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((SELECT name FROM users LIMIT 1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если получаем ошибку:&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;
==Настройка mpd==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pkg install mpd5&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;
echo '!mpd' &amp;gt;&amp;gt; /etc/syslog.conf&lt;br /&gt;
echo '*.* /var/log/mpd.log' &amp;gt;&amp;gt; /etc/syslog.conf&lt;br /&gt;
touch /var/log/mpd.log&lt;br /&gt;
killall -HUP syslogd&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;
echo '/var/log/mpd.log 600 5 100 * JC' &amp;gt;&amp;gt; /etc/newsyslog.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
описание параметров ротации:&lt;br /&gt;
* 600 - права на файлы&lt;br /&gt;
* 5 - количество файлов в ротации&lt;br /&gt;
* 100 - ротация будет произведена при достижении лога 100 кб&lt;br /&gt;
* * - ротация по времени отключена&lt;br /&gt;
* JC  - упаковка файлов утилитой bzip2&lt;br /&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;
echo mpd_enable=YES &amp;gt;&amp;gt; /etc/rc.conf&lt;br /&gt;
&amp;lt;/source&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/mpd5/mpd.conf&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;
startup:&lt;br /&gt;
        set user admin deletempd&lt;br /&gt;
        set console self 127.0.0.1 5005&lt;br /&gt;
        set console open&lt;br /&gt;
        set web self 0.0.0.0 5006&lt;br /&gt;
        set web open&lt;br /&gt;
&lt;br /&gt;
default:&lt;br /&gt;
        load pppoe_server&lt;br /&gt;
&lt;br /&gt;
pppoe_server:&lt;br /&gt;
&lt;br /&gt;
        create bundle template B&lt;br /&gt;
        set ipcp ranges 1.1.1.1/32 127.0.0.2/32&lt;br /&gt;
        set ipcp dns 1.1.1.1&lt;br /&gt;
        set ccp yes mppc&lt;br /&gt;
        set mppc yes e40&lt;br /&gt;
        set mppc yes e56&lt;br /&gt;
        set mppc yes e128&lt;br /&gt;
        set mppc yes stateless&lt;br /&gt;
        set ecp disable dese-bis dese-old&lt;br /&gt;
&lt;br /&gt;
        create link template common pppoe&lt;br /&gt;
        set link enable multilink&lt;br /&gt;
        set link action bundle B&lt;br /&gt;
        set link disable chap pap eap&lt;br /&gt;
        set link enable pap&lt;br /&gt;
        load radius&lt;br /&gt;
        set pppoe service &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        create link template fxp1 common&lt;br /&gt;
        set link max-children 1000&lt;br /&gt;
        set pppoe iface fxp1&lt;br /&gt;
        set link enable incoming&lt;br /&gt;
radius:&lt;br /&gt;
        set radius server localhost hardpass5 1812 1813&lt;br /&gt;
        set radius retries 3&lt;br /&gt;
        set radius timeout 3&lt;br /&gt;
        set radius me 127.0.0.1&lt;br /&gt;
        set auth acct-update 45&lt;br /&gt;
        set auth enable radius-auth&lt;br /&gt;
        set auth enable radius-acct&lt;br /&gt;
        set radius enable message-authentic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Комментарии к mpd.conf:&lt;br /&gt;
&lt;br /&gt;
* Все строки, кроме комментариев и ссылок (строки которые заканчиваются на двоеточие), должны начинаться с отступа (пробела или табуляции).&lt;br /&gt;
* admin и deletempd - логин и пароль для доступа к управлению mpd5 через консоль или web-интерфейс (http://xx.xx.xx.xx:5006/). Не забудьте в фаерволе открыть tcp порт 5006.&lt;br /&gt;
* 1.1.1.1 - один из ip вашего сервера. Этот ip будет использован в туннеле: ip сервера &amp;lt;-&amp;gt; клиентский ip. Автор обычно прописывает этот ip на локальной заглушке.&lt;br /&gt;
* dns 1.1.1.1 - dns-сервер. Через пробел можно указать несколько.&lt;br /&gt;
* fxp1 - Интерфейс, на который будут приниматься pppoe соединения. Обратите внимание: указывается в двух местах конфига.&lt;br /&gt;
* acct-update 45 - период посылки accounting пакетов (используем для поддержания авторизаций) 45 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod 600 /usr/local/etc/mpd5/mpd.conf&lt;br /&gt;
/usr/local/etc/rc.d/mpd5 forcestart&lt;br /&gt;
tail -f /var/log/mpd.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>