Pppoe
PPPoE на Mikrotik
На сервере 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 10.1.0.11 { secret = hardpass5 shortname = Mikrotik nastype = cisco }
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