Сайт «не существует»: история про DNS, ТСПУ и одну галочку в Happ

Обновлено 18 сентября 2026~22 мин чтения

Однажды у человека в Happ перестало открываться вообще всё, даже ya.ru, а Telegram при этом работал как ни в чём не бывало. Распутывая этот случай, мы прошли весь путь: от того, как телефон узнаёт адрес сайта, до того, почему в конце августа 2026 года в России перестали помогать Zapret и ByeByeDPI.

ℹ️ О чём эта история

Никаких специальных знаний не нужно: каждый термин объясняется по ходу, а команды для проверки можно пропустить.

Если вам нужно не разобраться, а просто починить, — есть короткая инструкция на пять минут: В Happ не открываются сайты, а Telegram работает.

Вечер, когда ничего не открывалось

Сообщение пришло в поддержку 14 сентября и выглядело обыденно: «В Happ не работает YouTube, а Telegram работает». Такие жалобы приходят часто, и обычно дело в конкретном сервере. Но дальше история стала странной.

УликаЧто она подсказывает
Другой сервер в Happ — то же самоедело не в сервере
В приложении INCY на тех же серверах всё открываетсясерверы и дорога до них исправны
Wi-Fi или мобильный интернет — без разницыдело не в провайдере
Не открывается вообще ничего, даже ya.ruсломалось что-то общее для всех сайтов
Telegram работаетTelegram чем-то отличается от остальных
В журнале Happ пустоприложение даже не пыталось соединиться
Выключили в настройках «Использовать локальную DNS» — всё заработаловиновник найден, но непонятно, почему

Все улики сходятся на трёх буквах: DNS. Чтобы понять, что именно сломалось, придётся разобраться, что это такое. Это полезно и само по себе: в августе 2026 года DNS внезапно стал одной из главных тем для всех, кто пользуется интернетом в России.

Что такое DNS: справочная интернета

Компьютеры в интернете находят друг друга по номерам — IP-адресам вроде 77.88.55.242. Людям удобнее имена: ya.ru, youtube.com. DNS — это справочная, которая переводит имя в номер.

Каждый раз, когда вы открываете сайт, телефон сначала звонит в справочную: «Какой номер у ya.ru?» — и только получив ответ, соединяется с самим сайтом. Обычно это занимает несколько миллисекунд, и никто этого не замечает.

Вот как выглядит такой вопрос, если задать его вручную командой dig (она есть в macOS и Linux):

$ dig ya.ru

;; status: NOERROR
;; ANSWER SECTION:
ya.ru.    2    IN    A    77.88.55.242
ya.ru.    2    IN    A    77.88.44.242
ya.ru.    2    IN    A    5.255.255.242

NOERROR значит «всё в порядке», дальше идут три номера, по любому из которых можно открыть сайт. Число 2 — сколько секунд этот ответ можно помнить, прежде чем спрашивать снова.

Теперь понятна первая улика. Telegram знает номера своих серверов наизусть, справочная ему не нужна. Поэтому, когда DNS ломается, Telegram продолжает работать, а всё остальное — нет. И журнал Happ пуст по той же причине: номер не получен, звонить некуда, записывать нечего.

Кто отвечает на вопрос

Справочная, которой звонит телефон, называется резолвером. По умолчанию это резолвер вашего провайдера, но можно выбрать публичный: у Google это 8.8.8.8, у Cloudflare — 1.1.1.1, у Quad9 — 9.9.9.9, у Яндекса — 77.88.8.8.

Сам резолвер всех номеров не знает. Он спрашивает по цепочке: сначала корневой сервер интернета («кто отвечает за .ru?»), потом сервер зоны .ru («кто отвечает за ya.ru?»), и только затем сервер самого сайта. Полученный ответ резолвер запоминает, чтобы в следующий раз не бегать заново.

Ваш телефон «какой номер у ya.ru?» Резолвер провайдера или публичный запоминает ответ Корневой сервер Сервер зоны .ru Сервер ya.ru «спросите у .ru» «спросите у ya.ru» «77.88.55.242» 1. вопрос 5. ответ 2 3 4
Рис. 1. Как телефон узнаёт номер сайта

Открытка, конверт и посылка: DNS, DoT и DoH

