<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>adguard &amp;mdash; Цифровой дворник</title>
    <link>https://articles.clr58.ru/tag:adguard</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 01:18:13 +0000</pubDate>
    <item>
      <title>Свой DNS с блокировкой рекламы: AdGuard Home + MikroTik</title>
      <link>https://articles.clr58.ru/adguard-home-mikrotik</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Реклама на сайтах бесит — это факт. Ставить блокировщик в каждый браузер и на каждый телефон лень, а хочется, чтобы резалось сразу для всей домашней сети: и ноутбук, и телевизор, и гостевой Wi-Fi.&#xA;&#xA;Решение подсмотрел у ребят из Fatmetal — у них есть разбор, как поднять AdGuard Home на VPS с шифрованным DNS. Идея зашла, но я пошёл чуть дальше: вместо «DNS для телефона в любой сети» сделал «DNS для всей домашней сети через роутер». Дальше — что получилось, на какие грабли наступил и почему результат честно не стопроцентный.&#xA;&#xA;Что вообще за AdGuard Home&#xA;&#xA;Это DNS-сервер с фильтрацией. Он принимает запросы от клиентов, сверяет домены со списками блокировки и возвращает 0.0.0.0 для рекламы и трекеров. Всё, что не заблокировано, форвардит наверх — в моём случае на Quad9.&#xA;&#xA;Работает на уровне сети: не нужно ставить приложения на каждое устройство. Телевизор, лампочки, приставка — всё, что ходит через этот DNS, автоматически получает чистый интернет.&#xA;&#xA;Один бинарник на Go, ~43 MiB RAM в простое, конфиг — один YAML. Очень лёгкий.&#xA;&#xA;Схема у меня&#xA;&#xA;LAN-клиенты (192.168.x.x)&#xA;    ↓ DNS по DHCP = роутер&#xA;MikroTik (роутер)&#xA;    ↓ DoH (DNS over HTTPS)&#xA;dns.example (Caddy, валидный TLS)&#xA;    ↓ reverseproxy&#xA;AdGuard Home (LXC, 10.0.0.22)&#xA;    ↓ апстрим DoH&#xA;Quad9 (9.9.9.9)&#xA;&#xA;Клиенты даже не знают, что существует AdGuard: по DHCP они получают адрес роутера, а роутер уже сам ходит на наш DNS через шифрованный DoH. Одна настройка на роутере — и вся сеть фильтруется.&#xA;&#xA;Как ставил&#xA;&#xA;Шаг 1. AdGuard Home в LXC. У меня Proxmox, поэтому поднял отдельный контейнер: Ubuntu 26.04, один бинарник AdGuard Home v0.107.79 в /opt/AdGuardHome, systemd-сервис.&#xA;&#xA;Первая засада: вручную написанный YAML сервис не принял («cannot construct !!seq into home.clientsConfig») — в свежих версиях схема конфига поменялась. Лечится просто: запустил AdGuard без конфига, он сам поднял мастер на порту 3000, я прошёл его через API — и только потом доправил YAML под себя. Урок: не пишите конфиг руками, дайте сервису сгенерить.&#xA;&#xA;Шаг 2. DoH. По задумке у Fatmetal AdGuard сам терминирует TLS (DoH на 443, DoT/DoQ на 853). Я попробовал так же — и упёрся в то, что самоподписанный сертификат AdGuard отвергает («validating certificate pair: empty certificate»). А выпускать Let&#39;s Encrypt на сам AdGuard — лишняя возня, когда у меня уже есть Caddy, который умеет TLS из коробки.&#xA;&#xA;Поэтому схему упростил: TLS терминирует Caddy на поддомене dns.example, а внутри сети гонит plain HTTP на AdGuard (у него есть режим insecure DoH ровно для reverse-proxy). Снаружи клиент видит валидный сертификат, внутри — ничего шифровать не надо.&#xA;&#xA;Шаг 3. MikroTik. На роутере одна команда:&#xA;&#xA;/ip dns set use-doh-server=&#34;https://dns.example/dns-query&#34; servers=&#34;9.9.9.9,149.112.112.112&#34;&#xA;&#xA;servers оставил как фолбек: если наш DNS ляжет — роутер продолжит резолвить через Quad9 напрямую. DNS — критичный сервис, если он умрёт, «пропадёт интернет» на всех устройствах. Поэтому фолбек обязателен.&#xA;&#xA;Грабли, на которые наступил&#xA;&#xA;Грабля №1: роутер не может ходить на свой же внешний IP. MikroTik резолвил dns.example в свой WAN-адрес, шёл на него сам — и ничего не работало (hairpin NAT для собственного трафика не действует). Решение: статическая запись на роутере, которая ведёт dns.example прямо на Caddy через WireGuard-туннель:&#xA;&#xA;/ip dns static add name=&#34;dns.example&#34; address=10.99.0.2 comment=&#34;adguard-doh-via-wg&#34;&#xA;&#xA;Грабля №2: allow-remote-requests=no ломает DNS для всей LAN. Я решил «закрыть порт 53 наружу» этой настройкой — и клиенты в локалке перестали резолвить вообще. На RouterOS 7 эта опция отключает ответы DNS-сервера не только снаружи, но и для локальных сетей. Вернул yes, а снаружи порт 53 закрыл штатно — правилом firewall. Урок: на MikroTik не закрывайте DNS через allow-remote-requests, только через firewall.&#xA;&#xA;Грабля №3: белый список внутри фильтра. Домен www.googleadservices.com (это Google Ads) упорно проходил — в самом списке AdGuard DNS filter оказалось whitelist-правило @@||www.googleadservices.com^|. Обычное правило блокировки его не перебивало. Лечится модификатором $important, который имеет приоритет над whitelist:&#xA;&#xA;||www.googleadservices.com^$important&#xA;&#xA;Грабля №4: кэш. После добавления правил реклама всё равно видна — потому что телефон и браузер закешировали реальные IP рекламных доменов ещё до блокировки. Инкогнито помогает от кэша браузера, но не от DNS-кэша ОС. Лечится временем или перезагрузкой устройства.&#xA;&#xA;Что добавил для отечественной рекламы&#xA;&#xA;Базовый список AdGuard DNS filter (178 тысяч правил) — хорошо, но российские рекламные сети в нём покрыты не полностью. Дописал свои правила в userrules:&#xA;&#xA;ads.adfox.ru, adfox.ru — AdFox, рекламная сеть Яндекса (баннеры на новостных сайтах)&#xA;an.yandex.ru, yabs.yandex.ru — Яндекс.Директ&#xA;24smi.net — виджеты и видео 24СМИ&#xA;top-fwz1.mail.ru — счётчик Mail.ru&#xA;counter.yadro.ru — счётчик Яндекс.Метрики (спорно: это аналитика, но она же трекинг)&#xA;wcm.weborama-tech.ru — Weborama&#xA;ad.adriver.ru — AdRiver&#xA;&#xA;Проверял на живых сайтах: rzn.info, 7info.ru — после правок их рекламные домены резолвятся в 0.0.0.0.&#xA;&#xA;А теперь честно про результат&#xA;&#xA;Работает: вся реклама, которая живёт на отдельных доменах (AdFox, Директ, 24СМИ, Google Ads), режется на уровне DNS для всех устройств в сети разом. Это, кстати, большая часть того, что бесит на новостных сайтах.&#xA;&#xA;Не работает:&#xA;Реклама с CDN самого сайта. Часть баннеров новостники отдают со своих же доменов (cdn1.rzn.info и т.п.). DNS-фильтр не может отличить рекламу от контента на одном домене — иначе сломает весь сайт.&#xA;Яндекс.Директ через yandex.ru/ads. Скрипт грузится с основного домена Яндекса как путь (/ads/system/context.js). Заблокировать весь yandex.ru нельзя — это же сам Яндекс. DNS тут бессилен в принципе.&#xA;Видеореклама на плеерах — если ролик идёт с того же домена, что и само видео, DNS не поможет.&#xA;YouTube — реклама с тех же доменов, что и контент. DNS-фильтр это не берёт, нужен uBlock Origin или подобное.&#xA;&#xA;Итого: DNS-фильтр закрывает, грубо, 70–80% раздражающей рекламы — всю, что на отдельных доменах. Остальное — это либо реклама с контентных CDN, либо встроенная в страницу, где DNS в принципе не может отличить. Для полной чистки в браузере всё равно нужен uBlock Origin.&#xA;&#xA;Вывод&#xA;&#xA;Для домашней сети связка «MikroTik + AdGuard Home через DoH» — это лучший баланс: одна настройка на роутере, вся сеть фильтруется, ничего не надо ставить на устройства. Но честно: это не 100% — DNS-блокировка по определению не режет рекламу с тех же доменов, что и контент.&#xA;&#xA;Подход и первые шаги подсмотрел у Fatmetal — у них хороший разбор, рекомендую. А грабли с MikroTik, whitelist&#39;ом и отечественной рекламой — уже мои, делюсь, чтобы вы не наступали.&#xA;&#xA;А у вас что режет рекламу дома — DNS на роутере, uBlock, или всё вместе?&#xA;&#xA;#selfhosting #network #dns #adguard #mikrotik #privacy&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-adguard-home-digclean.jpg" alt="Обложка"></p>

