Микротик
Микротик будет выполнять следующие функции:
- dhcp либо pppoe сервер
- dns
- перенаправлять на заглушку заблокированных и неизвестных абонентов
- пускать в интернет незаблокированных абонентов
- управлять скоростью в интернет
Dhcp или Pppoe сервер будет работать по протоколу radius. Т.е. запросы на авторизацию будут пересылаться на сервер NoDeny, где мы установим Radius.
Для dchp сервера необходим модуль dhcp, который нужно преобрести дополнительно на главном сайте NoDeny. При использовании dhcp нам доступен механизм регистрации клиентского оборудования. Если мак-адрес компьютера абонента не известен - при открытии браузером любой страницы произойдет отображение формы логина, после заполнения которой, произойдет регистрация мака и в дальнейшей работе логин и пароль запрашиваться не будут пока пользователь не сменить свое оборудование (сетевую карту, роутер и т.д).
DCHP
На микротике выполним команды:
/ip dhcp-server add disabled=no interface=ether1 name=dhcp1 use-radius=yes /ip dhcp-server network add dns-server=10.1.0.11 gateway=10.1.0.11 netmask=16 /radius add address=10.1.0.1 secret=hardpass5 service=dhcp
Здесь:
- 10.1.0.1 - ip сервера NoDeny, где установлен Radius server
- 10.1.0.11 - ip микротика
- netmask=16 - маска подсети абонентов (число после слеша в сети, например: 10.1.0.0/16)
- ether1 - интерфейс микротика, смотрящий на абонентов
Установим Radius
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 }
В mysql создадим следующие процедуры:
DROP PROCEDURE IF EXISTS `radcheck`; DELIMITER $$ CREATE PROCEDURE `radcheck` (IN login VARCHAR(64)) BEGIN SELECT Null, login, 'Cleartext-Password' AS Attribute, '' AS Value,':='; END$$ DELIMITER ;
DROP PROCEDURE IF EXISTS `radreply`; DELIMITER $$ CREATE PROCEDURE `radreply`(IN login VARCHAR(64)) BEGIN DECLARE usr_mac VARCHAR(12); DECLARE usr_ip VARCHAR(15); DECLARE usr_id INT; SELECT REPLACE(login, ':', '') INTO usr_mac; SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac; IF usr_id IS NOT NULL AND usr_id>0 THEN SELECT get_ip(usr_id) INTO usr_ip; ELSE START TRANSACTION; SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool p WHERE uid=0 AND type='dynamic' AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip) ORDER BY RAND() LIMIT 1 FOR UPDATE; INSERT INTO mac_uid VALUES( NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), 0, 0, 0) ON DUPLICATE KEY UPDATE ip=IF(ip>0,ip,INET_ATON(usr_ip)), time=UNIX_TIMESTAMP(); COMMIT; SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac; END IF; SELECT NULL, login, 'Framed-IP-Address', usr_ip, '='; SELECT NULL, login, 'Session-Timeout', '600', '='; SELECT NULL, login, 'Acct-Interim-Interval', 60, '='; SELECT NULL, login, 'Acct-Status-Type', 'Accounting-On', '='; END$$ DELIMITER ;
Включение/выключение доступа в интернет
На микротик включаем NAT и разрешаем натить только те ip, которые будут в списке goodboys
/ip service enable api /ip firewall nat add action=masquerade chain=srcnat disabled=no out-interface=ether2 src-address=10.1.0.0/16 src-address-list=goodboys
Здесь:
- ether2 - интерфейс, который смотрит в интернет
- 10.1.0.0/16 - сеть абонентов
На сервере NoDeny:
cd /usr/local/nodeny/modules
cat mikrotik/create.cfg.mikrotik.cfg.pm >> MyNetwork/create.mikrotik1.cfg.pm
ee MyNetwork/create.mikrotik1.cfg.pm
В первой строке редактируемого файла добавим единичку в mikrotik.cfg.pm:
#<ACTION> file=>'cfg/mikrotik1.cfg.pm',hook=>'new'
А также изменим параметры подключения к Микротику:
$host = '10.1.0.11'; $user = 'admin'; $pass = '';
Установим новый конфиг:
cd /usr/local/nodeny/
perl install.pl -x
Запустим с выводом процесса управления микротиком на консоль:
perl noserver.pl -g=_mikrotik1.cfg.pm -v
Тестируем. Если все ок, то в автозагрузку:
echo '/usr/bin/perl /usr/local/nodeny/noserver.pl -g=_mikrotik1.cfg.pm -d &' >> /etc/rc.local
Заглушка
На микротике выполним команды:
/ip firewall nat add action=dst-nat chain=dstnat dst-address=!10.1.0.1 dst-port=80 fragment=no protocol=tcp src-address-list=!goodboys to-addresses=10.1.0.1 to-ports=8080
Здесь 10.1.0.1 - ip сервера с админкой NoDeny
Поскольку сервер с админкой не предоставляет доступ в интернет абонентам, необходимо изменить фаервол на следующий:
#!/bin/sh - f='/sbin/ipfw' ${f} add 100 deny ip from any to not me in ${f} add 150 check-state ${f} add 200 allow ip from any to any via lo0 ${f} add 300 allow icmp from any to any in ${f} add 350 allow tcp from any to any 22,80,443,8080 in ${f} add 400 allow udp from any to any 53 in ${f} add 450 allow udp from 10.1.0.11 to any 1812,1813 in ${f} add 500 deny ip from any to any in ${f} add 600 fwd 10.1.0.11 tcp from any 8080 to any ${f} add 650 allow udp from any 53 to any ${f} add 700 allow tcp from any to any setup keep-state ${f} add 750 allow udp from any to any keep-state ${f} add 800 allow ip from any to any
Здесь 10.1.0.11 - ip микротика.
Если сервер с админкой NoDeny не выполняет функции DNS - удалите правила 400 и 650.