Классический DNS придумали в 1980-х, когда о слежке никто не думал. Поэтому вопрос в справочную — это открытка: он летит открытым текстом на порт 53, и любой узел по дороге видит, какой сайт вы ищете. Хуже того, по дороге можно подсунуть свой ответ, и отличить его от настоящего будет нечем.

Чтобы это исправить, придумали зашифрованные варианты:

СпособКак ходитВидно ли, что вы ищетеКак ему можно помешать
Обычный DNS (в Happ — DoU)UDP, порт 53да, целикомподменить ответ или тихо перенаправить
Обычный DNS по TCPTCP, порт 53дато же самое, но пока трогают реже
DoTTLS, порт 853нет, но видно, что это DNSзакрыть порт или оборвать соединение
DoHHTTPS, порт 443нетузнать справочную по имени и не пропускать
DoQQUIC, порт 853нетзакрыть порт
DNSCryptсвой протоколнетузнать по адресу или поведению

Эти вещи часто встречаются под бытовыми названиями. «Частный DNS» в настройках Android — это DoT. «Безопасный DNS» в браузере Chrome или Firefox — это DoH. А ещё есть DNSSEC — цифровая подпись ответа, которая могла бы разоблачать подмену. Но пользуются ей далеко не все сайты: например, у youtube.com подписи нет, и проверять там нечего.

И последнее, самое важное для этой истории. Вопрос, заданный внутри VPN-туннеля, не видит никто по дороге — даже если это самая простая «открытка». Для провайдера туннель — это просто поток зашифрованных байтов до одного сервера. Что внутри, он не знает.

Почему о DNS заговорили все

Годами блокировки в России работали по имени сайта в момент соединения. DNS в основном оставался в стороне: хочешь честный ответ — укажи Google или Cloudflare вместо провайдера. Этот совет кочевал из инструкции в инструкцию. В 2026 году он перестал работать.

КогдаЧто заметили
Начало июляУ нескольких крупных операторов на время перестали работать TCP-подключения к DNS Google. Через какое-то время всё вернули — похоже на пробу
Середина августаШифрованный DNS Google и Cloudflare перестал отвечать у части абонентов Ростелекома, Дом.ру, Таттелекома, SkyNet и Билайна. DoT обрывался сразу, DoH «зависал» до таймаута
Вечер 26 августаСамые обычные DNS-запросы к 1.1.1.1 и 8.8.8.8 стали перехватывать: вместо Google и Cloudflare на них отвечает другой сервер

Что обнаружил автор статьи на Хабре

27 августа на Хабре вышла статья «На ТСПУ начали перехватывать открытые DNS запросы к 1.1.1.1, 8.8.8.8». ТСПУ — это оборудование, которое по закону стоит в сетях российских операторов и фильтрует трафик. Автор, angry_agent, провёл маленькое расследование, которое читается как детектив.

Началось с простого вопроса к Google о YouTube:

$ dig youtube.com @8.8.8.8

;; status: NXDOMAIN
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)

NXDOMAIN означает «такого домена не существует». YouTube, разумеется, существует. Но самое интересное спрятано в строке flags: там стоит aa — «полномочный ответ». Так отвечает только хозяин домена. Google — это справочная, а не хозяин youtube.com, и так ответить он не мог. Значит, отвечал кто-то другой, представившись Google.

Вторая улика: тот же вопрос, отправленный не по UDP, а по TCP, получил настоящие адреса:

$ dig +tcp youtube.com @8.8.8.8

;; status: NOERROR
;; ANSWER SECTION:
youtube.com.    300    IN    A    64.233.162.136
youtube.com.    300    IN    A    64.233.162.91

Третья улика оказалась самой изящной. У каждого пакета в интернете есть счётчик пересадок: каждый узел на пути уменьшает его на единицу, а когда счётчик доходит до нуля, узел выбрасывает пакет и присылает отправителю уведомление «не доставлено». Важная деталь: в уведомление узел вкладывает копию заголовка погибшего пакета — таким, каким пакет к нему доехал, вместе с адресом получателя.

Автор отправил DNS-вопрос на 8.8.8.8 с запасом всего на две пересадки. Уходя от него, пакет нёс адрес 8.8.8.8 — это видно в журнале отправки. Пакет погиб на втором узле, пришло уведомление, а в копии заголовка адрес получателя был уже 195.208.5.1 — сервер НСДИ, национальной системы доменных имён.

