PPPoE: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
(Новая страница: «<h2>PPPoE сервер на FreeBSD</h2> Будут использоваться: * PPPoE сервер mpd5 * Radius === Описание принципа ра…»)
 
 
(Не показано 14 проміжних версій цього користувача)
Рядок 1: Рядок 1:
<h2>PPPoE сервер на FreeBSD</h2>
<h2>PPPoE сервер на FreeBSD</h2>


Будут использоваться:
Будут задействованы:
* PPPoE сервер mpd5  
* mpd5 в качестве pppoe-сервера
* Radius
* freeradius2 - в качестве radius-сервера


=== Описание принципа работы ===
== Описание принципа работы ==


Mpd позволяет клиентам подключаться к серверу по pppoe/pptp протоколам.
Mpd позволяет клиентам подключаться к серверу по pppoe или pptp протоколу.


Mpd принимает запрос на соединение и обращается к radius для проверки соответствия логин/пароль. Radius запускает mysql-процедуру radcheck.
* Mpd принимает запрос на соединение и обращается к radius для проверки соответствия логин/пароль. Radius запускает mysql-процедуру radcheck.
Если в БД логин существует и соответствует паролю, то клиенту разрешается соединение. Обратите внимание, состояние клиента «заблокирован» или «не заблокирован» не влияет на сам факт соединения. Т.е. легальный абонент создает соединение и будет иметь доступ минимум к своей статистике, даже если доступ в интернет у него запрещен.
* Если в БД логин существует и соответствует паролю, то клиенту разрешается соединение. Обратите внимание, состояние клиента «заблокирован» или «не заблокирован» не влияет на сам факт соединения. Т.е. легальный абонент создает соединение и будет иметь доступ минимум к своей статистике, даже если доступ в интернет у него запрещен.
После авторизации, radius передает mdp параметры соединения: ip, маску, а также другие данные, если необходимы (mysql-процедура radreply).
* После авторизации, radius передает mdp параметры соединения: ip, маску, а также другие данные, если необходимы (mysql-процедура radreply).
После авторизации mpd запускает postauth_query: radius запускает mysql-процедуру radupdate, которая запускает процедуру set_auth, которая записывает в таблицу авторизаций auth_now данные текущей авторизации.
* После авторизации mpd запускает postauth_query: radius запускает mysql-процедуру radupdate, которая запускает процедуру set_auth, которая записывает в таблицу авторизаций auth_now данные текущей авторизации.
Mpd настраивается таким образом, что с определенным периодом будет посылать radius-у accounting пакеты для каждого соединения. Эти пакеты будут интерпретироваться как keep-alive пакеты, сообщающие NoDeny, что соединение не зависло. Accounting_update_query ссылается на ту же процедуру radupdate, которая опять же вызывает set_auth. При этом если запись в таблице auth_now существует, то поле last будет обновлено текущим временем.
* Mpd настраивается таким образом, что с определенным периодом будет посылать radius-у accounting пакеты для каждого соединения. Эти пакеты будут интерпретироваться как keep-alive пакеты, сообщающие NoDeny, что соединение не зависло. Accounting_update_query ссылается на ту же процедуру radupdate, которая опять же вызывает set_auth. При этом если запись в таблице auth_now существует, то поле last будет обновлено текущим временем.
Ядро NoDeny удаляет записи из таблицы auth_now, у которых поле last давно не обновлялось, т.е. удаляет по таймауту.
* Ядро NoDeny удаляет записи из таблицы auth_now, у которых поле last давно не обновлялось, т.е. удаляет по таймауту.




Возможна работа как со статическими (когда ip прописан явно в учетке абонента и никогда не меняется), так и с динамическими ip. Во втором случае в админке NoDeny создадим пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip - "динамический".
Возможна работа как со статическими (когда ip прописан явно в учетке абонента и никогда не меняется), так и с динамическими ip. Во втором случае в админке NoDeny необходимо создать пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip - "динамический".


