В конце 2021 года был опубликован цикл статей, посвящённый родительскому контролю на оборудовании MikroTik. Ранее были подробно рассмотрены организация DNS, работа Firewall Filter и Ip Kid-control, возможности маркировки трафика посредством Firewall Mangle для решения указанной задачи. Представленные предложения базировались на факте неизменности MAC адресов детских беспроводных устройств. Это позволяло осуществить статическую привязку IP адресов. Однако современные мобильные операционные системы рандомизируют MAC, тем самым делая предложенные алгоритмы нежизнеспособными. Вследствие этого подготовлена третья часть из цикла статей, в которой к представленному ранее решению прикручен протокол Radius. Его применение нивелирует озвученную проблему.
Статья предназначена не для профессионалов, а для тех, кто решил внедрить предложенные ранее решения у себя в доме
1. Введение
Всё, о чём написано выше — не сразу бросилось в глаза, но зато моментально было отмечено членами сообщества в комментариях к предыдущим статьям. Начиная с версии iOS 14, iPadOS 14 и watchOS 7, устройства Apple улучшают приватность при работе с беспроводными сетями, а именно, делают MAC адрес уникальным (private Wi-Fi address) для каждой сети. В настройках мобильного девайса это выглядит так:
Дополнительно, смена MAC адреса происходит при сбросе всех настроек телефона (разумеется, при повторном подключении). А начиная с iOS 15, iPadOS 15 и watchOS 8, указанное выше расширяется ещё и дополнительными условиями. Смена MAC происходит, если телефон не подключался к сети более 6 недель, после выбора функции «Забыть сеть», если от последнего использования прошло более 2 недель. Подробнее можно почитать здесь. С операционными системами Android 10 и выше происходит примерно аналогичная ситуация. Кроме этого, частный (рандомный) MAC адрес Wi-Fi активирован в мобильных устройствах по умолчанию.
Описанные выше функции сделаны для повышения информационной безопасности, усложняя анализ мест нахождения людей, чьи телефоны непрерывно сканируют радиоэфир и подключаются к известным им беспроводным сетям, например, MT_FREE. В первую очередь это было введено для управляющих фреймов (Management MAC Protocol Data Unit» – MMPDU), предназначенных для обнаружения известных точек доступа. Необходимо выделить, что существует пассивное сканирование – беспроводной клиент ждёт широковещательный сигнальный beacon от известной ему точки доступа. И активное сканирование – клиент сам отправляет широковещательный пробный запрос (probe) в поисках доступных точек доступа. Во вторую очередь, это было введено для открытых сетей, так как они широко распространены и позволяют реально проводить поведенческую аналитику. Затем это логично распространилось на Wi-Fi сети с шифрованием.
На текущий момент имеем то, что имеем: современные мобильные устройства рандомизируют MAC адрес беспроводного интерфейса при тех или иных условиях.
2. Radius протокол на службе родительского контроля
RADIUS (Remote Authentication Dial-In User Service) – протокол для реализации аутентификации, авторизации и сбора сведений об использованных ресурсах, разработанный для передачи сведений между центральной платформой и оборудованием. В Wi-Fi сетях он может быть задействован в Enterprise mode – режиме аутентификации на базе Radius (WPA-EAP), вместо привычного режима аутентификации Personal mode, имеющего символьный пароль (WPA-PSK).
Общая схема предлагаемого решения следующая: «MikroTik + WiFi + Radius + VLAN». Каждому члену семьи будет выдан собственный логин и пароль от беспроводной сети. После его ввода MikroTik обратится для аутентификации к Radius серверу, который дополнительно вернет настройки VLAN. Для детских устройств будет функционировать отдельный виртуальный интерфейс с собственным DHCP сервером и пулом IP адресов. Исходим из того, что настройки, представленные в первой и второй части цикла статей, уже выполнены. Проверяем версию операционной системы маршрутизатора, она должна быть 7-ой:
/system package print
Columns: NAME, VERSION
# NAME VERSION
0 routeros 7.2rc4
Добавляем новый профиль для беспроводных подключений, в котором выбираем EAP аутентификацию:
/interface wireless security-profiles
add authentication-types=wpa2-eap disable-pmkid=yes group-key-update=1h mode=\
dynamic-keys name=Radius radius-called-format=mac radius-eap-accounting=\
yes supplicant-identity="" tls-mode=dont-verify-certificate
Проводим настройку нужного беспроводного интерфейса:
/interface wireless
set [ find default-name=wlan1 ] band=2ghz-onlyn channel-width=20/40mhz-XX \
country=no_country_set disabled=no frequency=auto installation=indoor \
mode=ap-bridge name=wlan1-AP-2GHz security-profile=Radius ssid=home \
vlan-mode=use-tag wireless-protocol=802.11 wps-mode=disabled
Активируем Radius клиент на MikroTik для беспроводного сервиса:
/radius
add address=127.0.0.1 service=wireless
Далее занимаемся настройкой Radius сервера. Самым простым способом является задействование интегрированного в RouterOS сервиса User-manager, который в 7 версии операционной системы был значительно переработан. Ранее доступ к нему осуществлялся посредством web-клиента по адресу IP_адрес_роутера/userman и выглядел примерно так:
На текущий момент настройка User-manager осуществляется по-другому. Для начала необходимо проверить, установлен ли в RouterOS необходимый пакет:
/system package print
Columns: NAME, VERSION
# NAME VERSION
0 user-manager 7.2rc4
1 routeros 7.2rc4
Далее генерируем новый сертификат и подписываем его:
/certificate add name=certForRadius country=Ru state=Spb locality=VO organization=unit common-name=unitCertForRadius days-valid=3650 trusted=yes
/certificate sign certForRadius
На выходе имеем примерно следующее:
/certificate print detail
Flags: K - private-key; L - crl; C - smart-card-key; A - authority; I - issued, R - revoked;
E - expired; T - trusted
0 KL A T name="certForRadius" digest-algorithm=sha256 key-type=rsa country="Ru" state="Spb"
locality="VO" organization="unit" common-name="unitCertForRadius" key-size=2048
subject-alt-name="" days-valid=365 trusted=yes
key-usage=digital-signature,key-encipherment,data-encipherment,key-cert-sign,crl-sign,
tls-server,tls-client
serial-number="24653EED63B95DC8"
fingerprint="abb1ee9506ca2869f8c54be0310f97150da85cf8d3283b808bb6d94f35c72044" akid=""
skid=dd0e5c711ac4048a7b90f4e60b2705c46ad97284 invalid-before=mar/14/2022 06:46:00
invalid-after=mar/14/2023 06:46:00 expires-after=52w23h23m43s
Делаем необходимые настройки Radius сервера:
/user-manager
set certificate=certForRadius enabled=yes
/user-manager router
add address=127.0.0.1 name=thisRouter
Готовим разные VLAN для родительских и детских устройств с идентификаторами 100 и 200 соответственно:
/interface vlan
add interface=bridge_home name=vlan100-parent vlan-id=100
add interface=bridge_home name=vlan200-chlidren vlan-id=200
Для каждого виртуального интерфейса назначаем IP адрес из отдельной сети. Родительские устройства будут принадлежать сети 10.0.1.0/24, детские устройства 10.0.2.0/24 (напомню, что проводные устройства работают в сети 10.0.0.0/24):
/ip address
add address=10.0.1.1/24 interface=vlan100-parent network=10.0.1.0
add address=10.0.2.1/24 interface=vlan200-chlidren network=10.0.2.0
Далее настраиваем новые пулы IP адресов:
/ip address
add address=10.0.1.1/24 interface=vlan100-parent network=10.0.1.0
add address=10.0.2.1/24 interface=vlan200-chlidren network=10.0.2.0
И наконец, добавляем два новых DHCP сервера для каждой из сетей:
/ip dhcp-server network
add address=10.0.1.0/24 comment=Network-wifi-parent dns-server=10.0.1.1 gateway=10.0.1.1
add address=10.0.2.0/24 comment=Network-wifi-children dns-server=10.0.2.1 gateway=10.0.2.1
/ip dhcp-server
add address-pool=pool_wifi_parent interface=vlan100-parent lease-time=1d name=server-parent
add address-pool=pool_wifi_children interface=vlan200-chlidren lease-time=1d name=server-children
На этом основная настройка MikroTik выполнена, переходим к теме ограничения доступа в интернет. Расширяем address-list, созданный ранее, новой сетью, закреплённой за детскими устройствами:
/ip firewall address-list
add address=10.0.2.0/24 comment=wifi_children list=children
Добавляем новые правила в Firewall NAT, чтобы на подключённых устройствах работал интернет, а также заворачиваем DNS запросы от детских устройств из новой сети (10.0.2.0/24) на встроенный в RouterOS DNS сервер:
/ip firewall nat
add action=src-nat chain=srcnat comment="SRC-NAT for wifi_parent" \
src-address=10.0.1.0/24 to-addresses=IP_WAN
add action=src-nat chain=srcnat comment="SRC-NAT for wifi_children" \
src-address=10.0.2.0/24 to-addresses=IP_WAN
add action=redirect chain=dstnat comment=\
"Redirect DNS in NAT for wifi_children" dst-port=53 protocol=udp \
src-address=10.0.2.0/24 to-ports=53
В настройках Firewall Mangle, подробно описанных во второй части цикла статей, убираем упоминания интерфейса bridge. Получаем правила вроде тех, что представлены под спойлером:
/ip firewall mangle
add action=passthrough chain=forward comment=\
"---------- Mangle DNS traffic ----------" disabled=yes
add action=mark-connection chain=prerouting comment=\
"LAN=>WAN connections DNS Children" connection-mark=no-mark dst-port=53 \
new-connection-mark="LAN=>WAN connections DNS Children" passthrough=yes \
protocol=udp src-address-list=children
add action=mark-packet chain=prerouting comment=\
"LAN=>WAN packets DNS Children" connection-mark=\
"LAN=>WAN connections DNS Children" new-packet-mark=\
"LAN=>WAN packets DNS Children" passthrough=yes
add action=passthrough chain=forward comment=\
"---------- Search in DNS traffic ----------" disabled=yes
add action=mark-packet chain=prerouting comment=\
"Children Filter Content \"xvideo\"" content=xvideo new-packet-mark=\
"Children Filter" packet-mark="LAN=>WAN packets DNS Children" \
passthrough=no
add action=mark-packet chain=prerouting comment=\
"Children Filter Content \"porn\"" content=porn new-packet-mark=\
"Children Filter" packet-mark="LAN=>WAN packets DNS Children" \
passthrough=no
add action=mark-packet chain=prerouting comment=\
"Children Filter Content \"drug\"" content=drug new-packet-mark=\
"Children Filter" packet-mark="LAN=>WAN packets DNS Children" \
passthrough=no
add action=passthrough chain=forward comment=\
"---------- Mangle ALL, HTTPS, QUIC traffic ----------" disabled=yes
add action=mark-connection chain=forward comment=\
"LAN=>WAN connections Children" connection-mark=no-mark \
new-connection-mark="LAN=>WAN connections Children" out-interface=\
wlan2-station-5GHz passthrough=yes src-address-list=children
add action=mark-connection chain=forward comment=\
"LAN=>WAN connections HTTPS Children" connection-mark=\
"LAN=>WAN connections Children" dst-port=443 new-connection-mark=\
"LAN=>WAN connections HTTPS Children" passthrough=yes protocol=tcp
add action=mark-connection chain=forward comment=\
"LAN=>WAN connections QUIC Children" connection-mark=\
"LAN=>WAN connections Children" dst-port=443 new-connection-mark=\
"LAN=>WAN connections QUIC Children" passthrough=yes protocol=udp
add action=mark-packet chain=forward comment=\
"LAN=>WAN packets Children HTTPS+QUIC" connection-mark=\
"LAN=>WAN connections HTTPS Children" new-packet-mark=\
"LAN=>WAN packets Children HTTPS+QUIC" passthrough=yes
add action=mark-packet chain=forward comment=\
"LAN=>WAN packets Children HTTPS+QUIC" connection-mark=\
"LAN=>WAN connections QUIC Children" new-packet-mark=\
"LAN=>WAN packets Children HTTPS+QUIC" passthrough=yes
add action=passthrough chain=forward comment=\
"---------- Search in ALL, HTTPS, QUIC traffic ----------" disabled=yes
add action=mark-packet chain=forward comment=\
"Children Filter SNI \"habr.com\"" new-packet-mark="Children Filter" \
packet-mark="LAN=>WAN packets Children HTTPS+QUIC" passthrough=no \
protocol=tcp tls-host=habr.com
add action=mark-packet chain=forward comment="Children Filter SNI \"xvideo\"" \
content=xvideo new-packet-mark="Children Filter" packet-mark=\
"LAN=>WAN packets Children HTTPS+QUIC" passthrough=no
add action=passthrough chain=forward comment=\
"---------- Search in ALL, HTTPS, QUIC traffic ----------" disabled=yes
add action=mark-packet chain=forward comment="LAN=>WAN packets Children ALL" \
connection-mark="LAN=>WAN connections Children" new-packet-mark=\
"LAN=>WAN packets Children ALL" passthrough=yes
add action=mark-packet chain=forward comment="LAN=>WAN packets Children ALL" \
new-packet-mark="LAN=>WAN packets Children ALL" packet-mark=\
"LAN=>WAN packets Children HTTPS+QUIC" passthrough=yes
add action=mark-packet chain=forward comment=\
"Children Filter content \"porn\"" content=porn new-packet-mark=\
"Children Filter" packet-mark="LAN=>WAN packets Children ALL" \
passthrough=no
add action=mark-packet chain=forward comment=\
"Children Filter Content \"drug\"" content=drug new-packet-mark=\
"Children Filter" packet-mark="LAN=>WAN packets Children ALL" \
passthrough=no
Всё готово, осталось только добавить клиентов в Radius сервер. Основная магия заключается в том, что после аутентификации клиентам можно передать сетевые настройки, а именно, касательно нашей задачи, VLANID, и тем самым отправить их в нужную сеть, с соответствующим DHCP сервером:
/user-manager user
add attributes=Mikrotik-Wireless-VLANID:200 name=children shared-users=10
add attributes=Mikrotik-Wireless-VLANID:100 name=parent shared-users=10
Тестируем, что получилось, для этого с телефона подключаемся к Wi-Fi сети:
Сертификат задействуется самоподписанный, поэтому видим предупреждение:
После успешной аутентификации попадаем в правильный VLAN с соответствующими ограничениями:
Если по какой-то причине у вас нет возможности обновляться до RouterOS версии 7, то можно воспользоваться внешним Radius сервером, например, Freeradius. Его настройка рассмотрена ранее. Из коробки он умеет работать со следующими атрибутами MikroTik:
Полный перечень всех атрибутов производителя и их характеристики можно посмотреть здесь. Как видно, нам нужно самостоятельно добавить Mikrotik-Wireless-VLANID. Сделать это проще всего через графический интерфейс:
Осталось только добавить нужных клиентов в Radius сервер с указанием правильных значений атрибутов:
В логах Freeradius может быть ошибка (tail /var/log/freeradius/radius.log):
Error: ERROR: (27) sql: ERROR: rlm_sql_mysql: ERROR 1054 (Unknown column 'acctupdatetime' in 'field list'): 42S22
Тогда необходимо внести небольшие изменения в базу данных Freeradius, как показано под спойлером:
mysql -u radius -p
USE radius;
DROP TABLE radacct;
CREATE TABLE radacct (
radacctid bigint(21) NOT NULL auto_increment,
acctsessionid varchar(64) NOT NULL default '',
acctuniqueid varchar(32) NOT NULL default '',
username varchar(64) NOT NULL default '',
groupname varchar(64) NOT NULL default '',
realm varchar(64) default '',
nasipaddress varchar(15) NOT NULL default '',
nasportid varchar(15) default NULL,
nasporttype varchar(32) default NULL,
acctstarttime datetime NULL default NULL,
acctupdatetime datetime NULL default NULL,
acctstoptime datetime NULL default NULL,
acctinterval int(12) default NULL,
acctsessiontime int(12) unsigned default NULL,
acctauthentic varchar(32) default NULL,
connectinfo_start varchar(50) default NULL,
connectinfo_stop varchar(50) default NULL,
acctinputoctets bigint(20) default NULL,
acctoutputoctets bigint(20) default NULL,
calledstationid varchar(50) NOT NULL default '',
callingstationid varchar(50) NOT NULL default '',
acctterminatecause varchar(32) NOT NULL default '',
servicetype varchar(32) default NULL,
framedprotocol varchar(32) default NULL,
framedipaddress varchar(15) NOT NULL default '',
PRIMARY KEY (radacctid),
UNIQUE KEY acctuniqueid (acctuniqueid),
KEY username (username),
KEY framedipaddress (framedipaddress),
KEY acctsessionid (acctsessionid),
KEY acctsessiontime (acctsessiontime),
KEY acctstarttime (acctstarttime),
KEY acctinterval (acctinterval),
KEY acctstoptime (acctstoptime),
KEY nasipaddress (nasipaddress)
) ENGINE = INNODB;
exit;
3. Заключение
RouterOS обладает достаточным и гибким набором возможностей по организации родительского контроля. В статьях представлены различные подходы: работа с DNS протоколом, Firewall Filter, Firewall Mangle и Kid-Control. Все описанные технические возможности хороши с определёнными оговорками. Третья часть логично завершает цикл настройкой Radius протокола, которая ранее рассматривалась на Хабре, однако неподготовленному пользователю может быть трудно адаптировать материал под тему родительского контроля. Именно поэтому в статье вся информация собрана воедино, чтобы на выходе получилось готовое решение. Также упомяну, что устройства MikroTik всё шире применяются в enterprise решениях, в том числе провайдеров связи, что подтверждается данными с последнего MUM, а значит, понимание работы такого оборудования не будет лишним сетевым и системным инженерам, специалистам по информационной безопасности, а также другим техническим специалистам и кругу людей, сочувствующим им.
Часть 1
Часть 2
Часть 3 (вы тут)
Комментарии (20)
tark-tech
29.03.2022 14:09+7Ох и любят же всякие персонажи решать техническими методами нетехнические проблемы...
Пока этот родитель тратил свое время, копаясь с рутерами чтобы огородить - дитё пошло и давно скорешилось с одноклассниками, которые ему и показали на мобилках и рассказали всё, что так старался скрыть родитель. И сделало вывод что с папашей-огорожателем смысла о чем-то говорить не имеет, он и сам не знает, и всё прятать пытается, и времени у него на общение нет - он контроль настраивает...
olegtsss Автор
29.03.2022 15:27+2Я надеюсь, что фразу "… в свете последних событий строгим родителям будет полезно знать, каким образом следует привести свой интернет-трафик в соответствии с интенсивно меняющимся законодательством, если по какой-то причине провайдер до этого не добрался..." вы не восприняли дословно? По тексту встречается сокрытие смысла между строк.
Если коротко, то статья носит технический прикладной характер. Например, как на работе оградить сотрудников от социальных сетей или, что учитывать пентестеру во время очередного аудита.
Kirikekeks
29.03.2022 22:51Спксибо. Это именно контроль. Демонстрация воли, мягкая сила. Патриархальный, но без ремня и без угла. Отличная договороспособность, поле для торговли. Денег не дам? Бабушка даст. Мороженное мама купит. Книжку не початаю? Велосипед не куплю? Актуально, действенно и непреодолимо сговором с мамой бабушкой и дедом. Папа был прав... В туду, пара дней, потраченных на проглатывание статьи точно стоит потратить. Спасибо за потраченные пару месяцев на написание.
DenSyo
30.03.2022 03:52Спасибо за статью, интересно. Но, наверное, стоит сказать тем, кто воспримет заголовок буквально, что для решения конкретно задачи родительского контроля достаточно изменить подход к правилам, не ребёнку выдавать статический адрес и запрещать ему что-то, а себе и разрешать всё, по умолчанию всё запрещая. Ещё лучше, сделать отдельные сети со своими портами и сидами для себя и домочадцев.
kurvimetr
30.03.2022 03:56Хмм, а точно есть смысл городить целую радиус-систему, вланы, подсети, вайфай разделять для такого? Можно же, по идее, сделать белый список адресов, которые статику получают по известному маку, которым можно все, а остальным - детский контроль, который тупо на мангле настраивается. Но вообще, для других нужд хочу семерошный юзерманагер/радиус изучить, да руки не доходят(
olegtsss Автор
30.03.2022 04:06MAC — вещь изменчивая, особенно в мобильных устройствах (о чем в начале статьи достаточно подробно написано).
alexandme
30.03.2022 09:54+1Сертификаты, VLANы, RADIUS контроль на WiFi, всё очень подконтрольно и безопасно! У меня был забавный опыт по этой теме: делал нечто подобное для своего восьмилетнего чада на Open-WRT и единственным ограничением выставлял дневную доступность интернета, так же определял на роутере нужное устройство по MAC, однако, все ограничения были успешно проигнорированы дитём цифрового поколения путём переподключения к соседской открытой точке доступа! И догадался ведь! Хвалил за находчивость и убрал в последствии эти фильтры. В контексте статьи вывод - если у пользователя нет ограничения на выбор сетевых подключений, то иные ограничения ничтожны. Разве что если есть внутренние ресурсы, то не очень удобно будет постоянно переключаться между интернетом и "локальным" доступом.
DarkTiger
30.03.2022 10:38+2У Zyxel Keenetic это все вроде из коробки присутствует + возможность подключить SkyDNS cо своими дополнительными фильтрами на всякие gdz.ru + возможность со смартфона смотреть статистику и управлять подключениями устройств.
Сижу на работе, смотрю оценки в дневнике. Трояк за то, что он делал спустя рукава (я же видел вечером) - бан смартфона на остаток дня.
KMVp
30.03.2022 13:41Спасибо за статью! Теперь буду пробовать радиус, а то все стартового пинка не хватало.
А с KidKontrol не хватало учета времени онлайн. У себя решил при помощи "умного дома". Устройство с "кнопкой" включает и выключает через апи правило в кидс контрол, попутно учитывая суммарное время. И это "зашло"! Итогом ребенок сам себе включает и выключает интернет, расходуя ежедневное время (3 часа) ему удобными интервалами.
damis
30.03.2022 19:53В статье описан домашний вариант контроля.
А можно с помощью впн до домашнего роутера - применять ограничения несмотря на способ подключения к сети. Только впн клиент нужно как то защитить от выключения.
olegtsss Автор
30.03.2022 21:21В статье описаны варианты контроля, имеющиеся на борту в RouterOS. Настроить Mangle в «домашних условиях» (не квалифицированному спецу) - скорее роскошь, чем обыденность.
Ваш вопрос про vpn не понятен, разверните мысль.
damis
30.03.2022 21:29да, немного не развернуто получилось.
впн на телефоне в основном имел ввиду.
И тогда телефон будет под контролем всегда)
olegtsss Автор
31.03.2022 05:55Если я вас правильно понял, то нужно, чтобы мобильное устройство всегда пропускало трафик через впн, даже вне дома. Идея плохая - работающий впн постоянно активен, из-за чего телефон греется, а батарея быстро садится . А так можно , впн сервер задается в качестве шлюза по умолчанию. У вас дома скорее всего на роутере работает впн клиент. Тогда нужно или впн сервер настроить под нужные задачи, либо трафик от мобильного устройства заворачивать через другого клиента впн (роутера).
nebularia
31.03.2022 06:11Идея плохая - работающий впн постоянно активен, из-за чего телефон греется, а батарея быстро садится
Wireguard может работать без keepalive, если не требуется постоянный доступ с сервера на клиент. Влияния на автономность особо не заметил, а уж тем более нагрева.
dlinyj
Спасибо вам за серию статей. Благодаря вам перешёл сам на Микротик. И вообще поражает его возможности и гибкость, разве что щи не варит.
olegtsss Автор
Радует общность с Linux, которая лежит в основе RouterOS.
Alatarum
А где там общность? Там же от Линукса только ядро, и то не понятно, насколько.
Я бы с удовольствием заменил бы на микротик мои домашние роутеры, но у меня VPN построен на tinc и никаких способов завести tinc на микроте я не знаю…
olegtsss Автор
Когда настраиваешь MikroTik, узнаешь синтаксис, используемый в Linux. А почему у вас используется именно tinс?