Сам себе РКН или родительский контроль с MikroTik (ч.3)

o2srfc9timt_u53nt686btb_ugy.png

В конце 2021 года был опубликован цикл статей, посвящённый родительскому контролю на оборудовании MikroTik. Ранее были подробно рассмотрены организация DNS, работа Firewall Filter и Ip Kid-control, возможности маркировки трафика посредством Firewall Mangle для решения указанной задачи. Представленные предложения базировались на факте неизменности MAC адресов детских беспроводных устройств. Это позволяло осуществить статическую привязку IP адресов. Однако современные мобильные операционные системы рандомизируют MAC, тем самым делая предложенные алгоритмы нежизнеспособными. Вследствие этого подготовлена третья часть из цикла статей, в которой к представленному ранее решению прикручен протокол Radius. Его применение нивелирует озвученную проблему.

Статья предназначена не для профессионалов, а для тех, кто решил внедрить предложенные ранее решения у себя в доме или SOHO, однако плохо знаком с оборудованием MikroTik и поэтому самостоятельно разобраться в подобной задаче не может. На этом tutorial по родительскому контролю будет завершён. Не могу не упомянуть, что в свете последних событий строгим родителям будет полезно знать, каким образом следует привести свой интернет-трафик в соответствии с интенсивно меняющимся законодательством, если по какой-то причине провайдер до этого не добрался.

1. Введение


Всё, о чём написано выше — не сразу бросилось в глаза, но зато моментально было отмечено членами сообщества в комментариях к предыдущим статьям. Начиная с версии iOS 14, iPadOS 14 и watchOS 7, устройства Apple улучшают приватность при работе с беспроводными сетями, а именно, делают MAC адрес уникальным (private Wi-Fi address) для каждой сети. В настройках мобильного девайса это выглядит так:

xzg_hhla1ga2cywbnd2f9z99py8.jpeg


Дополнительно, смена 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 и выглядел примерно так:

dz4jdav_qp7umptcneoiw9dhu2q.png


На текущий момент настройка 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. Получаем правила вроде тех, что представлены под спойлером:

Firewall Mangle
/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 сети:

5ysvwp9_nm1islyapfxfrmh4b6w.jpeg


Сертификат задействуется самоподписанный, поэтому видим предупреждение:

aw5_zzjm4b4m8dqcdvia8ofpk1c.jpeg


После успешной аутентификации попадаем в правильный VLAN с соответствующими ограничениями:

a8qt9pcphtzwh8afi0noneutpwe.jpeg


Если по какой-то причине у вас нет возможности обновляться до RouterOS версии 7, то можно воспользоваться внешним Radius сервером, например, Freeradius. Его настройка рассмотрена ранее. Из коробки он умеет работать со следующими атрибутами MikroTik:

pzslktxlmvlvw-ekem7hfpcm0o0.jpeg


Полный перечень всех атрибутов производителя и их характеристики можно посмотреть здесь. Как видно, нам нужно самостоятельно добавить Mikrotik-Wireless-VLANID. Сделать это проще всего через графический интерфейс:

ji5ljrjzpeqizzbmpky3bd2jtlm.jpeg


Осталось только добавить нужных клиентов в Radius сервер с указанием правильных значений атрибутов:

q0efaf8noqzoyq8k52zvnmzoyrc.jpeg
x_ouvzwyglmg3b62yozmc6ikehk.jpeg


В логах 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 (вы тут)

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru