Добавить в корзинуПозвонить
Найти в Дзене

Как я устал от рекламы и сделал свой DNS-сервис

Запускаю Battle.net, чтобы за двадцать минут до встречи отыграть ранкед. На главной — баннер игры, в которую я не играл и играть не собираюсь. Сворачиваю — Steam отдельным окном предлагает «специальное предложение». Включаю YouTube на телевизоре — два pre-roll и рекомендация ASMR-стрима. Открываю Asana с ноутбука — что-то блымает в правом нижнем углу. В тот вечер я честно посчитал, сколько раз за день я тыкаю «×» по тому, чего не просил. Получилось пугающе много. В браузере с этим справляется uBlock — но я живу не в браузере, я живу в десяти приложениях на пяти устройствах. Так появился PLGames DNS — мой собственный DNS-сервис, который чистит мусор на уровне сети. Не вместо браузерных блокировщиков, а под ними: одним слоем ниже, чтобы поймать то, что в браузер вообще не приходит. Этот пост — не реклама. Это честный разбор: почему я не взял готовое, что в итоге собрал, что работает, где грабли. Перед тем как писать своё, я последовательно попробовал четыре очевидных варианта. С каждым у
Оглавление
Личный кейс: почему uBlock и Pi-hole мне не хватило, как я собрал PLGames DNS — собственный фильтрующий DNS с каталогом сервисов и пресетами, и какие грабли по дороге собрал
Личный кейс: почему uBlock и Pi-hole мне не хватило, как я собрал PLGames DNS — собственный фильтрующий DNS с каталогом сервисов и пресетами, и какие грабли по дороге собрал

Запускаю Battle.net, чтобы за двадцать минут до встречи отыграть ранкед. На главной — баннер игры, в которую я не играл и играть не собираюсь. Сворачиваю — Steam отдельным окном предлагает «специальное предложение». Включаю YouTube на телевизоре — два pre-roll и рекомендация ASMR-стрима. Открываю Asana с ноутбука — что-то блымает в правом нижнем углу.

В тот вечер я честно посчитал, сколько раз за день я тыкаю «×» по тому, чего не просил. Получилось пугающе много. В браузере с этим справляется uBlock — но я живу не в браузере, я живу в десяти приложениях на пяти устройствах.

Так появился PLGames DNS — мой собственный DNS-сервис, который чистит мусор на уровне сети. Не вместо браузерных блокировщиков, а под ними: одним слоем ниже, чтобы поймать то, что в браузер вообще не приходит.

Этот пост — не реклама. Это честный разбор: почему я не взял готовое, что в итоге собрал, что работает, где грабли.

Почему не подошли готовые решения

Перед тем как писать своё, я последовательно попробовал четыре очевидных варианта. С каждым у меня сломалось примерно в одном и том же месте.

Pi-hole на Raspberry Pi в шкафу. Классика. Работает, но UI из 2017-го, обновление списков — отдельный квест, телефон вне дома уже без фильтрации. Каждый раз, когда мне нужно было разрешить один сервис на одном устройстве, я лез в whitelist руками.

AdGuard Home — то же самое, но симпатичнее, и DoH/DoT из коробки. Минус — списки всё равно сырые «домен/regex», без понятия «сервис». Чтобы временно открыть Disney+ родителям, снова в правила.

NextDNS — это, по сути, оно и есть, только в облаке. Платил год. Две проблемы. Первая: я не контролирую конфиги — то, что они блочат сегодня, завтра ломает мой инфраструктурный сервис, и я узнаю об этом из тикета. Вторая, главная: я не люблю отдавать историю всех DNS-запросов всей семьи третьему лицу. Это вопрос принципа, не паранойи.

Просто `unbound` плюс hosts-листы. Самое честное решение. Но скейлится до одного гика и не дальше. Жена, мама, коллеги такой панелью пользоваться не будут — а значит, реально работать оно тоже не будет.

