Документация → Настройка PPPoE сервера mpd5

Первая часть состоит из описания принципа работы, можете ее пропустить и перейти к настройке.

Описание принципа работы NoDeny + mpd5 + radius

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

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

Комментарии

Mysql-процедура radreply для получения ip клиента запускает функцию get_ip, которая смотрит есть ли у данного клиента статический ip в таблице ip_pool. Если нет, то пытается выделить динамический (поле type='dynamic'). При этом поле release устанавливается в значение времени, когда этот ip следует освободить. Процедура set_auth периодически обновляет это поле (аналогично полю last таблицы auth_now). Таким образом, пока клиент авторизован, поле release всегда указывает в будущее.

После того, как клиент перестает быть авторизованным и release становится равным текущему времени - динамический ip «отвязывается» от клиента (освобождается). Set_auth всегда устанавливает release на несколько минут в будущее, чтобы ip не освободился до того момента как будет получена статистика трафика. В противном случае, ip мог бы быть выдан другому абоненту, после чего ему был бы начислен трафик предыдущего.

При выдаче динамического ip, функция get_ip также проверяет есть ли у клиента услуга с тегом realip. Если да, то выбирается ip, у которого поле realip = 1.

Настройка Radius

Устанавливаем radius

команда bash
cd /usr/ports/net/freeradius2 && make install clean

Ставим галку напротив MYSQL, если не стоит.

команды bash
cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/
echo radiusd_enable=YES >> /etc/rc.conf
ee /usr/local/etc/raddb/radiusd.conf
расскомментируем строку
$INCLUDE sql.conf
команда bash
ee /usr/local/etc/raddb/sites-enabled/default

Файл default состоит из нескольких секций:

название секции {
   данные
}

Вы должны последовательно в секциях:

раскомментировать строку sql.

Логинимся в mysql

mysql -u nodeny --password=`perl -e'require "/usr/local/nodeny/sat.cfg"; print $cfg::Db_pw;'` nodeny

Проверяем выдачу ip клиенту c id=1 (измените на существующий id).

команда mysql
SELECT get_ip(1);

Создаем mysql-процедуры

Внимание! hardpass заменить на ключ из файла sat.cfg

команды mysql. Процедура проверки логина-пароля
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 ;
команды mysql. Процедура получения атрибутов подключения
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 ;
команды mysql. Процедура поддержания авторизации
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 ;
команды mysql. Процедура разъединения
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 ;

Проверяем
/usr/local/etc/rc.d/radiusd start
radtest login pass 127.0.0.1 0 hardpass5

где login и test соответственно логин и пароль реально существующей клиентской записи в NoDeny.


Настройка mpd5

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

Будет выведена табличка с вопросом какие дополнительные модули установить. Они нам не понадобятся.

Ведение логов
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