Модератор: вероятно, при создании данной статьи использовался ИИ. Объёмы и профиль использования известны только автору.
Когда сервер с конфигом заблокировали — клиент отвалился. Разбираем способ доставки который сломать сложнее чем сам интернет
У любого прокси-сервиса есть слабое место которое не связано с протоколом. Сервер переехал, IP сменился, конфиг устарел — и пользователь сидит без связи пока не получит обновление вручную. Чем больше пользователей, тем острее проблема.
Стандартное решение — раздавать конфиги через HTTPS. Удобно, пока URL не попал в реестр. После этого тысяча человек одновременно пишет в поддержку.
DNS TXT-записи решают эту проблему не через обход блокировок, а через выбор канала который блокировать политически сложно.
Что такое TXT-запись и зачем она вообще существует
TXT-запись — это произвольная строка текста привязанная к домену. Придумали её для SPF (верификация почтовых серверов) и DKIM, потом стали использовать для подтверждения владения доменом в Google Search Console и Let's Encrypt. Технически это просто поле «здесь может лежать любой текст до 255 байт».
Несколько TXT-записей на один домен — нормальная практика. Суммарно можно передать несколько килобайт. VLESS URI с UUID, адресом сервера и параметрами Reality влезает в одну запись с запасом.
Запросить TXT-запись можно так:
dig TXT config.yourdomain.com +short
Или через любой DoH-резолвер:
curl "https://1.1.1.1/dns-query?name=config.yourdomain.com&type=TXT" \ -H "accept: application/dns-json"
Почему этот канал сложно заблокировать
DNS как мы знаем инфраструктура интернета, и это создаёт определённую защиту. Полная блокировка порта 53 действительно ломает браузер, почту и всё остальное. Но провайдер может действовать тоньше: DNS-спуфинг на уровне провайдера позволяет заблокировать конкретный домен не трогая остальные запросы. Именно так работает большинство DNS-блокировок в РФ. Защита здесь не абсолютная, а в стоимости атаки: заблокировать один домен легко, но если у клиента зашит список из десяти резервных доменов на разных регистраторах — провайдеру нужно блокировать все десять, и делать это оперативно при каждом обновлении списка. DoH дополнительно усложняет задачу: DNS over HTTPS к 1.1.1.1 выглядит как обычный HTTPS-трафик, перехватить его без MITM не получится.
Как это выглядит на практике
Схема минимальной реализации:
1. Создаём TXT-запись с конфигом
Через панель DNS-провайдера добавляем запись:
Тип: TXT Имя: config.yourdomain.com TTL: 300 Значение: vless://uuid@server:443?type=tcp&security=reality&...
TTL в 300 секунд означает что при смене конфига клиенты подхватят обновление максимум через 5 минут.
2. Клиент запрашивает конфиг при старте
Сначала устанавливаем библиотеку — dns.resolver не входит в стандартную библиотеку Python:
pip install dnspython pip install httpx
import dns.resolver def get_config(domain): answers = dns.resolver.resolve(domain, 'TXT') for rdata in answers: for txt_string in rdata.strings: return txt_string.decode()
В случае если нужен DoH вместо системного резолвера:
import httpx def get_config_doh(domain): r = httpx.get( "https://1.1.1.1/dns-query", params={"name": domain, "type": "TXT"}, headers={"accept": "application/dns-json"} ) answers = r.json().get("Answer", []) for answer in answers: if answer["type"] == 16: return answer["data"].strip('"')
Три строки логики. Клиент при запуске делает один DNS-запрос, получает актуальный URI, подключается.
3. При смене сервера
Меняем только TXT-запись. Никаких обновлений приложения, никаких рассылок пользователям. Через 5 минут все клиенты работают с новым сервером.
Защита конфига от чужих глаз
TXT-запись публична — любой может сделать dig TXT и прочитать конфиг. Для личного использования это некритично: один сервер с одним пользователем не привлекает внимания.
Если сервером пользуются несколько человек и конфиг светить не хочется — два варианта.
Шифрование. Конфиг шифруется симметричным ключом, который передаётся пользователю один раз при онбординге. В TXT лежит зашифрованная строка, клиент расшифровывает локально.
from cryptography.fernet import Fernet # При создании конфига key = b'ваш_секретный_ключ_зашитый_в_клиент' f = Fernet(key) encrypted = f.encrypt(b'vless://uuid@server:443?...') # encrypted кладём в TXT # На клиенте config = f.decrypt(txt_value).decode()
Двухшаговая доставка. В TXT лежит не сам конфиг, а URL следующего шага — например, ссылка на Pastebin или Github Gist с актуальным конфигом. Первый шаг через DNS, второй через HTTPS. Блокировка одного не убивает канал полностью.
Ограничения о которых нужно знать
Кеширование. DNS кеширует ответы на TTL. Если TTL поставить 3600 — обновление конфига дойдёт до клиента через час. Для оперативных изменений ставить TTL не больше 300, а лучше 60 секунд — если DNS-провайдер позволяет.
Размер. По RFC 1035 (ietf.org/rfc/rfc1035.txt) одна строка внутри TXT-записи ограничена 255 байтами. Но сама запись может содержать несколько строк — приложение собирает их в одну. Теоретический потолок 65 535 байт, практический упирается в UDP MTU: без EDNS0 это 512 байт на весь DNS-пакет, с EDNS0 до 4 КБ. Большинство современных резолверов поддерживают EDNS0, так что в реальности доступно несколько килобайт. Для VLESS URI хватает с запасом, для полного JSON-конфига sing-box с несколькими inbound уже нет.
Домен должен резолвиться. Если сам домен попал в реестр РКН канал собственно мёртв. Решается через несколько резервных доменов зашитых в клиент. Клиент перебирает список по порядку, использует первый который ответил.
FALLBACK_DOMAINS = [ "config.primary-domain.com", "cfg.backup-domain.net", "c.reserve-domain.org", ] def get_config_with_fallback(): for domain in FALLBACK_DOMAINS: try: return get_config(domain) except Exception: continue return None
DoH нужно настраивать отдельно. Стандартный dns.resolver в Python ходит через системный резолвер на порту 53. Если нужен DoH — придётся использовать httpx или requests напрямую к API Cloudflare или Google.
Кто уже использует этот подход
Psiphon активно работает с DNS-инфраструктурой — в открытом репозитории psiphon-tunnel-core есть отдельный пакет для DNS и утилиты резолвинга. Конкретный механизм доставки конфигов через TXT-записи публично не задокументирован, поэтому утверждать что они используют именно этот подход не буду. Из открытых реализаций ближе всего к описанной схеме динамические ключи Outline через URL и ряд публичных прокси-сервисов которые хранят актуальный URI в Telegram-боте. DNS TXT в этом контексте — менее популярная но более независимая альтернатива: не требует Telegram, не зависит от мессенджера который сам может быть заблокирован.
Когда это имеет смысл, а когда нет
Канал решает конкретную проблему — доставку и обновление конфига при заблокированном основном канале. Сам по себе он не делает соединение более стойким к детекции и не меняет протокол туннеля.
Если проблема в том что конфиги устаревают и пользователи отваливаются — DNS TXT решает её элегантно и дёшево. Если проблема в том что сам трафик детектируется — нужно смотреть в сторону протокола, а не канала доставки.
Если есть идеи для разбора, нашёл ошибку в конфиге
или хочешь предложить тему — пиши на
aleksandr@murzin.digital Отвечаю.
Комментарии (22)