Что мне нужно было от «своего»:

  1. Контроль — конфиги мои, логи мои, кнопка «выключить всё» моя.
  2. Сервис как первичная сущность, а не домен. Я думаю в категориях «включить Twitch», а не «разрешить *.ttvnw.net, *.live-video.net, static.twitchcdn.net».
  3. Несколько профилей — рабочий день и выходной фильтруются по-разному.
  4. Шифрование — DoH/DoT, чтобы провайдер и публичные Wi-Fi не подсматривали резолв.
  5. Панель, которой может пользоваться не я.

Готового набора с этой комбинацией я не нашёл. Сел писать.

Что такое PLGames DNS, коротко

DNS-резолвер с фильтрующим слоем и веб-панелью. Прописываете мой адрес на роутере или устройстве — все DNS-запросы летят ко мне. По дороге каждый ответ проверяется на правила вашего профиля: разрешён — отдаю как есть; запрещён — отдаю 0.0.0.0 или NXDOMAIN, и приложение получает «такого домена нет».

-2

Главное отличие от готовых решений — единица управления сервис, а не домен. В каталоге я вижу карточки «Steam», «Battle.net», «ChatGPT», «Character.AI», «Asana», «Disney+». За каждой карточкой — мой собственный список доменов и CDN, который ведётся и обновляется. Переключатель на карточке — это атомарная операция: одна кнопка вместо пяти строк в whitelist.

Каталог сервисов: почему именно так

Главное архитектурное решение, на котором держится всё, — каталог как первый класс. Не категория («реклама», «трекинг», «соцсети»), не список доменов, а конкретный сервис с именем, иконкой и пользовательским смыслом.

-3

Технически каждый сервис — это запись вида:

```yaml slug: chatgpt title: ChatGPT category: ai description: "OpenAI ChatGPT — web и desktop" domains:

notes:

last_verified: 2026-04-12 ```

  • chat.openai.com
  • cdn.openai.com
  • api.openai.com
  • "блокировка ломает desktop-клиент полностью"

Звучит просто. Дьявол — в last_verified. Список доменов любого живого сервиса протухает за полгода: добавляется новый CDN, мигрируют API, появляются новые поддомены для A/B-тестов. У NextDNS это решает их штатная команда, у Pi-hole — никто. У меня — частично CI, частично руками: резолвер регулярно прогоняет канареечные запросы и сверяет с ожидаемым. Сломалось — алерт.

Поверх каталога — пресеты. Это просто наборы сервисов с одним общим тумблером:

  • Gaming Pack — Steam, Battle.net, Riot, EA, Epic, GOG, плюс anti-cheat-домены, которые иногда блочатся слишком агрессивными общими листами.
  • Streamer Pack — Twitch, YouTube, OBS-телеметрия, StreamElements, доcки.
  • Work Pack — Asana, Notion, Linear, Slack, GitHub, плюс блок развлекательного.
  • Kids Pack — нужное по белому списку, остальное по умолчанию закрыто.

Пресеты — это просто composed_of: [slug, slug, slug]. Никакой магии, и в этом их сила: пользователь видит, из чего собран пресет, и может выкинуть оттуда что угодно.

Как я живу с этим сам

Дома

На роутере прописан мой адрес. В панели включены: Gaming Pack, Media Pack (YouTube, Netflix, Кинопоиск), общий anti-tracking. Wi-Fi автоматически раздаёт DNS всем — телефонам, телевизору, ноуту, консоли.

Что я с этого реально получаю:

  • Steam-сторфронт чист от «акций» и «специальных предложений» (домены маркетинговой подсистемы блочатся, сама игра качается).
  • Smart TV перестал стучаться на четыре десятка трекеров — мерил через tcpdump на роутере до и после. Загрузка приложений ускорилась «глаз заметно».
  • Мобильные приложения, где баннер закрывает половину экрана, замолкают.

Что я НЕ получаю и не обещаю:

  • Реклама внутри роликов YouTube остаётся. DNS не блочит её, потому что она едет с тех же доменов, что и контент. Это работа SponsorBlock/uBlock в браузере и Revanced на телефоне.
  • Реклама внутри отдельных лаунчеров — иногда едет с того же домена, что и сам лаунчер; здесь тоже DNS бессилен.

