Микротик: відмінності між версіями
Sv (обговорення | внесок) |
Sv (обговорення | внесок) |
||
(Не показано 99 проміжних версій цього користувача) | |||
Рядок 1: | Рядок 1: | ||
== Краткий обзор == | |||
Связь Микротика с NoDeny осуществляется по radius-протоколу. Вам необходимо поставить на сервер биллинга программу radius-сервер (установка описана ниже). Эта программа будет принимать запросы от Микротика, проверять параметры авторизации и возвращать Микротику ip адрес абонента. | |||
[[Файл:Mikrotik_radius.png]] | |||
<br><br> | |||
Микротик может предоставлять доступ в интернет по двум технологиям: посредством DHCP или PPPoE. Настройка радиус-сервера и процедур mysql отличаются у этих технологий - будте внимательны. | |||
Далее вам необходимо определиться каким образом будет устанавливаться скорость: | |||
* через радиус-атрибуты (в радиус ответе, кроме ip будут присутствовать данные по скорости) | |||
* через модуль биллинга, который будет "заходить" на микротик и устанавливать скорость | |||
< | <br> | ||
Установка скорости через атрибуты более производительна, но теряется возможность динамичного изменения скорости - скорость может быть изменена только в момент, когда Микротик сделает запрос на radius-сервер. Это происходит с интервалом в 50 секунд для PPPoE и гораздо бОльшим интервалом в случае DHCP (пока не истечет время аренды ip). Таким образом, для PPPoE можно применить данный способ, а для DHCP мы бы не рекомендовали. | |||
< | <br> | ||
==PPPoE== | |||
Настройка описана '''[[pppoe|здесь]]''' | |||
== DHCP == | |||
Настройка описана '''[[mirkotik dhcp|здесь]]''' | |||
<br><br> | |||
< | |||
< | |||
=Включение/выключение доступа в интернет= | =Включение/выключение доступа в интернет= | ||
Обратите внимание, что вне зависимости от того, заблокирован ли доступ в интернет, подключен ли тариф и т.д - NoDeny всегда разрешает создавать соединение. Благодаря этому у пользователя появляется возможность зайти в личный кабинет, произвести оплату или написать что-либо в техподдержку. Блокировка доступа в интернет осуществляется на уровне сервера доступа. В микротике мы будем это делать путем разрешения NAT только для тех ip, которые находятся в таблице goodboys: | |||
<pre> | <pre> | ||
/ip service enable api | /ip service enable api | ||
/ip firewall nat add action=masquerade chain=srcnat disabled=no out-interface=ether2 src-address=10. | /ip firewall nat add action=masquerade chain=srcnat disabled=no out-interface=ether2 src-address=10.0.0.0/16 src-address-list=goodboys | ||
</pre> | </pre> | ||
Рядок 155: | Рядок 41: | ||
* ether2 - интерфейс, который смотрит в интернет | * ether2 - интерфейс, который смотрит в интернет | ||
* 10. | * 10.0.0.0/16 - сеть абонентов | ||
На сервере | На сервере NoDeny необходимо запустить модуль, который будет управлять таблицей goodboys. Создадим его конфиг на основе базового (сделаем копию и отредактируем): | ||
<source lang="bash"> | <source lang="bash"> | ||
Рядок 165: | Рядок 51: | ||
</source> | </source> | ||
В первой строке редактируемого файла добавим единичку в mikrotik.cfg.pm: | В первой строке редактируемого файла добавим единичку в "mikrotik.cfg.pm": | ||
<pre> | <pre> | ||
Рядок 171: | Рядок 57: | ||
</pre> | </pre> | ||
А также изменим параметры подключения к | А также изменим параметры подключения к микротику: | ||
<pre> | <pre> | ||
$host = ' | $host = '1.1.1.1'; | ||
$user = 'admin'; | $user = 'admin'; | ||
$pass = ''; | $pass = ''; | ||
Рядок 198: | Рядок 84: | ||
</source> | </source> | ||
<br> | |||
=Заглушка= | =Заглушка= | ||
Рядок 206: | Рядок 93: | ||
<pre> | <pre> | ||
/ip firewall nat | /ip firewall nat | ||
add action=dst-nat chain=dstnat dst-address=! | add action=dst-nat chain=dstnat dst-address=!1.1.1.2 src-address=!1.1.1.2 dst-port=80 fragment=no protocol=tcp src-address-list=!goodboys to-addresses=1.1.1.2 to-ports=8080 | ||
</pre> | </pre> | ||
Здесь | Здесь 1.1.1.2 - ip сервера с админкой NoDeny | ||
Поскольку сервер с админкой не предоставляет доступ в интернет абонентам, необходимо изменить фаервол на следующий: | Поскольку сервер с админкой не предоставляет доступ в интернет абонентам, необходимо изменить фаервол на следующий: | ||
Рядок 224: | Рядок 111: | ||
${f} add 350 allow tcp from any to any 22,80,443,8080 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 400 allow udp from any to any 53 in | ||
${f} add 450 allow udp from | ${f} add 450 allow udp from 1.1.1.1 to any 1812,1813 in | ||
${f} add 500 deny ip from any to any in | ${f} add 500 deny ip from any to any in | ||
${f} add 600 fwd | ${f} add 600 fwd 1.1.1.1 tcp from any 8080 to any | ||
${f} add 650 allow udp from any 53 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 700 allow tcp from any to any setup keep-state | ||
Рядок 234: | Рядок 121: | ||
</pre> | </pre> | ||
Здесь 10.1.0.11 - | Здесь 1.1.1.1 - ip микротика. | ||
Если сервер с админкой NoDeny не выполняет функции DNS - удаляем правила 400 и 650. | |||
Если заглушка не запущена (модуль cap), необходимо записать в автозагрузку (/etc/rc.local) и запустить с консоли: | |||
<source lang="bash"> | |||
/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=cap -d & | |||
</source> | |||
<br> | |||
<br> | |||
=Скорость по Radius= | |||
Более оптимальный вариант управления микротик: | |||
* включение/выключение доступа по API | |||
* скорость по Radius | |||
Для этого необходимо установить модуль "Radius атрибуты". | |||
==Скорость по Radius для варианта DHCP== | |||
Меняем mysql-процедуры: | |||
<pre> | |||
DROP FUNCTION IF EXISTS strSplit; | |||
CREATE FUNCTION strSplit(x MEDIUMTEXT, delim MEDIUMTEXT, pos int) RETURNS MEDIUMTEXT | |||
RETURN | |||
TRIM(BOTH '\r' FROM TRIM( | |||
REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), | |||
LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1), delim, '') | |||
)); | |||
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; | |||
DECLARE add_attr MEDIUMTEXT; | |||
DECLARE line MEDIUMTEXT; | |||
DECLARE i INT DEFAULT 1; | |||
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; | |||
UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id; | |||
UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id; | |||
ELSE | |||
START TRANSACTION; | |||
SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool | |||
WHERE uid=0 AND type='dynamic' AND `release` < UNIX_TIMESTAMP() | |||
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; | |||
UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600 | |||
WHERE ip = INET_ATON(usr_ip); | |||
END IF; | |||
SELECT NULL, login, 'Framed-IP-Address', usr_ip, '='; | |||
SELECT NULL, login, 'Session-Timeout', '600', '='; | |||
SELECT radius_attr INTO add_attr FROM users_services | |||
WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1; | |||
attr_loop: WHILE TRUE DO | |||
SELECT strSplit(add_attr, '\n', i) INTO line; | |||
IF LENGTH(line) = 0 OR i > 20 THEN LEAVE attr_loop; END IF; | |||
IF line LIKE '%+=%' THEN | |||
SELECT NULL,login,strSplit(line, '+=', 1),strSplit(line, '+=', 2),'+='; | |||
ELSEIF line LIKE '%=%' THEN | |||
SELECT NULL,login,strSplit(line, '=', 1),strSplit(line, '=', 2),'='; | |||
END IF; | |||
SET i = i + 1; | |||
END WHILE; | |||
END$$ | |||
DELIMITER ; | |||
</pre> | |||
<br> | |||
=Если что-то не получается= | |||
* Проверяем, что в настройках NoDeny есть пул ip адресов с типом "динамический". При этом ip, указанные в настройках микротика | |||
<pre> | |||
dns-server=10.1.0.11 gateway=10.1.0.11 netmask=16 | |||
</pre> | |||
должны попадать в этот диапазон. Например, мы можем сделать пул ip: 10.1.2.100 ... 10.1.9.254 - они попадают в сеть 10.1.0.0/16 так же как и 10.1.0.11 | |||
Если | * Запустите radiusd с ключем -X и включите абонентский компьютер. Если radiusd не получит никаких запросов: | ||
** Запустите tcpdump -iem0 -p -n udp 1812. Если никакие запросы на приходят - что-то не так с настройкой микротик | |||
** На время разрешите полностью фаервол (ipfw add 10 allow ip from any to any) | |||
** Если запросы приходят на radius, но он выдает ошибки - обратите внимание на то, какого рода эти ошибки: в настройке radius или ошибки при выполнении sql-запросов |
Поточна версія на 10:03, 21 вересня 2018
Краткий обзор
Связь Микротика с NoDeny осуществляется по radius-протоколу. Вам необходимо поставить на сервер биллинга программу radius-сервер (установка описана ниже). Эта программа будет принимать запросы от Микротика, проверять параметры авторизации и возвращать Микротику ip адрес абонента.
Микротик может предоставлять доступ в интернет по двум технологиям: посредством DHCP или PPPoE. Настройка радиус-сервера и процедур mysql отличаются у этих технологий - будте внимательны.
Далее вам необходимо определиться каким образом будет устанавливаться скорость:
- через радиус-атрибуты (в радиус ответе, кроме ip будут присутствовать данные по скорости)
- через модуль биллинга, который будет "заходить" на микротик и устанавливать скорость
Установка скорости через атрибуты более производительна, но теряется возможность динамичного изменения скорости - скорость может быть изменена только в момент, когда Микротик сделает запрос на radius-сервер. Это происходит с интервалом в 50 секунд для PPPoE и гораздо бОльшим интервалом в случае DHCP (пока не истечет время аренды ip). Таким образом, для PPPoE можно применить данный способ, а для DHCP мы бы не рекомендовали.
PPPoE
Настройка описана здесь
DHCP
Настройка описана здесь
Включение/выключение доступа в интернет
Обратите внимание, что вне зависимости от того, заблокирован ли доступ в интернет, подключен ли тариф и т.д - NoDeny всегда разрешает создавать соединение. Благодаря этому у пользователя появляется возможность зайти в личный кабинет, произвести оплату или написать что-либо в техподдержку. Блокировка доступа в интернет осуществляется на уровне сервера доступа. В микротике мы будем это делать путем разрешения NAT только для тех ip, которые находятся в таблице goodboys:
/ip service enable api /ip firewall nat add action=masquerade chain=srcnat disabled=no out-interface=ether2 src-address=10.0.0.0/16 src-address-list=goodboys
Здесь:
- ether2 - интерфейс, который смотрит в интернет
- 10.0.0.0/16 - сеть абонентов
На сервере NoDeny необходимо запустить модуль, который будет управлять таблицей goodboys. Создадим его конфиг на основе базового (сделаем копию и отредактируем):
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 = '1.1.1.1'; $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=!1.1.1.2 src-address=!1.1.1.2 dst-port=80 fragment=no protocol=tcp src-address-list=!goodboys to-addresses=1.1.1.2 to-ports=8080
Здесь 1.1.1.2 - 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 1.1.1.1 to any 1812,1813 in ${f} add 500 deny ip from any to any in ${f} add 600 fwd 1.1.1.1 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
Здесь 1.1.1.1 - ip микротика.
Если сервер с админкой NoDeny не выполняет функции DNS - удаляем правила 400 и 650.
Если заглушка не запущена (модуль cap), необходимо записать в автозагрузку (/etc/rc.local) и запустить с консоли:
/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=cap -d &
Скорость по Radius
Более оптимальный вариант управления микротик:
- включение/выключение доступа по API
- скорость по Radius
Для этого необходимо установить модуль "Radius атрибуты".
Скорость по Radius для варианта DHCP
Меняем mysql-процедуры:
DROP FUNCTION IF EXISTS strSplit; CREATE FUNCTION strSplit(x MEDIUMTEXT, delim MEDIUMTEXT, pos int) RETURNS MEDIUMTEXT RETURN TRIM(BOTH '\r' FROM TRIM( REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1), delim, '') )); 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; DECLARE add_attr MEDIUMTEXT; DECLARE line MEDIUMTEXT; DECLARE i INT DEFAULT 1; 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; UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id; UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id; ELSE START TRANSACTION; SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool WHERE uid=0 AND type='dynamic' AND `release` < UNIX_TIMESTAMP() 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; UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600 WHERE ip = INET_ATON(usr_ip); END IF; SELECT NULL, login, 'Framed-IP-Address', usr_ip, '='; SELECT NULL, login, 'Session-Timeout', '600', '='; SELECT radius_attr INTO add_attr FROM users_services WHERE uid=usr_id AND tags LIKE '%,inet,%' LIMIT 1; attr_loop: WHILE TRUE DO SELECT strSplit(add_attr, '\n', i) INTO line; IF LENGTH(line) = 0 OR i > 20 THEN LEAVE attr_loop; END IF; IF line LIKE '%+=%' THEN SELECT NULL,login,strSplit(line, '+=', 1),strSplit(line, '+=', 2),'+='; ELSEIF line LIKE '%=%' THEN SELECT NULL,login,strSplit(line, '=', 1),strSplit(line, '=', 2),'='; END IF; SET i = i + 1; END WHILE; END$$ DELIMITER ;
Если что-то не получается
- Проверяем, что в настройках NoDeny есть пул ip адресов с типом "динамический". При этом ip, указанные в настройках микротика
dns-server=10.1.0.11 gateway=10.1.0.11 netmask=16
должны попадать в этот диапазон. Например, мы можем сделать пул ip: 10.1.2.100 ... 10.1.9.254 - они попадают в сеть 10.1.0.0/16 так же как и 10.1.0.11
- Запустите radiusd с ключем -X и включите абонентский компьютер. Если radiusd не получит никаких запросов:
- Запустите tcpdump -iem0 -p -n udp 1812. Если никакие запросы на приходят - что-то не так с настройкой микротик
- На время разрешите полностью фаервол (ipfw add 10 allow ip from any to any)
- Если запросы приходят на radius, но он выдает ошибки - обратите внимание на то, какого рода эти ошибки: в настройке radius или ошибки при выполнении sql-запросов