Уехал пакет с одним адресом, а до второго узла доехал с другим. Отправитель адрес не менял, а узел лишь скопировал то, что к нему пришло, — значит, адрес переписали между ними, прямо по дороге. Кто это сделал, показал контрольный опыт: такой же пакет, но с произвольными байтами вместо DNS-вопроса, доезжал с прежним 8.8.8.8. Обычный маршрутизатор в содержимое пакетов не заглядывает, значит, адрес меняет оборудование, которое их читает, — ТСПУ. Такая подмена адреса называется DNAT.

Картина сложилась такая:

Без VPN: обычный вопрос к 8.8.8.8 Телефон «youtube.com?» ТСПУ переписывает адрес Резолвер НСДИ «такого сайта нет» Google не узнает ответ приходит от имени 8.8.8.8: NXDOMAIN Через VPN: тот же вопрос внутри туннеля Телефон «youtube.com?» туннель: ТСПУ видит только зашифрованные байты Сервер VPN спросит Google Ответ настоящий: youtube.com → 64.233.163.136
Рис. 2. Один и тот же вопрос без VPN и внутри туннеля

Поэтому снаружи всё выглядит так, будто интернет в полном порядке, а конкретный сайт просто исчез.

Система оказалась не безупречной. Если сначала отправить вопрос «на две пересадки», повторный вопрос доходил до настоящего Google. А если выстрелить пачкой одинаковых вопросов, «не существует» получал только первый, остальные — настоящие адреса. В комментариях к статье картина пестрее: у одних провайдеров вместо «не существует» приходит адрес страницы-заглушки, у других перехвата нет вовсе. Вывод один: это происходит не везде и не всегда одинаково.

Зачем ТСПУ переписывать адрес

Сами цели ТСПУ никто не публикует, но логику можно восстановить. Задача простая: чтобы заблокированный сайт не открывался, даже если человек сменил DNS на Google или Cloudflare. Долгие годы это был самый простой обход: справочная провайдера врёт, а 8.8.8.8 отвечает честно.

С вопросом, который летит к Google, у оборудования есть три варианта:

ВариантЧем он плох или хорош
Выбросить вопросу человека ломается весь интернет, а не один сайт; это заметно, и в ответ сразу меняют DNS
Сочинить ответ самомупришлось бы держать список заблокированных доменов и на лету собирать ответы на DNS-трафик всей страны: дорого, и легко ошибиться
Переслать вопрос в НСДИсписок там уже есть, и сервер умеет отвечать как обычная справочная; оборудованию остаётся только поменять адрес

Третий вариант самый дешёвый: ТСПУ ничего не решает сам, а лишь переставляет адреса. На пути туда в вопросе 8.8.8.8 меняется на 195.208.5.1, и вопрос уходит в НСДИ. На пути обратно в ответе адрес отправителя меняется с 195.208.5.1 на 8.8.8.8.

Обратная замена обязательна. Телефон ждёт ответ от того, кого спрашивал, и ответ от незнакомого 195.208.5.1 он бы просто выбросил. Именно поэтому подмена невидима: человек уверен, что ему ответил Google.

Что это даёт:

Трогают при этом только DNS-вопросы. На тот же адрес бывает и другой трафик, переписывать его незачем: цель — именно вопрос в справочную.

⚠️ Все ваши вопросы уходят в одно место

Перехват касается не только запрещённых сайтов. Когда он включён, государственный резолвер получает все DNS-вопросы, отправленные на эти адреса, — то есть видит, какие сайты вы открываете, какими бы они ни были.

Почему DoT «рвётся», а DoH «зависает»

Параллельно шифрованный DNS сломался двумя разными способами. Разница между ними как раз объясняется открыткой, конвертом и посылкой.

DoT ходит через своё окошко — порт 853. Чтобы его закрыть, не нужно ничего читать: достаточно правила «всё, что идёт на 853-й порт, оборвать». Соединение устанавливается и тут же рвётся, приложение сразу получает ошибку.

DoH прячется в порт 443 вместе со всеми сайтами, закрыть его целиком нельзя — упадут банки и госуслуги. Но в самом начале HTTPS-соединения клиент открытым текстом называет имя сервера: dns.google или cloudflare-dns.com. Оборудование узнаёт это имя и молча выбрасывает пакеты. Ошибки нет, ответа тоже нет. Приложение ждёт секунды, а потом сдаётся.