Работа

Отдельный профиль. На одном и том же ноутбуке дома и в офисе я переключаюсь между ними. Включены: Work Pack, dev-инфраструктура (GitHub, GitLab, npm, PyPI), общий anti-tracking. Выключены: соцсети, новостные агрегаторы, видеохостинги, кроме корпоративных.

Эффект — не «нельзя зайти в Twitter», а трение. Если мне правда нужно — открываю карточку, переключаю на 30 минут, дальше профиль возвращается. Этот лёгкий барьер убивает 90% импульсивных переключений.

Грабли, которые я собрал

Чтобы не быть «и всё прекрасно работает», вот честный список того, что ломалось.

-4

1. CDN на одном домене. Cloudflare, Fastly, Akamai обслуживают одновременно нужный сервис и тонну рекламных тегов. Блокировать *.cloudfront.net нельзя — половина интернета сломается. Решение: бить по более узким префиксам и держать «исключения CDN» как первоклассную сущность.

2. DNS-кэш приложений. Discord, Slack и пара мессенджеров держат собственный DoH-резолвер и игнорируют системный. Лечится либо принудительным блоком 443 к их dns.discord.com (как побочный эффект — мессенджер ругается), либо честным «да, для этого приложения DNS-фильтрация не работает». В каталоге я это помечаю.

3. False positives на anti-cheat. Некоторые античиты стучатся на домены, которые в общих листах помечены как «телеметрия». Заблочил — игра отваливается с ошибкой. Поэтому Gaming Pack чуть либеральнее стандартного pack'а.

4. iOS Private Relay. Если включён, телефон ходит через релей Apple, и мой DNS не у дел. Решение: либо договариваться с пользователем выключить, либо ставить локальный VPN-профиль.

5. Smart TV с захардкоженным DNS. Часть LG/Samsung стучатся на 8.8.8.8 напрямую, игнорируя то, что выдал роутер. Лечится правилом на роутере: «весь исходящий 53 порт — заворачивать на мой DNS».

Что было неочевидно как разработчику

Если читаешь это, потому что сам собираешь похожее — пара вещей, которые я понял поздно:

  • Negative cache важнее positive. Большая часть запросов в реальной сети — на домены, которые блочатся. Если ты тратишь миллисекунды на каждом — ты тратишь их в большинстве случаев. Я выделил отдельный быстрый путь под «вернуть NXDOMAIN из памяти за микросекунды».
  • Списки протухают тише, чем падает прод. Никто не пишет тикет «у меня перестал работать Steam-маркет» — люди просто перестают пользоваться. Канареечные запросы на каждый сервис — то, без чего не стоит вообще запускать.
  • Веб-панель — это 60% работы. DNS-engine я написал быстро. Панель с нормальной auth, аудит-логом, UX переключателей, мобильной версткой и описаниями сервисов — это месяцы, и она всё ещё активно дорабатывается.

Куда движется

В ближайших планах:

  • Локальный клиент для Win/macOS/Linux, чтобы профиль ехал за устройством, а не за сетью.
  • WireGuard-edge для случаев, когда DNS недостаточно — мобильные приложения с захардкоженными IP.
  • API для команд — чтобы можно было выкатить корпоративный профиль из CI.
  • Открытие каталога сервисов — пока YAML-файлы в приватном репо, в перспективе хочу выложить публично, чтобы любой мог прислать PR на «добавьте поддержку сервиса X».

Если хочется попробовать

Адрес панели и инструкция — на сайте проекта. Бесплатный профиль с базовым каталогом — без регистрации, просто пропишите DNS-адреса. Дальше — расширенные профили, аудит-логи, кастомные списки.

С обратной связью я всегда на связи. Особенно интересны кейсы «сломалось X» — это единственный способ держать каталог в живом состоянии.

Если эта тема вообще зашла — у меня есть и более техническое продолжение: про выбор между `miekg/dns` и форком `unbound`, и про то, как edge-серверы переживают деплои конфигов без даунтайма. Если в комментах будет интерес — напишу. А также другие новости касательно AI можно прочитать на PLAi.