![](https://habrastorage.org/getpro/habr/post_images/606/2a9/44a/6062a944a625def9fe5876e4399edeb4.png)
Подготовленный ранее цикл статей, посвященный организации безопасности сетей, построенных на оборудовании MikroTik, вызвал определенный интерес у сообщества. В процессе обсуждения представленного материала стало понятно, что у некоторых пользователей подобное оборудование установлено дома (не удивительно, ведь сама простая модель стоит всего 1500 рублей), в связи с чем решено подготовить отдельный материал, посвященный возможностям RouterOS по организации родительского контроля. Поговорим о различных подходах, настройках, сопрягаемых решениях, касающихся предметной области.
Материалы поделены на две статьи. В первой части подробно рассмотрим организацию функционирования DNS, поговорим о работе с проходящим через маршрутизатор трафиком на L3 уровне посредством Firewall Filter и связанного с ним Ip Kid-control. Во второй части статьи подробно рассмотрим прикладное применение маркировки трафика посредством Firewall Mangle и сделаем выводы, касающиеся возможностей оборудования MikroTik по организации родительского контроля. Что-то новое никому не известное материалы статьи не раскрывают, но при этом показывают прикладное применение различных сетевых настроек, и решение поставленной задачи.
▍ 1. Настройка DNS
Определим имеющиеся условия. Роутер MikroTik подключен к интернет провайдеру, работает NAT, раздается сеть Wi-Fi, которой пользуются все члены семьи. Классическое домашнее решение. Первое, с чего следует начать, это с указания настроек для DNS сервера маршрутизатора:
/ip dns set allow-remote-requests=yes servers=77.88.8.7,77.88.8.3
В примере указаны, так называемые, семейные общедоступные сервера от Яндекса, которые должны «фильтровать» часть взрослого контента. На самом деле, там полно всего, чего бы многие предпочли не показывать детям. На рынке существуют более гибкие платные настраиваемые под себя решения, такие как Skydns и другие. Они имеют личные кабинеты, в которых выполняются необходимые настройки. Всего 500 рублей в год, очень даже адекватная стоимость.
Чтобы заданные на клиентах статические DNS сервера не смогли отработать (хотя вряд ли дети смогут сделать что-то подобное), редиректим все DNS запросы на маршрутизатор:
/ip firewall nat
add action=redirect chain=dstnat comment="Redirect DNS in NAT" dst-port=53 protocol=udp src-address=10.0.0.0/24 to-ports=53
Гипотетическим минусом использования платных DNS серверов является факт передачи открытой привязанной к себе (или членам семьи) информации третьим лицам, тем же DNS провайдерам. Поэтому идем дальше. Будем использовать общедоступные DNS сервера, при этом для не благонадежных сайтов установим статические записи прямо на MikroTik:
/ip dns static add address=127.0.0.1 regexp=\\\\*example\\.com\$
Как видно из примера, запросы на сайты вида example.com, other.example.com, abrakatabra.example.com (субдомены) будут направлены на localhost, другими словами, в никуда. Команда для очистки кеш DNS сервера, если что:
/ip dns cache flush
Подготовим простейшую html страничку заглушку для родительского контроля:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Родительский контроль</title>
</head>
<body>
<h1>Заблокировано!</h1>
</body>
</html>
![](https://habrastorage.org/webt/h-/gl/4u/h-gl4ukflrvajubyq8z9ciouv_w.jpeg)
Чтобы ее демонстрировать при попытках перехода детей на контент, запрещенный родителями, нужно развернуть web сервер. Сделать это на MikroTik, конечно, заманчиво. Скажу сразу, что пытаться прикручивать сюда работу Hotspot – это плохая идея, потому что он предназначен для других целей и не нужно городить огород. Как вариант, можно воспользоваться технологией виртуального роутера от MikroTik (/metarouter). Как это сделать ранее рассмотрено на Хабре. Однако есть минимальные требования к аппаратной части вашего роутера: процессор mips или ppc, наличие свободных 48Мб оперативной памяти и 24Мб на диске. А это уже не устройства для дома, и 1500 рублями здесь не отделаешься. Поэтому рекомендую посмотреть в сторону одноплатника Raspberry Pi или VDS всего за 130 рублей в месяц:
![](https://habrastorage.org/webt/up/yp/ld/upypldkyejkipzx1nx2t3i9yykg.jpeg)
Вынести страницу заглушку на внешний сервер – это отличная идея, ведь всегда его можно использовать и под другие задачи, а также никаких проблем с электричеством и вписыванием железа в семейный интерьер. Устанавливаем web сервер:
apt install apache2
a2enmod ssl
mkdir -p /var/www/example.com/
chown www-data:www-data /var/www/example.com/
Сюда кладем нашу HTML заглушку => /var/www/example.com/index.html
nano /etc/apache2/sites-available/example.com.conf
<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /root/example.com.crt
SSLCertificateKeyFile /root/example.com.key
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/example.com/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
a2ensite example.com.conf
a2dissite 000-default.conf
systemctl restart apache2
Запросы к web серверу на любые домены отправляем на нашу страницу заглушку (<VirtualHost *:443 / 80>), при этом запросы по HTTPS редиректим на HTTP. Сертификат используем невалидный (или самоподписанный), о чем, конечно, браузер будет нас настойчиво уведомлять:
![](https://habrastorage.org/webt/lp/bp/m-/lpbpm-lo6ho0muev-ad1klydr38.jpeg)
Теперь необходимо составить список сайтов, которые подлежат родительской блокировке. Начнем логировать все DNS запросы прямо на RouterOS (пропускаем мимо содержание пакетов):
/system logging action add name=DNS target=memory
/system logging add action=DNS topics=dns,!packet
![](https://habrastorage.org/webt/zg/wk/wv/zgwkwvojnovr5c2fhjpbswn8znu.jpeg)
Логи можно собирать и обрабатывать на удаленном устройстве, например на VDS при помощи Graylog. Данный вопрос уже раскрыт ранее. Для того, чтобы все остальные члены семьи, в том числе телевизор, не попадал под контроль, следует настроить на маршрутизаторе следующие действия:
1) В DHCP сервере статически закрепить IP адреса за детскими устройствами:
/ip dhcp-server lease
add address=10.0.0.254 client-id=1:11:22:33:cc:bb:aa mac-address=11:22:33:cc:bb:aa server=server_home
add address=10.0.0.253 client-id=1:22:33:44:cc:ba:aa mac-address=22:33:44:cc:ba:aa server=server_home
Или так:
/ip dhcp-server lease make-static numbers=1
/ip dhcp-server lease make-static numbers=2
2) Собрать полученные IP адреса в один address-list:
/ip firewall address-list
add address=10.0.0.254 list=children
add address=10.0.0.253 list=children
3) Указать в DHCP сервере общедоступные DNS (предварительно отключив описанное выше правило /ip firewall nat add action=redirect…):
/ip dhcp-server network
add address=10.0.0.0/24 dns-server=77.88.8.8,77.88.8.1 gateway=10.0.0.1 netmask=24
4) Перехватывать DNS запросы от детских устройств и натировать соответственно:
/ip firewall nat
add action=dst-nat chain=dstnat comment="DST-NAT Children to localDnsServer" dst-port=53 protocol=udp src-address-list=children to-addresses=10.0.0.1
Теперь представим, что у нас есть еще дача, на которой необходимо так же иметь родительский контроль, кроме этого родственники с детьми, друзья, коллеги, которые просят сделать им аналогичные сервисы. Тогда уже есть смысл вынести DNS сервер с MikroTik на VDS, IP адрес которого использовать на различных устройствах. Настраиваем необходимый софт:
apt install bind9 dnsutils
nano /etc/bind/named.conf.options
options {
interface-interval 0;
version none;
recursion yes;
forwarders { 77.88.8.7; 77.88.8.3; };
allow-query { 127.0.0.1; 192.168.15.0/24 };
};
Имеем ввиду, что зоны, которые не обслуживаются нашим сервером, будут рекурсивно запрошены у forwarders. Таким образом, ваш сервер может быть задействован в DDOS атаках, когда боты найдут IP вашего VDS и начнут постоянно запрашивать ANY DNS записи для атакуемого ресурса. Или обратная вариация, когда запрашиваться будут значительные легитимные ANY DNS записи, а в качестве источника запроса указываться IP адрес атакуемого ресурса (DNS Amplification Attack). Поэтому рекомендую ограничить запросы только с VPN сетки 192.168.15.0/24 (или пула IP вашего провайдера хотя бы).
Далее настраиваем зоны, которые будем «глушить»:
nano /etc/bind/named.conf.local
zone "example.com" {
type master;
file "/etc/bind/db.example.com ";
};
nano /etc/bind/db.example.com
$TTL 360
$ORIGIN example.com.
@ IN SOA example.com. admin.example.com. (
1 ; Serial
1d ; Refresh
1h ; Retry
1w ; Expire
2h ; Negative Cache TTL
)
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
@ IN A IP VDS сервера
ns1.example.com. IN A IP VDS сервера
ns2.example.com. IN A IP VDS сервера
* IN A IP VDS сервера
Разумеется, сюда же на VDS переедет и web сервер с HTML заглушкой. Настраиваем логирование DNS запросов, чтобы можно было их анализировать и дополнять блокируемые зоны:
nano /etc/apparmor.d/usr.sbin.named
/var/log/bind9/** rw,
/var/log/bind9/ rw,
systemctl restart apparmor
mkdir /var/log/bind9
chown bind:bind /var/log/bind9/
nano /etc/bind/named.conf
logging {
channel my_file {
file "/var/log/bind9/bind.log" versions 3 size 100m;
severity info;
print-time yes;
print-category yes;
print-severity yes;
};
category default { my_file; };
category queries { my_file; };
category lame-servers { null; };
};
systemctl restart bind9
tail /var/log/bind9/bind.log -F
Лог будет выглядеть примерно так:
14-Oct-2021 00:10:52.237 queries: info: client @0xb3785670 192.168.1.8#37426 (example.com): query: example.com IN A + (192.168.1.9)
14-Oct-2021 00:10:52.243 queries: info: client @0xb3785670 192.168.1.8#33533 (example.com): query: example.com IN AAAA + (192.168.1.9)
Здесь мы настроили Bind9 — наиболее распространенный DNS сервер. Конечно, он должен работать как минимум в паре, так называемые master и slave. Однако MikroTik разрешает работать только с одним сервером.
Если зон будет много, тогда есть смысл выбрать более мощное виртуальное устройство. Сейчас это стоит не больших денег. В результате получается что-то вроде нашего собственного частно-коллективного решения, которое можно обкрутить web интерфейсом, внутренней логикой и после этого даже попытаться монетизировать )).
▍ 2. Firewall Filter
Теперь вернемся к нашему MikroTik и покажем, как еще можно ограничить трафик. В дело вступает Firewall. RouterOS позволяет динамически создавать address-list по доменному имени:
/ip firewall address-list
add address=youtube.com list=Block_site_by_dns_name
add address=vk.com list=Block_site_by_dns_name
add address=www.youtube.com list=Block_site_by_dns_name
Доменные имена автоматически разрезолвятся в IP адреса:
/ip firewall address-list print
Flags: X - disabled, D - dynamic
# LIST ADDRESS CREATION-TIME TIMEOUT
3 Block_site_by_dns_name youtube.com oct/10/2021 22:25:51
5 Block_site_by_dns_name vk.com oct/10/2021 22:26:40
6 D ;;; vk.com
Block_site_by_dns_name 87.240.190.72 oct/10/2021 22:26:40
7 D ;;; vk.com
Block_site_by_dns_name 87.240.190.78 oct/10/2021 22:26:40
8 D ;;; vk.com
Block_site_by_dns_name 87.240.190.67 oct/10/2021 22:26:40
9 D ;;; vk.com
Block_site_by_dns_name 93.186.225.208 oct/10/2021 22:26:40
10 D ;;; vk.com
Block_site_by_dns_name 87.240.139.194 oct/10/2021 22:26:40
11 D ;;; vk.com
Block_site_by_dns_name 87.240.137.158 oct/10/2021 22:26:40
12 D ;;; youtube.com
Block_site_by_dns_name 173.194.221.91 oct/10/2021 22:36:53
13 D ;;; youtube.com
Block_site_by_dns_name 173.194.221.136 oct/10/2021 22:36:53
14 D ;;; youtube.com
Block_site_by_dns_name 173.194.221.93 oct/10/2021 22:36:53
15 D ;;; youtube.com
Block_site_by_dns_name 173.194.221.190 oct/10/2021 22:36:53
Ну и далее просто блокируем весь не угодный трафик на L3:
/ip firewall filter
add action=accept chain=input comment="Accept established,related" connection-state=established,related
add action=drop chain=input comment="Drop invalid" connection-state=invalid
add action=accept chain=forward comment="Accept established,related" connection-state=established,related
add action=drop chain=forward comment="Drop invalid" connection-state=invalid
add action=drop chain=forward comment=Drop_sites_by_address_list dst-address-list=Block_site_by_dns_name
Первые правила перед блокировкой важны. Они разгружают ваш маршрутизатор, так как установленные и связанные с ними соединения не будут обрабатываться всеми правилами Firewall.
▍ 3. Kid-control
В самом конце данной статьи расскажу про имеющееся в RouterOS готовое решение Kid-control. Его функционал позволяет удобно автоматизировать то, что можно всегда сделать скриптами. Добавляем по MAC адресам в
/ip kid-control device
все детские устройства:
/ip dhcp-server lease print
Flags: X - disabled, R - radius, D - dynamic, B - blocked
# ADDRESS MAC-ADDRESS HOST-NAME SERVER RATE-LIMIT STATUS LAST-SEEN
0 D 10.0.0.253 AA:BB:11:22:33:44 LittleFood server_... bound 21m2s
/ip kid-control device add mac-address=AA:BB:11:22:33:44 name=Pasha_Iphone user=Pasha
![](https://habrastorage.org/webt/lq/54/zh/lq54zh5jlpf4iyvtljugtynn1m4.jpeg)
После этого задаем поведенческие правила для работы детского интернета: в какой день недели ему работать и ограничения по скорости.
/ip kid-control add name=Pasha
![](https://habrastorage.org/webt/fx/pd/6w/fxpd6wi6twnxbvtkccrephraa-8.jpeg)
В результате RouterOS создаст динамические правила в Firewall Filter:
/ip firewall filter print
Flags: X - disabled, I - invalid, D - dynamic
0 D ;;; Pasha_Iphone, kid-control
chain=forward action=reject dst-address=10.0.0.253
Вот и весть
/ip kid-control
от RouterOS, по мне так полная скука.▍ 4. Подведем промежуточные итоги
Представленные возможности уже позволяют ограничить трафик, проходящий через ваш маршрутизатор. Но RouterOS на этом еще не заканчивается. Самое интересное будет в следующей части статьи. Там же будут сделаны общие выводы по комплексной технической организации родительского контроля на оборудовании MikroTik.
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)