Для человека разница выглядит так: при сломанном DoT интернет пропадает сразу, при сломанном DoH всё мучительно медленно открывается или не открывается совсем.

Что это ломает в обычной жизни

Где у вас указан DNSЧто происходит
8.8.8.8 или 1.1.1.1 в роутере, Windows или macOSзаблокированные сайты «не существуют», браузер пишет DNS_PROBE_FINISHED_NXDOMAIN
«Частный DNS» Google или Cloudflare на AndroidAndroid сообщает, что частный DNS-сервер недоступен, и интернет пропадает во всех приложениях
«Безопасный DNS» Google или Cloudflare в браузерестраницы открываются по нескольку секунд или не открываются
Приложение с «зашитым» 8.8.8.8то же, что с роутером
Прокси или сервер, указанный доменным именем, а не адресомподключение идёт очень долго или не идёт вовсе

Отдельно: почему перестали помогать Zapret и ByeByeDPI

Если YouTube годами открывался через Zapret на компьютере или роутере или через ByeByeDPI на телефоне, а в конце августа вдруг перестал, скорее всего, дело именно в этом.

Zapret и ByeByeDPI работают совсем не так, как VPN. Они не везут трафик за границу, а обманывают оборудование в момент соединения: дробят первые пакеты, подсовывают ложные, чтобы фильтр не разглядел имя сайта в приветствии. Это хитрая маскировка самого соединения.

Но соединение начинается только после того, как получен адрес. Если справочная ответила «такого сайта не существует», соединения не будет вовсе, и маскировать нечего. Вот та самая мысль из статьи на Хабре: блокировка сдвинулась на шаг раньше, туда, где эти программы не работают.

Разработчики Zapret честно пишут об этом в документации, в разделе «Когда это работать не будет». Первым пунктом там стоит: «Если подменяется DNS».

⛔ Zapret и ByeByeDPI не защищают DNS

Обе программы маскируют соединение с сайтом, но не вопрос в справочную. Ирония в том, что инструкции к ним годами советовали «независимые» 8.8.8.8 и 1.1.1.1 — именно эти адреса с 26 августа и перехватывают. У ByeByeDPI в режиме VPN по умолчанию стоит DNS 1.1.1.1 обычным запросом, то есть ровно под перехват.

Узнать эту ситуацию просто: обходчик включён и вроде бы работает, а браузер пишет не «соединение сброшено», а «сайт не найден» или DNS_PROBE_FINISHED_NXDOMAIN.

Что пробуют люди. Сразу оговоримся: всё это работает сегодня и может перестать завтра.

Как проверить у себя

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

На Windows откройте командную строку и сравните два ответа. Первая команда спрашивает обычным способом, вторая — по TCP:

nslookup youtube.com 8.8.8.8
nslookup -vc youtube.com 8.8.8.8

На macOS и Linux то же самое делает dig:

dig youtube.com @8.8.8.8
dig +tcp youtube.com @8.8.8.8
Что вы увиделиЧто это значит
Оба раза настоящие адресаперехвата на вашей линии сейчас нет
Обычный запрос: «не существует» или NXDOMAIN, по TCP — адресаперехват есть
В ответе от «Google» стоит флаг aaотвечал не Google
Вместо адресов сайта приходит 127.0.0.1 или адрес страницы-заглушкиподмена адресом-заглушкой
Ответа нет вовсе, только таймаутзапрос выбрасывается по дороге

DNS в Happ: где он живёт и зачем там столько настроек

Вернёмся к нашей истории. Чтобы понять, при чём тут галочка, нужно знать, как Happ обращается с DNS.

Happ — это не просто труба до сервера. Внутри приложения работает ядро Xray со своей справочной и своими правилами: одни сайты оно открывает напрямую, другие через VPN-сервер. Поэтому и справочных в Happ две.

«Удалённый DNS» отвечает за сайты, которые идут через VPN. Вопрос в эту справочную уходит через туннель, поэтому провайдер его не видит и подменить не может. Даже если здесь указан 1.1.1.1, перехват ему не страшен: пакет покидает туннель уже за границей.