<p>Реклама на сайтах бесит — это факт. Ставить блокировщик в каждый браузер и на каждый телефон лень, а хочется, чтобы резалось сразу для всей домашней сети: и ноутбук, и телевизор, и гостевой Wi-Fi.</p>

<p>Решение подсмотрел у ребят из <a href="https://fatmetal.ru/knowledge-base/adguard">Fatmetal</a> — у них есть разбор, как поднять AdGuard Home на VPS с шифрованным DNS. Идея зашла, но я пошёл чуть дальше: вместо «DNS для телефона в любой сети» сделал «DNS для всей домашней сети через роутер». Дальше — что получилось, на какие грабли наступил и почему результат честно не стопроцентный.</p>

<h2 id="что-вообще-за-adguard-home">Что вообще за AdGuard Home</h2>

<p>Это DNS-сервер с фильтрацией. Он принимает запросы от клиентов, сверяет домены со списками блокировки и возвращает <code>0.0.0.0</code> для рекламы и трекеров. Всё, что не заблокировано, форвардит наверх — в моём случае на Quad9.</p>

<p>Работает на уровне сети: не нужно ставить приложения на каждое устройство. Телевизор, лампочки, приставка — всё, что ходит через этот DNS, автоматически получает чистый интернет.</p>

<p>Один бинарник на Go, ~43 MiB RAM в простое, конфиг — один YAML. Очень лёгкий.</p>

