DNS на MikroTik — кеш, DoH и блокировка рекламы
DNS — одна из фундаментальных сетевых служб, без которой не работает ни один сайт. MikroTik RouterOS содержит встроенный DNS-сервер с кешированием, поддержкой DNS over HTTPS (DoH) и статическими записями. В этом руководстве мы настроим быстрый и безопасный DNS-сервер на MikroTik: включим кеширование, переведём upstream-запросы на DoH для защиты от прослушивания, добавим блокировку рекламы через DNS-записи и настроим автоматическое обновление чёрных списков. Все команды приведены для RouterOS 7.20+.
Описание
Как работает DNS на MikroTik
Встроенный DNS-сервер RouterOS может выполнять две роли:
- DNS forwarder (пересылка) — принимает запросы от клиентов LAN и пересылает их вышестоящим серверам (upstream). Ответы кешируются.
- DNS с авторитативными записями — позволяет создавать статические DNS-записи (A, AAAA, CNAME, MX, TXT и др.) для локальных ресурсов.
Ключевые параметры DNS-сервера:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
servers | Список upstream DNS-серверов | (от DHCP-провайдера) |
allow-remote-requests | Разрешить запросы от клиентов сети | no |
cache-size | Размер кеша в KiB | 2048 |
cache-max-ttl | Максимальный TTL записей в кеше | 1w (1 неделя) |
use-doh-server | URL DoH-сервера | (пусто) |
verify-doh-cert | Проверка TLS-сертификата DoH | no |
doh-max-server-connections | Максимум подключений к DoH | 5 |
doh-max-concurrent-queries | Максимум параллельных DoH-запросов | 50 |
Когда клиент в LAN отправляет DNS-запрос, MikroTik сначала ищет ответ в кеше. Если записи нет — запрос уходит к upstream-серверу (обычному UDP/53 или через DoH). Ответ сохраняется в кеш на время, указанное в TTL записи (но не более cache-max-ttl).
Зачем нужен DoH
Классический DNS работает по UDP/TCP порт 53 без шифрования. Это значит, что провайдер (или злоумышленник в сети) видит все ваши DNS-запросы и может их подменять. DNS over HTTPS (DoH) решает эту проблему — запросы отправляются внутри HTTPS-сессии (порт 443), зашифрованной TLS.
Преимущества DoH:
- Провайдер не видит, какие домены вы резолвите
- Защита от DNS spoofing и man-in-the-middle атак
- Обход DNS-перехвата провайдером (transparent DNS proxy)
Недостатки:
- Небольшое увеличение задержки (TLS handshake при первом запросе)
- Зависимость от одного DoH-провайдера
- Невозможность использовать DNS-based policy routing на стороне провайдера
Блокировка рекламы через DNS
Принцип прост: создаём статические DNS-записи для рекламных доменов, указывающие на адрес 0.0.0.0 (или 240.0.0.0 — "черная дыра"). Когда клиент пытается загрузить рекламный баннер с домена ads.example.com, MikroTik отвечает IP-адресом 0.0.0.0 — браузер не может подключиться, реклама не загружается.
Это работает аналогично Pi-hole или AdGuard Home, но без дополнительного сервера — всё прямо на маршрутизаторе.
Настройка
Шаг 1. Базовая настройка DNS-сервера
Зададим upstream-серверы, включим приём запросов от клиентов и увеличим размер кеша:
[admin@MikroTik] ># Настраиваем DNS-сервер /ip/dns/set \ servers=1.1.1.1,8.8.8.8 \ allow-remote-requests=yes \ cache-size=8192 \ cache-max-ttl=1d # Проверяем настройки /ip/dns/print
Параметр allow-remote-requests=yes критически важен — без него MikroTik будет резолвить имена только для себя, клиенты LAN не смогут использовать его как DNS.
Размер кеша 8192 KiB (8 МБ) достаточен для домашней или небольшой офисной сети (5000–10000 записей). Для крупных сетей увеличивайте до 16384 или 32768.
Шаг 2. Безопасность — ограничение DNS для LAN
Если MikroTik имеет публичный IP-адрес и вы включили allow-remote-requests, ваш DNS-сервер станет открытым resolver-ом. Его найдут сканеры за считанные часы и начнут использовать для DNS amplification DDoS-атак.
Обязательно ограничьте доступ к DNS только из локальной сети:
[admin@MikroTik] ># Разрешаем DNS-запросы только из LAN (192.168.88.0/24) /ip/firewall/filter/add \ chain=input \ protocol=udp \ dst-port=53 \ src-address=192.168.88.0/24 \ action=accept \ comment="DNS: allow from LAN (UDP)" \ place-before=0 /ip/firewall/filter/add \ chain=input \ protocol=tcp \ dst-port=53 \ src-address=192.168.88.0/24 \ action=accept \ comment="DNS: allow from LAN (TCP)" \ place-before=1 # Блокируем DNS-запросы извне /ip/firewall/filter/add \ chain=input \ protocol=udp \ dst-port=53 \ in-interface-list=WAN \ action=drop \ comment="DNS: block from WAN (UDP)" /ip/firewall/filter/add \ chain=input \ protocol=tcp \ dst-port=53 \ in-interface-list=WAN \ action=drop \ comment="DNS: block from WAN (TCP)"
Если у вас несколько подсетей (VLAN), добавьте аналогичные правила для каждой разрешённой подсети или используйте address-list:
[admin@MikroTik] ># Создаём address-list для всех локальных подсетей /ip/firewall/address-list/add list=dns-allowed address=192.168.88.0/24 /ip/firewall/address-list/add list=dns-allowed address=192.168.10.0/24 /ip/firewall/address-list/add list=dns-allowed address=10.0.0.0/24 # Одно правило вместо множества /ip/firewall/filter/add \ chain=input \ protocol=udp \ dst-port=53 \ src-address-list=dns-allowed \ action=accept \ comment="DNS: allow from local subnets"
Также стоит заблокировать клиентам возможность обходить ваш DNS, перенаправляя все DNS-запросы на роутер (DNS hijacking):
[admin@MikroTik] ># Перехватываем DNS-запросы клиентов к сторонним серверам /ip/firewall/nat/add \ chain=dstnat \ protocol=udp \ dst-port=53 \ src-address=192.168.88.0/24 \ dst-address=!192.168.88.1 \ action=redirect \ to-ports=53 \ comment="DNS hijack: redirect external DNS to router" /ip/firewall/nat/add \ chain=dstnat \ protocol=tcp \ dst-port=53 \ src-address=192.168.88.0/24 \ dst-address=!192.168.88.1 \ action=redirect \ to-ports=53 \ comment="DNS hijack: redirect external DNS (TCP)"
Теперь даже если клиент вручную прописал DNS 8.8.8.8, его запросы будут обрабатываться роутером.
Шаг 3. Настройка DNS over HTTPS (DoH)
Перед включением DoH необходимо импортировать корневые сертификаты, чтобы RouterOS мог проверить TLS-сертификат DoH-сервера:
[admin@MikroTik] ># Загружаем корневые сертификаты DigiCert (нужны для Cloudflare и Google) /tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem /certificate/import file-name=digicert-root.pem passphrase="" # Для Google DoH дополнительно: /tool/fetch url="https://pki.goog/repo/certs/gtsr1.pem" dst-path=google-root.pem /certificate/import file-name=google-root.pem passphrase="" # Проверяем, что сертификаты импортированы /certificate/print
Теперь включаем DoH:
[admin@MikroTik] ># Включаем DoH с Cloudflare /ip/dns/set \ use-doh-server="https://1.1.1.1/dns-query" \ verify-doh-cert=yes \ doh-max-server-connections=5 \ doh-max-concurrent-queries=50 # ВАЖНО: очищаем список обычных серверов, чтобы все запросы шли через DoH /ip/dns/set servers=""
Доступные DoH-серверы:
| Провайдер | URL | Особенности |
|---|---|---|
| Cloudflare | https://1.1.1.1/dns-query | Быстрый, privacy-oriented |
| Cloudflare (malware filter) | https://security.cloudflare-dns.com/dns-query | Блокирует malware-домены |
| Cloudflare (family) | https://family.cloudflare-dns.com/dns-query | Malware + adult content filter |
https://dns.google/dns-query | Стабильный, большой anycast | |
| Quad9 | https://dns.quad9.net/dns-query | Блокирует malware-домены |
Если вы хотите использовать fallback (обычные DNS-серверы на случай недоступности DoH), можно оставить servers:
[admin@MikroTik] ># DoH как основной, классический DNS как fallback /ip/dns/set \ use-doh-server="https://1.1.1.1/dns-query" \ verify-doh-cert=yes \ servers=1.1.1.1,8.8.8.8
В этом случае RouterOS сначала попробует DoH, и если он недоступен — переключится на обычные серверы.
Шаг 4. Статические DNS-записи
Статические записи полезны для локальных ресурсов (NAS, принтеры, серверы) и для блокировки доменов:
[admin@MikroTik] ># Локальные ресурсы /ip/dns/static/add name=nas.home address=192.168.88.50 ttl=1d /ip/dns/static/add name=printer.home address=192.168.88.30 ttl=1d /ip/dns/static/add name=router.home address=192.168.88.1 ttl=1d /ip/dns/static/add name=proxmox.home address=192.168.88.100 ttl=1d # CNAME-запись /ip/dns/static/add name=pve.home type=CNAME cname=proxmox.home ttl=1d # Wildcard-запись — все поддомены *.home на роутер /ip/dns/static/add name=".home" address=192.168.88.1 ttl=1d # Проверяем /ip/dns/static/print
Шаг 5. Блокировка рекламы через DNS
Ручное добавление блокировок:
[admin@MikroTik] ># Блокируем популярные рекламные домены /ip/dns/static/add name="ads.google.com" address=0.0.0.0 type=A ttl=1d comment="adblock" /ip/dns/static/add name="pagead2.googlesyndication.com" address=0.0.0.0 type=A ttl=1d comment="adblock" /ip/dns/static/add name="ad.doubleclick.net" address=0.0.0.0 type=A ttl=1d comment="adblock" /ip/dns/static/add name="analytics.google.com" address=0.0.0.0 type=A ttl=1d comment="adblock" /ip/dns/static/add name="mc.yandex.ru" address=0.0.0.0 type=A ttl=1d comment="adblock" /ip/dns/static/add name="ads.adfox.ru" address=0.0.0.0 type=A ttl=1d comment="adblock"
Конечно, вручную добавлять тысячи доменов неудобно. Автоматизируем процесс.
Шаг 6. Автоматическое обновление чёрного списка рекламы
Создадим скрипт, который скачивает список рекламных доменов, парсит его и создаёт DNS-записи. Используем популярный список от Steven Black (hosts-файл формата 0.0.0.0 domain.tld):
[admin@MikroTik] >/system/script/add name=dns-adblock-update source={ # --- Настройки --- :local listUrl "https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling/hosts" :local tmpFile "adblock-hosts.txt" :local adblockComment "adblock-auto" :log info "AdBlock: starting update..." # Скачиваем файл :do { /tool/fetch url=$listUrl dst-path=$tmpFile mode=https } on-error={ :log error "AdBlock: failed to download hosts file" :error "Download failed" } # Удаляем старые записи :local oldEntries [/ip/dns/static/find where comment=$adblockComment] :local oldCount [:len $oldEntries] :if ($oldCount > 0) do={ /ip/dns/static/remove $oldEntries :log info "AdBlock: removed $oldCount old entries" } # Читаем файл и добавляем записи :local fileContent [/file/get $tmpFile contents] :local lineStart 0 :local count 0 :local maxEntries 5000 :for i from=0 to=([:len $fileContent] - 1) do={ :if ([:pick $fileContent $i ($i + 1)] = "\n") do={ :local line [:pick $fileContent $lineStart $i] :set lineStart ($i + 1) # Пропускаем комментарии и пустые строки :if ([:len $line] > 10) do={ :if ([:pick $line 0 7] = "0.0.0.0") do={ :local domain [:pick $line 8 [:len $line]] # Убираем \r если есть :if ([:pick $domain ([:len $domain] - 1) [:len $domain]] = "\r") do={ :set domain [:pick $domain 0 ([:len $domain] - 1)] } # Пропускаем localhost :if ($domain != "0.0.0.0" && $domain != "localhost" && $domain != "" && $count < $maxEntries) do={ :do { /ip/dns/static/add name=$domain address=0.0.0.0 ttl=1d comment=$adblockComment :set count ($count + 1) } on-error={} } } } } } # Удаляем временный файл /file/remove $tmpFile # Очищаем DNS-кеш после обновления /ip/dns/cache/flush :log info "AdBlock: update complete, added $count entries" }
Настроим автоматическое обновление раз в сутки через scheduler:
[admin@MikroTik] ># Запуск скрипта каждый день в 04:00 /system/scheduler/add \ name=dns-adblock-daily \ start-time=04:00:00 \ interval=1d \ on-event="/system/script/run dns-adblock-update" \ comment="Daily adblock list update" # Первый запуск вручную /system/script/run dns-adblock-update
Проверим, что записи добавились:
[admin@MikroTik] ># Количество записей adblock /ip/dns/static/print count-only where comment="adblock-auto" # Просмотр первых 10 записей /ip/dns/static/print where comment="adblock-auto" count=10
Проверка
Проверка работы DNS-сервера
[admin@MikroTik] ># Резолвим домен через встроенный DNS :resolve mikrotik.com # Проверяем, что DoH работает (должен быть статус doh) /ip/dns/print # Смотрим статистику кеша /ip/dns/cache/print count-only # Просмотр содержимого кеша (поиск конкретного домена) /ip/dns/cache/print where name~"mikrotik" # Статистика DNS-сервера /ip/dns/print stats # Проверяем, что блокировка работает :resolve ads.google.com # Должен вернуть 0.0.0.0
Проверка с клиентского компьютера
На Windows:
codenslookup mikrotik.com 192.168.88.1 nslookup ads.google.com 192.168.88.1
На Linux/macOS:
codedig @192.168.88.1 mikrotik.com dig @192.168.88.1 ads.google.com
Для проверки DoH убедитесь, что DNS-запросы не уходят открытым текстом. На MikroTik можно проверить через packet sniffer:
[admin@MikroTik] ># Если DoH работает правильно, пакетов на порт 53 (наружу) быть не должно /tool/sniffer/quick port=ether1 ip-protocol=udp port=53 duration=10s
Управление кешем
[admin@MikroTik] ># Полный сброс кеша /ip/dns/cache/flush # Просмотр всех записей в кеше /ip/dns/cache/print # Поиск конкретного домена в кеше /ip/dns/cache/print where name~"google" # Просмотр записей с отрицательным кешем (NXDOMAIN) /ip/dns/cache/print where type=NXDOMAIN
Типичные ошибки
1. DNS-сервер открыт для интернета
Симптом: высокая нагрузка на CPU, в логах тысячи DNS-запросов от неизвестных IP.
Причина: включён allow-remote-requests=yes без ограничений в firewall.
Решение: добавьте правила firewall для ограничения DNS-запросов только из LAN (см. Шаг 2). Проверьте открытость через внешний сервис:
[admin@MikroTik] ># Временное отключение, если атака уже идёт /ip/dns/set allow-remote-requests=no
2. DoH не работает — "doh server connection error"
Симптом: в логах ошибки подключения к DoH-серверу, DNS не резолвит.
Причина: не импортированы корневые сертификаты или время на роутере неверное.
Решение:
[admin@MikroTik] ># Проверяем время (TLS-сертификаты чувствительны к времени) /system/clock/print # Если время неверное — настраиваем NTP /system/ntp/client/set enabled=yes servers=pool.ntp.org # Проверяем сертификаты /certificate/print # Если сертификатов нет — импортируем заново /tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem /certificate/import file-name=digicert-root.pem passphrase=""
Важный нюанс: при первоначальной настройке DoH без рабочих DNS-серверов RouterOS не сможет резолвить имя DoH-сервера. Поэтому используйте URL с IP-адресом (https://1.1.1.1/dns-query) или временно оставьте обычные DNS-серверы.
3. Adblock-скрипт не скачивает файл
Симптом: в логах "AdBlock: failed to download hosts file".
Причина: нет DNS для резолва raw.githubusercontent.com, или нет маршрута по умолчанию, или сертификаты не импортированы.
Решение:
[admin@MikroTik] ># Проверяем, что DNS работает :resolve raw.githubusercontent.com # Проверяем маршрут по умолчанию /ip/route/print where dst-address=0.0.0.0/0 # Проверяем, что fetch работает /tool/fetch url="https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" dst-path=test.txt mode=https /file/print where name=test.txt
4. Клиенты обходят блокировку через DoH в браузере
Симптом: реклама всё ещё показывается, несмотря на DNS-блокировку.
Причина: Chrome, Firefox и другие браузеры имеют встроенный DoH и обращаются напрямую к Cloudflare/Google, минуя DNS роутера.
Решение: блокируем известные DoH-серверы по IP:
[admin@MikroTik] ># Address list с IP-адресами известных DoH-серверов /ip/firewall/address-list/add list=doh-block address=1.1.1.1 comment="Cloudflare DoH" /ip/firewall/address-list/add list=doh-block address=1.0.0.1 comment="Cloudflare DoH" /ip/firewall/address-list/add list=doh-block address=8.8.8.8 comment="Google DoH" /ip/firewall/address-list/add list=doh-block address=8.8.4.4 comment="Google DoH" /ip/firewall/address-list/add list=doh-block address=9.9.9.9 comment="Quad9 DoH" /ip/firewall/address-list/add list=doh-block address=149.112.112.112 comment="Quad9 DoH" /ip/firewall/address-list/add list=doh-block address=208.67.222.222 comment="OpenDNS DoH" /ip/firewall/address-list/add list=doh-block address=208.67.220.220 comment="OpenDNS DoH" # Блокируем HTTPS к этим IP для клиентов LAN /ip/firewall/filter/add \ chain=forward \ protocol=tcp \ dst-port=443 \ dst-address-list=doh-block \ src-address=192.168.88.0/24 \ action=reject \ reject-with=tcp-reset \ comment="Block browser DoH bypass"
Однако это также заблокирует обычный HTTPS к этим IP. Более точное решение — использовать TLS SNI matching (доступно в RouterOS 7):
[admin@MikroTik] >/ip/firewall/filter/add \ chain=forward \ protocol=tcp \ dst-port=443 \ tls-host="dns.google" \ action=reject \ reject-with=tcp-reset \ comment="Block Google DoH by SNI" /ip/firewall/filter/add \ chain=forward \ protocol=tcp \ dst-port=443 \ tls-host="cloudflare-dns.com" \ action=reject \ reject-with=tcp-reset \ comment="Block Cloudflare DoH by SNI"
5. Кеш заполняется мусором, резолв медленный
Симптом: кеш содержит тысячи записей, но время ответа не уменьшается.
Причина: слишком маленький cache-size, записи вытесняются раньше, чем к ним обратятся повторно. Или cache-max-ttl слишком короткий.
Решение:
[admin@MikroTik] ># Увеличиваем кеш /ip/dns/set cache-size=16384 cache-max-ttl=1d # Проверяем текущую заполненность /ip/dns/cache/print count-only # Очищаем кеш для пересборки /ip/dns/cache/flush
6. Не работает DNS hijack для устройств с hardcoded DNS
Симптом: некоторые устройства (IoT, Smart TV) игнорируют DHCP-выданный DNS и продолжают ходить на 8.8.8.8.
Причина: DNS-адрес захардкожен в прошивку устройства.
Решение: правило dst-nat с redirect (см. Шаг 2 — DNS hijacking). Для устройств, использующих DoT (DNS over TLS, порт 853):
[admin@MikroTik] ># Блокируем DNS over TLS /ip/firewall/filter/add \ chain=forward \ protocol=tcp \ dst-port=853 \ src-address=192.168.88.0/24 \ action=reject \ reject-with=tcp-reset \ comment="Block DoT bypass"
Итоговая конфигурация
Полный набор команд для быстрого развёртывания:
[admin@MikroTik] ># 1. Импорт сертификатов /tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem /certificate/import file-name=digicert-root.pem passphrase="" # 2. DNS с DoH /ip/dns/set \ use-doh-server="https://1.1.1.1/dns-query" \ verify-doh-cert=yes \ servers="" \ allow-remote-requests=yes \ cache-size=8192 \ cache-max-ttl=1d # 3. Firewall: разрешаем DNS только из LAN /ip/firewall/filter/add chain=input protocol=udp dst-port=53 src-address=192.168.88.0/24 action=accept comment="DNS: allow LAN" place-before=0 /ip/firewall/filter/add chain=input protocol=udp dst-port=53 in-interface-list=WAN action=drop comment="DNS: block WAN" # 4. DNS hijack /ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 src-address=192.168.88.0/24 dst-address=!192.168.88.1 action=redirect to-ports=53 comment="DNS hijack" # 5. Локальные записи /ip/dns/static/add name=router.home address=192.168.88.1 ttl=1d # 6. Запуск adblock-скрипта /system/script/run dns-adblock-update
Эта конфигурация обеспечивает быстрый зашифрованный DNS с блокировкой рекламы и защитой от обхода. Кеш ускоряет повторные запросы, DoH защищает от прослушивания, а DNS hijack не позволяет устройствам использовать сторонние DNS-серверы.
# Настраиваем DNS-сервер
/ip/dns/set \
servers=1.1.1.1,8.8.8.8 \
allow-remote-requests=yes \
cache-size=8192 \
cache-max-ttl=1d
# Проверяем настройки
/ip/dns/print
# Разрешаем DNS-запросы только из LAN (192.168.88.0/24)
/ip/firewall/filter/add \
chain=input \
protocol=udp \
dst-port=53 \
src-address=192.168.88.0/24 \
action=accept \
comment="DNS: allow from LAN (UDP)" \
place-before=0
/ip/firewall/filter/add \
chain=input \
protocol=tcp \
dst-port=53 \
src-address=192.168.88.0/24 \
action=accept \
comment="DNS: allow from LAN (TCP)" \
place-before=1
# Блокируем DNS-запросы извне
/ip/firewall/filter/add \
chain=input \
protocol=udp \
dst-port=53 \
in-interface-list=WAN \
action=drop \
comment="DNS: block from WAN (UDP)"
/ip/firewall/filter/add \
chain=input \
protocol=tcp \
dst-port=53 \
in-interface-list=WAN \
action=drop \
comment="DNS: block from WAN (TCP)"
# Создаём address-list для всех локальных подсетей
/ip/firewall/address-list/add list=dns-allowed address=192.168.88.0/24
/ip/firewall/address-list/add list=dns-allowed address=192.168.10.0/24
/ip/firewall/address-list/add list=dns-allowed address=10.0.0.0/24
# Одно правило вместо множества
/ip/firewall/filter/add \
chain=input \
protocol=udp \
dst-port=53 \
src-address-list=dns-allowed \
action=accept \
comment="DNS: allow from local subnets"
# Перехватываем DNS-запросы клиентов к сторонним серверам
/ip/firewall/nat/add \
chain=dstnat \
protocol=udp \
dst-port=53 \
src-address=192.168.88.0/24 \
dst-address=!192.168.88.1 \
action=redirect \
to-ports=53 \
comment="DNS hijack: redirect external DNS to router"
/ip/firewall/nat/add \
chain=dstnat \
protocol=tcp \
dst-port=53 \
src-address=192.168.88.0/24 \
dst-address=!192.168.88.1 \
action=redirect \
to-ports=53 \
comment="DNS hijack: redirect external DNS (TCP)"
# Загружаем корневые сертификаты DigiCert (нужны для Cloudflare и Google)
/tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem
/certificate/import file-name=digicert-root.pem passphrase=""
# Для Google DoH дополнительно:
/tool/fetch url="https://pki.goog/repo/certs/gtsr1.pem" dst-path=google-root.pem
/certificate/import file-name=google-root.pem passphrase=""
# Проверяем, что сертификаты импортированы
/certificate/print
# Включаем DoH с Cloudflare
/ip/dns/set \
use-doh-server="https://1.1.1.1/dns-query" \
verify-doh-cert=yes \
doh-max-server-connections=5 \
doh-max-concurrent-queries=50
# ВАЖНО: очищаем список обычных серверов, чтобы все запросы шли через DoH
/ip/dns/set servers=""
# DoH как основной, классический DNS как fallback
/ip/dns/set \
use-doh-server="https://1.1.1.1/dns-query" \
verify-doh-cert=yes \
servers=1.1.1.1,8.8.8.8
# Локальные ресурсы
/ip/dns/static/add name=nas.home address=192.168.88.50 ttl=1d
/ip/dns/static/add name=printer.home address=192.168.88.30 ttl=1d
/ip/dns/static/add name=router.home address=192.168.88.1 ttl=1d
/ip/dns/static/add name=proxmox.home address=192.168.88.100 ttl=1d
# CNAME-запись
/ip/dns/static/add name=pve.home type=CNAME cname=proxmox.home ttl=1d
# Wildcard-запись — все поддомены *.home на роутер
/ip/dns/static/add name=".home" address=192.168.88.1 ttl=1d
# Проверяем
/ip/dns/static/print
# Блокируем популярные рекламные домены
/ip/dns/static/add name="ads.google.com" address=0.0.0.0 type=A ttl=1d comment="adblock"
/ip/dns/static/add name="pagead2.googlesyndication.com" address=0.0.0.0 type=A ttl=1d comment="adblock"
/ip/dns/static/add name="ad.doubleclick.net" address=0.0.0.0 type=A ttl=1d comment="adblock"
/ip/dns/static/add name="analytics.google.com" address=0.0.0.0 type=A ttl=1d comment="adblock"
/ip/dns/static/add name="mc.yandex.ru" address=0.0.0.0 type=A ttl=1d comment="adblock"
/ip/dns/static/add name="ads.adfox.ru" address=0.0.0.0 type=A ttl=1d comment="adblock"
/system/script/add name=dns-adblock-update source={
# --- Настройки ---
:local listUrl "https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling/hosts"
:local tmpFile "adblock-hosts.txt"
:local adblockComment "adblock-auto"
:log info "AdBlock: starting update..."
# Скачиваем файл
:do {
/tool/fetch url=$listUrl dst-path=$tmpFile mode=https
} on-error={
:log error "AdBlock: failed to download hosts file"
:error "Download failed"
}
# Удаляем старые записи
:local oldEntries [/ip/dns/static/find where comment=$adblockComment]
:local oldCount [:len $oldEntries]
:if ($oldCount > 0) do={
/ip/dns/static/remove $oldEntries
:log info "AdBlock: removed $oldCount old entries"
}
# Читаем файл и добавляем записи
:local fileContent [/file/get $tmpFile contents]
:local lineStart 0
:local count 0
:local maxEntries 5000
:for i from=0 to=([:len $fileContent] - 1) do={
:if ([:pick $fileContent $i ($i + 1)] = "\n") do={
:local line [:pick $fileContent $lineStart $i]
:set lineStart ($i + 1)
# Пропускаем комментарии и пустые строки
:if ([:len $line] > 10) do={
:if ([:pick $line 0 7] = "0.0.0.0") do={
:local domain [:pick $line 8 [:len $line]]
# Убираем \r если есть
:if ([:pick $domain ([:len $domain] - 1) [:len $domain]] = "\r") do={
:set domain [:pick $domain 0 ([:len $domain] - 1)]
}
# Пропускаем localhost
:if ($domain != "0.0.0.0" && $domain != "localhost" && $domain != "" && $count < $maxEntries) do={
:do {
/ip/dns/static/add name=$domain address=0.0.0.0 ttl=1d comment=$adblockComment
:set count ($count + 1)
} on-error={}
}
}
}
}
}
# Удаляем временный файл
/file/remove $tmpFile
# Очищаем DNS-кеш после обновления
/ip/dns/cache/flush
:log info "AdBlock: update complete, added $count entries"
}
# Запуск скрипта каждый день в 04:00
/system/scheduler/add \
name=dns-adblock-daily \
start-time=04:00:00 \
interval=1d \
on-event="/system/script/run dns-adblock-update" \
comment="Daily adblock list update"
# Первый запуск вручную
/system/script/run dns-adblock-update
# Количество записей adblock
/ip/dns/static/print count-only where comment="adblock-auto"
# Просмотр первых 10 записей
/ip/dns/static/print where comment="adblock-auto" count=10
# Резолвим домен через встроенный DNS
:resolve mikrotik.com
# Проверяем, что DoH работает (должен быть статус doh)
/ip/dns/print
# Смотрим статистику кеша
/ip/dns/cache/print count-only
# Просмотр содержимого кеша (поиск конкретного домена)
/ip/dns/cache/print where name~"mikrotik"
# Статистика DNS-сервера
/ip/dns/print stats
# Проверяем, что блокировка работает
:resolve ads.google.com
# Должен вернуть 0.0.0.0
nslookup mikrotik.com 192.168.88.1
nslookup ads.google.com 192.168.88.1
dig @192.168.88.1 mikrotik.com
dig @192.168.88.1 ads.google.com
# Если DoH работает правильно, пакетов на порт 53 (наружу) быть не должно
/tool/sniffer/quick port=ether1 ip-protocol=udp port=53 duration=10s
# Полный сброс кеша
/ip/dns/cache/flush
# Просмотр всех записей в кеше
/ip/dns/cache/print
# Поиск конкретного домена в кеше
/ip/dns/cache/print where name~"google"
# Просмотр записей с отрицательным кешем (NXDOMAIN)
/ip/dns/cache/print where type=NXDOMAIN
# Временное отключение, если атака уже идёт
/ip/dns/set allow-remote-requests=no
# Проверяем время (TLS-сертификаты чувствительны к времени)
/system/clock/print
# Если время неверное — настраиваем NTP
/system/ntp/client/set enabled=yes servers=pool.ntp.org
# Проверяем сертификаты
/certificate/print
# Если сертификатов нет — импортируем заново
/tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem
/certificate/import file-name=digicert-root.pem passphrase=""
# Проверяем, что DNS работает
:resolve raw.githubusercontent.com
# Проверяем маршрут по умолчанию
/ip/route/print where dst-address=0.0.0.0/0
# Проверяем, что fetch работает
/tool/fetch url="https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" dst-path=test.txt mode=https
/file/print where name=test.txt
# Address list с IP-адресами известных DoH-серверов
/ip/firewall/address-list/add list=doh-block address=1.1.1.1 comment="Cloudflare DoH"
/ip/firewall/address-list/add list=doh-block address=1.0.0.1 comment="Cloudflare DoH"
/ip/firewall/address-list/add list=doh-block address=8.8.8.8 comment="Google DoH"
/ip/firewall/address-list/add list=doh-block address=8.8.4.4 comment="Google DoH"
/ip/firewall/address-list/add list=doh-block address=9.9.9.9 comment="Quad9 DoH"
/ip/firewall/address-list/add list=doh-block address=149.112.112.112 comment="Quad9 DoH"
/ip/firewall/address-list/add list=doh-block address=208.67.222.222 comment="OpenDNS DoH"
/ip/firewall/address-list/add list=doh-block address=208.67.220.220 comment="OpenDNS DoH"
# Блокируем HTTPS к этим IP для клиентов LAN
/ip/firewall/filter/add \
chain=forward \
protocol=tcp \
dst-port=443 \
dst-address-list=doh-block \
src-address=192.168.88.0/24 \
action=reject \
reject-with=tcp-reset \
comment="Block browser DoH bypass"
/ip/firewall/filter/add \
chain=forward \
protocol=tcp \
dst-port=443 \
tls-host="dns.google" \
action=reject \
reject-with=tcp-reset \
comment="Block Google DoH by SNI"
/ip/firewall/filter/add \
chain=forward \
protocol=tcp \
dst-port=443 \
tls-host="cloudflare-dns.com" \
action=reject \
reject-with=tcp-reset \
comment="Block Cloudflare DoH by SNI"
# Увеличиваем кеш
/ip/dns/set cache-size=16384 cache-max-ttl=1d
# Проверяем текущую заполненность
/ip/dns/cache/print count-only
# Очищаем кеш для пересборки
/ip/dns/cache/flush
# Блокируем DNS over TLS
/ip/firewall/filter/add \
chain=forward \
protocol=tcp \
dst-port=853 \
src-address=192.168.88.0/24 \
action=reject \
reject-with=tcp-reset \
comment="Block DoT bypass"
# 1. Импорт сертификатов
/tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" dst-path=digicert-root.pem
/certificate/import file-name=digicert-root.pem passphrase=""
# 2. DNS с DoH
/ip/dns/set \
use-doh-server="https://1.1.1.1/dns-query" \
verify-doh-cert=yes \
servers="" \
allow-remote-requests=yes \
cache-size=8192 \
cache-max-ttl=1d
# 3. Firewall: разрешаем DNS только из LAN
/ip/firewall/filter/add chain=input protocol=udp dst-port=53 src-address=192.168.88.0/24 action=accept comment="DNS: allow LAN" place-before=0
/ip/firewall/filter/add chain=input protocol=udp dst-port=53 in-interface-list=WAN action=drop comment="DNS: block WAN"
# 4. DNS hijack
/ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 src-address=192.168.88.0/24 dst-address=!192.168.88.1 action=redirect to-ports=53 comment="DNS hijack"
# 5. Локальные записи
/ip/dns/static/add name=router.home address=192.168.88.1 ttl=1d
# 6. Запуск adblock-скрипта
/system/script/run dns-adblock-update