MrShandy
13.03.2026 03:37А если будет утерян ключ шифрования, как быть? У клиента то он был зашит при первом подключении (или просто зашит в клиент??).
Ситуация гипотетическая, там и с другими реализациями куча проблем будет, но тут вообще непонятно как решать. Нужно как то всем оперативно выдать новый ключ шифрования, а это проблема
Но сама идея интересная

zarazaexe
13.03.2026 03:37тоже об этом думал
просто будут блочить TXT в DNS

kuza2000
13.03.2026 03:37Ну да. Как мне кажется, заблокировать этот канал очень легко. Делаешь форк dns сервера, который вырезает эти записи.

vesper-bot
13.03.2026 03:37Если зону подписать, то форкнуть не выйдет. Но она требует DoH/DoT, которые уже режутся на уровне протокола.

LaoSan
13.03.2026 03:37Этот способ будет работать до тех порт, пока Тов.Майор и его Миньоны не отреверсят ваше ПО или его Трафик и не найдут алгоритм распространения. Апосля забанить/заблочить/зафильтровать уже дело техники.
(Как вариант могут приехать к вам, и вы отдадите им все явки/пароли)

LaoSan
13.03.2026 03:37Вот вам вариант с каналом распространения (на подумать).
Шифровать и размещать полезную нагрузку в отдельном слое в картинке JPG.
Саму картинку например размещать аки аватарку/фотку/в коментах на популярном публичном портале. (том же ВК, ОК. Дзене, Рутрубе)
К картинке обращаться не сразу напрямую, а, в куче других запросов к выбранному порталу.

nooblik
13.03.2026 03:37Саму картинку например размещать аки аватарку/фотку/в коментах на популярном публичном портале. (том же ВК, ОК. Дзене, Рутрубе)
___________________
Картинки сжимаются при загрузке в сервисы. Есть не хилая вероятность того что лишнее отрежется
Давай я придумаю более бредовый метод. В чат wow на сервере пишите конфиг каждые 5 минут. Клиенты авторизуются и слушают эти чаты и достают их оттуда.
А на самом деле вы слишком преувеличиваете.
В комментариях на хабре публикуете новый конфиг и всё.Хабр никто не заблочит весь.
Если администрация пойдёт на уступки и удалит пост - гитхаб/гитлаб любой другой сервис где можно выложить свой текст. Его не заблочат. Если заблочат то только весь изза https.

iamkisly
13.03.2026 03:37Есть не хилая вероятность того что лишнее отрежется
Некоторое время назад у ВК была преза, где они рассказывали как в hot patch пережимали жипеги на webp. В целом было очень интересно послушать как скорость доставки влияет на удержание пользователей.

s5384
13.03.2026 03:37Довольно наивно, есть места поинтереснее и более подходящие. JPG часто подвергается перекодированию, лишние теги срежутся. Тут остаётся либо теги выбирать, которые не будут трогать, либо другой формат, например, PNG.
Можно хранить в тексте к аудиозаписи ВК, который по API можно каждый раз получать. И, как вариант, иметь несколько вариантов хранения, чтобы был ключ и конфиг в зашифрованном виде

thereisnocolor
13.03.2026 03:37Загуглите уже для себя слово стеганография. Столько методов прятоть информацию у всех на виду найдете, что просто офигеете)

ewill
13.03.2026 03:37Действительно интересный подход! Даже не думал о таком применении DNS TXT.
Спасибо.

oforum
13.03.2026 03:37С учётом всего этого, не думали ли добавить к такой схеме ещё слой версионирования/подписи — например, хранить в TXT не только URI, но и версию с подписью (HMAC/ED25519), чтобы клиент мог отличать подменённый ответ провайдера от легитимного обновления конфига?
CitizenOfDreams
Единственный канал, который политически сложно блокировать - это "Первый канал" телевизора.