MikroTik StopAD Tricks

Мы давно используем замечательный скрипт StopAD для дополнительной фильтрации рекламного контента в сетях клиентов на уровне маршрутизатора (в данном случае скрипты используются на оборудование Mikrotik RouterOS) с использованием подмены DNS A-записей «рекламных» доменов по данным из открытых источников. Страница проекта https://stopad.cgood.ru, большое спасибо Саше Маслову @drakmail за его сопровождение и развитие.

Логика работы

Логика простая — заполняем кэш статических записей маршрутизатора доменами с подстановкой заданного IP адреса. При обращении к данным доменам из локальной сети клиент получает А запись и отправляет запрос (подразумеваются HTTP/HTTPS) к заданному IP, а в ответ получает … ничего не получает (а если быть точнее — не должен ничего получать).

На практике

В ходе эксплуатации столкнулись с интересными проблемами, каждая была обусловлена конкретными настройками оборудования клиентов, проанализировав которые, мы сформировали следующий алгоритм использования данного функционала:

1) Строка запроса

Необходимо осознанно подходить к формированию строки запроса! Здесь важную роль играют:

  • IP адрес подмены — это тот адрес, куда клиент будет направлять запросы, по умолчанию стоит 127.0.0.1 (loopback). В случае, если заданный IP адрес слушает порты 80 и 443, то здесь Вас могут ждать «приколы» по типу: «Kaspersky ругается на подмену сертификатов», «Долгое соединение с ресурсом, как, например, с Яндекс Почтой» и пр.
IP подмены висит на bridge name=lo0 с маской /32
  • Источники, а точнее их количество. У каждой модели Mikrotik RB свой объем оперативной памяти, именно он используется для хранения DNS STATIC записей во время работы маршрутизатора. Кроме того, важно учесть дефолтный объем кэша в DNS роутера (см PS: ниже).
Наш «Стандартный» набор источников ~4200 записей
  • Исключения! В какой-то момент Вам может поступить заявка о нерабочем сайте/приложении — обязательно не забудьте проверить домен на подмену и в случае совпадения добавить его в исключения
Задайте при необходимости Исключения (localhost в дефолте)

2) DHCP сервер

Для того, чтобы это работало, необходимо задать DNS сервер для клиентов — IP адрес(а) маршрутизатора, чтобы обращения шли к его кэшу. Но есть хитрости, которые могут завернуть запросы ваших клиентов к «чужим» DNS серверам на ваш Mikrotik:

# nov/30/2017 00:37:10 by RouterOS 6.40.5
# model = RouterBOARD 952Ui-5ac2nD
/ip firewall nat
add action=redirect chain=dstnat dst-port=53 protocol=udp dst-address-type=!local

Обратите внимание, при такой конфигурации обращение из локальной сети к любому внешнему хосту с DNS забросом будет давать результат.

3) TCP Reject

Для ускорения процесса мы остановились на варианте обработки запросов Reject with TCP reset, при условии, что IP подмены указан один из интерфейсов маршрутизатора, достаточно добавить правило вида:

/ip firewall filter
add chain=input connection-state=established,related
...
add action=reject chain=input comment=adblock_helper dst-port=80,443 protocol=tcp reject-with=tcp-reset

PS:

/ip dns> print
servers: ...
cache-size: 81920KiB
cache-used: 50964KiB
/ip dns> static print count-only
16680

Сделать заявку