==Установка Radius==
==Установка Radius==
Рядок 27: Рядок 27:
</source>
</source>


Обязательно поставим галку напротив опции ''MYSQL''
'''Обязательно поставим галку напротив опции MYSQL'''


<source lang="bash">
<source lang="bash">
Рядок 98: Рядок 98:
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
BEGIN
  DECLARE usr_id INT;
    DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
    DECLARE usr_ip VARCHAR(15) DEFAULT NULL;


  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
    SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
  SELECT get_ip(usr_id) INTO usr_ip;
    SELECT get_ip(usr_id) INTO usr_ip;


  SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';
    SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';
  SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';
    SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';
  SELECT NULL,login,'Framed-Protocol','PPP','=';
    SELECT NULL,login,'Framed-Protocol','PPP','=';
END$$
END$$
DELIMITER ;
DELIMITER ;
Рядок 140: Рядок 140:


<pre>
<pre>
CALL radreply('test');
CALL radreply((SELECT name FROM users LIMIT 1));
</pre>
</pre>


Где test - это логин существующего абонента. В ответе должны получить ip, который привязан к абоненту, либо, если ни один ip не привязан - будет выдан свободный из пула ip биллинга. Если получаем ошибку:
Если получаем ошибку:


* ''ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=''' - выполним:
* ''ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=''' - выполним:
Рядок 181: Рядок 181:
</source>
</source>


Продолжаем настройку. Добавим микротик (10.1.0.11) в  настройки радиуса:
==Настройка mpd==
 
<source lang="bash">
pkg install mpd5
</source>
 
Ведение логов


<source lang='bash'>
<source lang="bash">
ee /usr/local/etc/raddb/clients.conf
echo '!mpd' >> /etc/syslog.conf
echo '*.* /var/log/mpd.log' >> /etc/syslog.conf
touch /var/log/mpd.log
killall -HUP syslogd
</source>
</source>


Добавляем:
Ротация логов:
<pre>
 
client 1.1.1.1 {
<source lang="bash">
        secret      = hardpass5
echo '/var/log/mpd.log 600 5 100 * JC' >> /etc/newsyslog.conf
        shortname  = Mikrotik
</source>
        nastype    = cisco
}
</pre>


Здесь  1.1.1.1 - ip Микротика (тот ip, который смотрит на сервер NoDeny - смотрите схему выше)
описание параметров ротации:
* 600 - права на файлы
* 5 - количество файлов в ротации
* 100 - ротация будет произведена при достижении лога 100 кб
* * - ротация по времени отключена
* JC  - упаковка файлов утилитой bzip2


<pre>
radius add address=1.1.1.2 secret=hardpass5 service=ppp
radius incoming set accept=yes
ppp aaa set accounting=yes use-radius=yes interim-update=50
ppp profile set default local-address=2.2.2.2 dns-server=2.2.2.2
interface pppoe-server server add interface=ether1 service-name=pppoe-in authentication=chap
ip firewall nat add chain=srcnat action=src-nat to-addresses=2.2.2.2
</pre>


==PPPoE с привязкой к мак==
Автозапуск:


<source lang='bash'>
<source lang="bash">
ee /usr/local/etc/raddb/sql.conf
echo mpd_enable=YES >> /etc/rc.conf
</source>
</source>


В конце файла находим строку ''authorize_check_query = ...'' и меняем ее на:
<source lang="bash">
<pre>
ee /usr/local/etc/mpd5/mpd.conf
authorize_check_query = "call radcheck('%{User-Name}', '%{Calling-Station-Id}')"
</source>
</pre>


Здесь мы добавили в процедуру radcheck параметр ''Calling-Station-Id'' - в этом параметре mikrotik передает мак абонента. Когда клиент пытается сконнектиться, radius запускает процедуру radcheck и передает ей логин и мак. В случае если логин существует в базе данных и к нему подвязан точно такой же мак - процедура должна вернуть radius-у пароль абонента. Радиус сверяет пароль полученный от клиента с его реальным и при совпадении создает pppoe-сессию. В случае, если мак иной - процедура ничего не должна возвращать, в этом случае radius будет считать, что такого логина не существует.
вставляем текст:


В mysql меняем процедуру radcheck:
<pre>
<pre>
DROP PROCEDURE IF EXISTS `radcheck`;
startup:
DELIMITER $$
        set user admin deletempd
CREATE PROCEDURE `radcheck` (IN login VARCHAR(64), IN usr_mac VARCHAR(64))
        set console self 127.0.0.1 5005
BEGIN
        set console open
  DECLARE usr_id INT;
        set web self 0.0.0.0 5006
  DECLARE usr_pass VARCHAR(64) DEFAULT NULL;
        set web open
  SELECT LOWER(REPLACE(usr_mac, ':', '')) INTO usr_mac;
 
  SELECT id, AES_DECRYPT(passwd,'hardpass') INTO usr_id, usr_pass
default:
    FROM users WHERE name=login;
        load pppoe_server
  IF usr_id IS NOT NULL AND
    (SELECT 1 FROM mac_uid WHERE uid=usr_id AND mac=usr_mac)
  THEN
    SELECT usr_id, login, 'Password' AS Attribute, usr_pass AS Value, '==';
  END IF;
END$$
DELIMITER ;
</pre>


Проверим работоспособность:
pppoe_server:


<pre>
        create bundle template B
call radcheck('11', '00:11:22:33:44:55');
        set ipcp ranges 1.1.1.1/32 127.0.0.2/32
</pre>
        set ipcp dns 1.1.1.1
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e56
        set mppc yes e128
        set mppc yes stateless
        set ecp disable dese-bis dese-old


Должны получить:
        create link template common pppoe
        set link enable multilink
        set link action bundle B
        set link disable chap pap eap
        set link enable pap
        load radius
        set pppoe service "*"


<pre>
        create link template fxp1 common
+--------+-------+-----------+------------+----+
        set link max-children 1000
| usr_id | login | Attribute | Value      | == |
        set pppoe iface fxp1
+--------+-------+-----------+------------+----+
        set link enable incoming
|      1 | 11    | Password  | 2234157631 | == |
radius:
+--------+-------+-----------+------------+----+
        set radius server localhost hardpass5 1812 1813
        set radius retries 3
        set radius timeout 3
        set radius me 127.0.0.1
        set auth acct-update 45
        set auth enable radius-auth
        set auth enable radius-acct
        set radius enable message-authentic
</pre>
</pre>


Здесь: 11 - логин абонента, 00:11:22:33:44:55 - мак адрес, 2234157631 - пароль
Комментарии к mpd.conf:
 
Проверим ситуацию, когда абонент сменил мак адрес
<pre>
call radcheck('11', '00:11:11:11:11:11');
</pre>


