Pppoe

Матеріал з NoDeny
Версія від 20:00, 29 жовтня 2016, створена Sv (обговорення | внесок) (Защищена страница «Pppoe» ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администратор…)
Перейти до навігації Перейти до пошуку

PPPoE на Mikrotik

Возможна работа как со статическими (когда 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('test');

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

  • 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

Продолжаем настройку. Добавим микротик (10.1.0.11) в настройки радиуса:

ee /usr/local/etc/raddb/clients.conf

Добавляем:

client 1.1.1.1 {
        secret      = hardpass5
        shortname   = Mikrotik
        nastype     = cisco
}

Здесь 1.1.1.1 - ip Микротика (тот ip, который смотрит на сервер NoDeny - смотрите схему выше)

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