<h2 id="схема-у-меня">Схема у меня</h2>

<pre><code>LAN-клиенты (192.168.x.x)
    ↓ DNS по DHCP = роутер
MikroTik (роутер)
    ↓ DoH (DNS over HTTPS)
dns.example (Caddy, валидный TLS)
    ↓ reverse_proxy
AdGuard Home (LXC, 10.0.0.22)
    ↓ апстрим DoH
Quad9 (9.9.9.9)
</code></pre>

<p>Клиенты даже не знают, что существует AdGuard: по DHCP они получают адрес роутера, а роутер уже сам ходит на наш DNS через шифрованный DoH. Одна настройка на роутере — и вся сеть фильтруется.</p>

<h2 id="как-ставил">Как ставил</h2>

<p><strong>Шаг 1. AdGuard Home в LXC.</strong> У меня Proxmox, поэтому поднял отдельный контейнер: Ubuntu 26.04, один бинарник AdGuard Home v0.107.79 в <code>/opt/AdGuardHome</code>, systemd-сервис.</p>

<p>Первая засада: вручную написанный YAML сервис не принял («cannot construct !!seq into home.clientsConfig») — в свежих версиях схема конфига поменялась. Лечится просто: запустил AdGuard без конфига, он сам поднял мастер на порту 3000, я прошёл его через API — и только потом доправил YAML под себя. Урок: не пишите конфиг руками, дайте сервису сгенерить.</p>