В ответ должны получить 0 строк.
* Все строки, кроме комментариев и ссылок (строки которые заканчиваются на двоеточие), должны начинаться с отступа (пробела или табуляции).
* admin и deletempd - логин и пароль для доступа к управлению mpd5 через консоль или web-интерфейс (http://xx.xx.xx.xx:5006/). Не забудьте в фаерволе открыть tcp порт 5006.
* 1.1.1.1 - один из ip вашего сервера. Этот ip будет использован в туннеле: ip сервера <-> клиентский ip. Автор обычно прописывает этот ip на локальной заглушке.
* dns 1.1.1.1 - dns-сервер. Через пробел можно указать несколько.
* fxp1 - Интерфейс, на который будут приниматься pppoe соединения. Обратите внимание: указывается в двух местах конфига.
* acct-update 45 - период посылки accounting пакетов (используем для поддержания авторизаций) 45 секунд.


Запускаем radius с выводом данных на консоль:
<source lang="bash">
<source lang='bash'>
chmod 600 /usr/local/etc/mpd5/mpd.conf
/usr/local/etc/rc.d/radiusd stop
/usr/local/etc/rc.d/mpd5 forcestart
radiusd -X
tail -f /var/log/mpd.log
</source>
</source>
Пытаемся подсоединиться по pppoe и в консоли должны увидеть следующее:
<pre>
...
...
[sql]  expand: call radcheck('%{User-Name}', '%{Calling-Station-Id}') -> call radcheck('11', '00:11:22:33:44:55')
...
</pre>

Поточна версія на 14:51, 21 квітня 2020

PPPoE сервер на FreeBSD

Будут задействованы:

  • mpd5 в качестве pppoe-сервера
  • freeradius2 - в качестве radius-сервера

Описание принципа работы

Mpd позволяет клиентам подключаться к серверу по pppoe или pptp протоколу.

  • Mpd принимает запрос на соединение и обращается к radius для проверки соответствия логин/пароль. Radius запускает mysql-процедуру radcheck.
  • Если в БД логин существует и соответствует паролю, то клиенту разрешается соединение. Обратите внимание, состояние клиента «заблокирован» или «не заблокирован» не влияет на сам факт соединения. Т.е. легальный абонент создает соединение и будет иметь доступ минимум к своей статистике, даже если доступ в интернет у него запрещен.
  • После авторизации, radius передает mdp параметры соединения: ip, маску, а также другие данные, если необходимы (mysql-процедура radreply).
  • После авторизации mpd запускает postauth_query: radius запускает mysql-процедуру radupdate, которая запускает процедуру set_auth, которая записывает в таблицу авторизаций auth_now данные текущей авторизации.
  • Mpd настраивается таким образом, что с определенным периодом будет посылать radius-у accounting пакеты для каждого соединения. Эти пакеты будут интерпретироваться как keep-alive пакеты, сообщающие NoDeny, что соединение не зависло. Accounting_update_query ссылается на ту же процедуру radupdate, которая опять же вызывает set_auth. При этом если запись в таблице auth_now существует, то поле last будет обновлено текущим временем.
  • Ядро NoDeny удаляет записи из таблицы auth_now, у которых поле last давно не обновлялось, т.е. удаляет по таймауту.


Возможна работа как со статическими (когда ip прописан явно в учетке абонента и никогда не меняется), так и с динамическими ip. Во втором случае в админке NoDeny необходимо создать пул ip адресов в количестве раз в 5-10 большим чем предполагаемое количество абонентов. Тип ip - "динамический".

Установка Radius

Поскольку понадобится radius с модулем mysql, установим его не из бинарных пакетов (pkg install freeradius), а из портов:

cd /usr/ports/net/freeradius2 && make install clean

Обязательно поставим галку напротив опции MYSQL

rm /usr/local/etc/raddb/sites-enabled/default 
ee /usr/local/etc/raddb/sites-enabled/nodeny

Вставляем следующий текст:

authorize {
        sql
}
authenticate {
        Auth-Type PAP {
                pap
        }
}
preacct {
        acct_unique
        preprocess
}
accounting {
        detail
        sql
        exec
}
session {
        radutmp
        sql
}
post-auth {
        sql
}


cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/
echo radiusd_enable=YES >> /etc/rc.conf
ee /usr/local/etc/raddb/radiusd.conf

Раскомментируем строку (найти проще всего так: ctrl+y, затем текст "sql.conf", затем enter):

$INCLUDE sql.conf

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,'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_id INT;
    DECLARE usr_ip VARCHAR(15) DEFAULT NULL;

    SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
    SELECT get_ip(usr_id) INTO usr_ip;

    SELECT NULL,login,'Framed-IP-Address',usr_ip,'=';
    SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','=';
    SELECT NULL,login,'Framed-Protocol','PPP','=';
END$$
DELIMITER ;
DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255))
BEGIN
  DECLARE usr_id INT;
  DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
  SELECT get_ip(usr_id) INTO usr_ip;
  CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':','')));
END$$
DELIMITER ;
DROP PROCEDURE IF EXISTS `radstop`;
DELIMITER $$
CREATE PROCEDURE `radstop`(IN login VARCHAR(64))
BEGIN
  DECLARE usr_id INT;
  SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1;
  DELETE FROM auth_now WHERE ip = get_ip(usr_id) LIMIT 1;
