Запускаю 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-листы. Самое честное решение. Но скейлится до одного гика и не дальше. Жена, мама, коллеги такой панелью пользоваться не будут — а значит, реально работать оно тоже не будет.
Что мне нужно было от «своего»:
- Контроль — конфиги мои, логи мои, кнопка «выключить всё» моя.
- Сервис как первичная сущность, а не домен. Я думаю в категориях «включить Twitch», а не «разрешить *.ttvnw.net, *.live-video.net, static.twitchcdn.net».
- Несколько профилей — рабочий день и выходной фильтруются по-разному.
- Шифрование — DoH/DoT, чтобы провайдер и публичные Wi-Fi не подсматривали резолв.
- Панель, которой может пользоваться не я.
Готового набора с этой комбинацией я не нашёл. Сел писать.
Что такое PLGames DNS, коротко
DNS-резолвер с фильтрующим слоем и веб-панелью. Прописываете мой адрес на роутере или устройстве — все DNS-запросы летят ко мне. По дороге каждый ответ проверяется на правила вашего профиля: разрешён — отдаю как есть; запрещён — отдаю 0.0.0.0 или NXDOMAIN, и приложение получает «такого домена нет».
Главное отличие от готовых решений — единица управления сервис, а не домен. В каталоге я вижу карточки «Steam», «Battle.net», «ChatGPT», «Character.AI», «Asana», «Disney+». За каждой карточкой — мой собственный список доменов и CDN, который ведётся и обновляется. Переключатель на карточке — это атомарная операция: одна кнопка вместо пяти строк в whitelist.
Каталог сервисов: почему именно так
Главное архитектурное решение, на котором держится всё, — каталог как первый класс. Не категория («реклама», «трекинг», «соцсети»), не список доменов, а конкретный сервис с именем, иконкой и пользовательским смыслом.
Технически каждый сервис — это запись вида:
```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% импульсивных переключений.
Грабли, которые я собрал
Чтобы не быть «и всё прекрасно работает», вот честный список того, что ломалось.
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.