<p><strong>Шаг 2. DoH.</strong> По задумке у Fatmetal AdGuard сам терминирует TLS (DoH на 443, DoT/DoQ на 853). Я попробовал так же — и упёрся в то, что самоподписанный сертификат AdGuard отвергает («validating certificate pair: empty certificate»). А выпускать Let&#39;s Encrypt на сам AdGuard — лишняя возня, когда у меня уже есть Caddy, который умеет TLS из коробки.</p>

<p>Поэтому схему упростил: <strong>TLS терминирует Caddy</strong> на поддомене <code>dns.example</code>, а внутри сети гонит plain HTTP на AdGuard (у него есть режим <code>insecure</code> DoH ровно для reverse-proxy). Снаружи клиент видит валидный сертификат, внутри — ничего шифровать не надо.</p>

<p><strong>Шаг 3. MikroTik.</strong> На роутере одна команда:</p>

<pre><code>/ip dns set use-doh-server=&#34;https://dns.example/dns-query&#34; servers=&#34;9.9.9.9,149.112.112.112&#34;
</code></pre>

<p><code>servers</code> оставил как фолбек: если наш DNS ляжет — роутер продолжит резолвить через Quad9 напрямую. DNS — критичный сервис, если он умрёт, «пропадёт интернет» на всех устройствах. Поэтому фолбек обязателен.</p>

<h2 id="грабли-на-которые-наступил">Грабли, на которые наступил</h2>

<p><strong>Грабля №1: роутер не может ходить на свой же внешний IP.</strong> MikroTik резолвил <code>dns.example</code> в свой WAN-адрес, шёл на него сам — и ничего не работало (hairpin NAT для собственного трафика не действует). Решение: статическая запись на роутере, которая ведёт <code>dns.example</code> прямо на Caddy через WireGuard-туннель:</p>

<pre><code>/ip dns static add name=&#34;dns.example&#34; address=10.99.0.2 comment=&#34;adguard-doh-via-wg&#34;
</code></pre>

<p><strong>Грабля №2: <code>allow-remote-requests=no</code> ломает DNS для всей LAN.</strong> Я решил «закрыть порт 53 наружу» этой настройкой — и клиенты в локалке перестали резолвить вообще. На RouterOS 7 эта опция отключает ответы DNS-сервера не только снаружи, но и для локальных сетей. Вернул <code>yes</code>, а снаружи порт 53 закрыл штатно — правилом firewall. Урок: на MikroTik не закрывайте DNS через <code>allow-remote-requests</code>, только через firewall.</p>

<p><strong>Грабля №3: белый список внутри фильтра.</strong> Домен <code>www.googleadservices.com</code> (это Google Ads) упорно проходил — в самом списке AdGuard DNS filter оказалось whitelist-правило <code>@@||www.googleadservices.com^|</code>. Обычное правило блокировки его не перебивало. Лечится модификатором <code>$important</code>, который имеет приоритет над whitelist:</p>

<pre><code>||www.googleadservices.com^$important
</code></pre>

<p><strong>Грабля №4: кэш.</strong> После добавления правил реклама всё равно видна — потому что телефон и браузер закешировали реальные IP рекламных доменов ещё до блокировки. Инкогнито помогает от кэша браузера, но не от DNS-кэша ОС. Лечится временем или перезагрузкой устройства.</p>

<h2 id="что-добавил-для-отечественной-рекламы">Что добавил для отечественной рекламы</h2>