«Домашний DNS» отвечает за сайты, которые идут напрямую, — обычно российские. Вопрос уходит мимо VPN, обычным путём через провайдера, и именно здесь перехват может задеть. По документации Happ по умолчанию здесь стоит обычный запрос к 8.8.8.8 — тот самый адрес, который сейчас перехватывают. Для российских сайтов это обычно безвредно: НСДИ отвечает на них честно. А вот если вручную поставить сюда шифрованный DNS Google, он упрётся в «зависание». Поэтому у нас там стоит Яндекс по DoH: он в России не блокируется и отвечает быстро.

Вот как это выглядит на двух сайтах:

Вы открываетеРешение HappКто ищет адресКак идёт вопрос
youtube.comчерез VPN«Удалённый DNS»внутри туннеля, провайдер не видит
ozon.ruнапрямую«Домашний DNS»мимо туннеля, зашифрованно, к Яндексу

Остальные настройки DNS в Happ, коротко и понятно:

НастройкаЧто делаетНужно ли трогать
«Использовать локальную DNS»перехватывает DNS-вопросы всех приложений телефона и отдаёт их ядру, чтобы оно ответило по своим правилам, а не пустило их «открыткой»можно включать
«Локальный порт DNS»служебный порт этого перехватанет
«Использовать поддельную DNS»приложение сразу получает фиктивный адрес, а настоящий ищется уже по правилам ядра; вопрос вообще не уходит в сеть открытымлучше не включать: часть приложений с этим работает плохо
«DNS туннеля»появляется вместо «Удалённого DNS», когда подписка приходит полными конфигурацияминет
«Использовать DNS из JSON»брать справочную из конфигурации, которую прислал сервиснет

Про «DNS туннеля» стоит сказать отдельно. Чтобы в списке серверов был пункт «Авто», который сам выбирает лучший сервер, мы присылаем Happ не короткие ссылки, а полные конфигурации ядра. Такой режим Happ называет ограниченным и честно предупреждает: «Маршрутизация HAPP не применяется к конфигурации JSON». Все правила, включая DNS, лежат внутри присланной конфигурации, а приложение передаёт её ядру как есть.

💡 Если у вас Happ от Akonit

Ничего менять не нужно: правильные справочные уже заданы. «Использовать локальную DNS» можно включать — с 14 сентября это работает. Не вписывайте вручную DNS Google или Cloudflare в настройки телефона и роутера: сейчас это скорее навредит.

Разгадка: почему одна галочка ломала всё

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

Ответ нашёлся внутри самого приложения. Happ для Android построен на основе другого известного клиента — v2rayNG. Когда вы включаете «локальную DNS», приложение само дописывает в конфигурацию ядра две вещи: «вот место, куда отдавать DNS-вопросы» и первым же правилом «всё, что пришло на порт 53, отдай туда».

Но если конфигурацию прислал сервис целиком, приложение ничего в неё не дописывает. Правила перехвата нет, а сам перехват со стороны телефона включён. Вопрос «какой номер у ya.ru?» уходит в туннель к служебному адресу, который никуда не ведёт, и ответ не приходит никогда. Номер не получен, соединения нет, в журнале пусто. Именно это мы и видели.

Та же ошибка давно известна и у самого v2rayNG: на GitHub есть обращение о том, что с JSON-подпиской и включённым локальным DNS все запросы висят, и его закрыли без исправления. А INCY такого перехвата не делает вовсе, поэтому у неё вопрос уходил обычным путём через туннель и получал ответ.

Раз приложение не дописывает нужное правило, его дописываем мы. Теперь в каждой конфигурации для Happ есть справочная, место для DNS-вопросов и правило перехвата, стоящее первым:

"dns": {"servers": ["1.1.1.1", "8.8.8.8"]},
"routing": {"rules": [
  {"inboundTag": ["socks", "tun"], "port": "53", "outboundTag": "dns-out"},
  ...
]}

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

Эта маленькая вставка — хорошая иллюстрация всей истории. В ней стоят те же 1.1.1.1 и 8.8.8.8, которые с 26 августа перехватывают у многих провайдеров. Но вопрос к ним задаётся внутри туннеля, и перехватить его по дороге невозможно. Важен не адрес справочной, а путь, по которому к ней идёт вопрос.

Что стоит запомнить

Источники

Вопросы по статье — в обсуждении выше, в поддержку из бота или из кабинета.

Akonit — технологии приватного доступа в интернет.