END$$
DELIMITER ;

Проверим:

CALL radreply((SELECT name FROM users LIMIT 1));

Если получаем ошибку:

  • ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=' - выполним:
ALTER DATABASE nodeny CHARACTER SET utf8 COLLATE utf8_general_ci;

и пересоздаем процедуры

Запускам Radius

/usr/local/etc/rc.d/radiusd start

Проверяем:

radtest login pass 127.0.0.1 0 hardpass5

где login и test соответственно логин и пароль реально существующей клиентской записи в NoDeny. Если получаем ошибку radclient:: Failed to find IP address for имя_нашего_сервера - в /etc/hosts не прописано имя нашего сервера.

Должны получить примерно такой ответ:

rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=138, length=38
	Framed-IP-Address = 10.0.0.10
	Framed-IP-Netmask = 255.255.255.255
	Framed-Protocol = PPP

В ином случае тушим radius и запускаем в режиме детального вывода:

/usr/local/etc/rc.d/radiusd stop
radiusd -X

Настройка mpd

pkg install mpd5

Ведение логов

echo '!mpd' >> /etc/syslog.conf
echo '*.* /var/log/mpd.log' >> /etc/syslog.conf
touch /var/log/mpd.log
killall -HUP syslogd

Ротация логов:

echo '/var/log/mpd.log 600 5 100 * JC' >> /etc/newsyslog.conf

описание параметров ротации:

  • 600 - права на файлы
  • 5 - количество файлов в ротации
  • 100 - ротация будет произведена при достижении лога 100 кб
  • * - ротация по времени отключена
  • JC - упаковка файлов утилитой bzip2


Автозапуск:

echo mpd_enable=YES >> /etc/rc.conf
ee /usr/local/etc/mpd5/mpd.conf

вставляем текст:

startup:
        set user admin deletempd
        set console self 127.0.0.1 5005
        set console open
        set web self 0.0.0.0 5006
        set web open

default:
        load pppoe_server

pppoe_server:

        create bundle template B
        set ipcp ranges 1.1.1.1/32 127.0.0.2/32
        set ipcp dns 1.1.1.1
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e56
        set mppc yes e128
        set mppc yes stateless
        set ecp disable dese-bis dese-old

        create link template common pppoe
        set link enable multilink
        set link action bundle B
        set link disable chap pap eap
        set link enable pap
        load radius
        set pppoe service "*"

        create link template fxp1 common
        set link max-children 1000
        set pppoe iface fxp1
        set link enable incoming
radius:
        set radius server localhost hardpass5 1812 1813
        set radius retries 3
        set radius timeout 3
        set radius me 127.0.0.1
        set auth acct-update 45
        set auth enable radius-auth
        set auth enable radius-acct
        set radius enable message-authentic

Комментарии к mpd.conf:

  • Все строки, кроме комментариев и ссылок (строки которые заканчиваются на двоеточие), должны начинаться с отступа (пробела или табуляции).
  • admin и deletempd - логин и пароль для доступа к управлению mpd5 через консоль или web-интерфейс (http://xx.xx.xx.xx:5006/). Не забудьте в фаерволе открыть tcp порт 5006.
  • 1.1.1.1 - один из ip вашего сервера. Этот ip будет использован в туннеле: ip сервера <-> клиентский ip. Автор обычно прописывает этот ip на локальной заглушке.
  • dns 1.1.1.1 - dns-сервер. Через пробел можно указать несколько.
  • fxp1 - Интерфейс, на который будут приниматься pppoe соединения. Обратите внимание: указывается в двух местах конфига.
  • acct-update 45 - период посылки accounting пакетов (используем для поддержания авторизаций) 45 секунд.
chmod 600 /usr/local/etc/mpd5/mpd.conf
/usr/local/etc/rc.d/mpd5 forcestart
tail -f /var/log/mpd.log