<p>Базовый список AdGuard DNS filter (178 тысяч правил) — хорошо, но российские рекламные сети в нём покрыты не полностью. Дописал свои правила в user_rules:</p>
<ul><li><code>ads.adfox.ru</code>, <code>adfox.ru</code> — AdFox, рекламная сеть Яндекса (баннеры на новостных сайтах)</li>
<li><code>an.yandex.ru</code>, <code>yabs.yandex.ru</code> — Яндекс.Директ</li>
<li><code>24smi.net</code> — виджеты и видео 24СМИ</li>
<li><code>top-fwz1.mail.ru</code> — счётчик Mail.ru</li>
<li><code>counter.yadro.ru</code> — счётчик Яндекс.Метрики (спорно: это аналитика, но она же трекинг)</li>
<li><code>wcm.weborama-tech.ru</code> — Weborama</li>
<li><code>ad.adriver.ru</code> — AdRiver</li></ul>

<p>Проверял на живых сайтах: <code>rzn.info</code>, <code>7info.ru</code> — после правок их рекламные домены резолвятся в <code>0.0.0.0</code>.</p>

<h2 id="а-теперь-честно-про-результат">А теперь честно про результат</h2>

<p><strong>Работает:</strong> вся реклама, которая живёт на отдельных доменах (AdFox, Директ, 24СМИ, Google Ads), режется на уровне DNS для всех устройств в сети разом. Это, кстати, большая часть того, что бесит на новостных сайтах.</p>

<p><strong>Не работает:</strong>
– <strong>Реклама с CDN самого сайта.</strong> Часть баннеров новостники отдают со своих же доменов (<code>cdn1.rzn.info</code> и т.п.). DNS-фильтр не может отличить рекламу от контента на одном домене — иначе сломает весь сайт.
– <strong>Яндекс.Директ через <code>yandex.ru/ads</code>.</strong> Скрипт грузится с основного домена Яндекса как путь (<code>/ads/system/context.js</code>). Заблокировать весь <code>yandex.ru</code> нельзя — это же сам Яндекс. DNS тут бессилен в принципе.
– <strong>Видеореклама на плеерах</strong> — если ролик идёт с того же домена, что и само видео, DNS не поможет.
– <strong>YouTube</strong> — реклама с тех же доменов, что и контент. DNS-фильтр это не берёт, нужен uBlock Origin или подобное.</p>

<p>Итого: DNS-фильтр закрывает, грубо, <strong>70–80%</strong> раздражающей рекламы — всю, что на отдельных доменах. Остальное — это либо реклама с контентных CDN, либо встроенная в страницу, где DNS в принципе не может отличить. Для полной чистки в браузере всё равно нужен uBlock Origin.</p>

<h2 id="вывод">Вывод</h2>

<p>Для домашней сети связка «MikroTik + AdGuard Home через DoH» — это лучший баланс: одна настройка на роутере, вся сеть фильтруется, ничего не надо ставить на устройства. Но честно: <strong>это не 100%</strong> — DNS-блокировка по определению не режет рекламу с тех же доменов, что и контент.</p>

<p>Подход и первые шаги подсмотрел у <a href="https://fatmetal.ru/knowledge-base/adguard">Fatmetal</a> — у них хороший разбор, рекомендую. А грабли с MikroTik, whitelist&#39;ом и отечественной рекламой — уже мои, делюсь, чтобы вы не наступали.</p>

<p>А у вас что режет рекламу дома — DNS на роутере, uBlock, или всё вместе?</p>

<p><a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:dns" class="hashtag"><span>#</span><span class="p-category">dns</span></a> <a href="https://articles.clr58.ru/tag:adguard" class="hashtag"><span>#</span><span class="p-category">adguard</span></a> <a href="https://articles.clr58.ru/tag:mikrotik" class="hashtag"><span>#</span><span class="p-category">mikrotik</span></a> <a href="https://articles.clr58.ru/tag:privacy" class="hashtag"><span>#</span><span class="p-category">privacy</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/adguard-home-mikrotik</guid>
      <pubDate>Sat, 29 Aug 2026 04:00:39 +0000</pubDate>
    </item>
  </channel>
</rss>