Модератор: вероятно, при создании данной статьи использовался ИИ. Объёмы и профиль использования известны только автору.

Когда сервер с конфигом заблокировали — клиент отвалился. Разбираем способ доставки который сломать сложнее чем сам интернет

У любого прокси-сервиса есть слабое место которое не связано с протоколом. Сервер переехал, 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)


  1. CitizenOfDreams
    13.03.2026 03:37

    через выбор канала который блокировать политически сложно.

    Единственный канал, который политически сложно блокировать - это "Первый канал" телевизора.


  1. MrShandy
    13.03.2026 03:37

    А если будет утерян ключ шифрования, как быть? У клиента то он был зашит при первом подключении (или просто зашит в клиент??).

    Ситуация гипотетическая, там и с другими реализациями куча проблем будет, но тут вообще непонятно как решать. Нужно как то всем оперативно выдать новый ключ шифрования, а это проблема

    Но сама идея интересная


  1. zarazaexe
    13.03.2026 03:37

    тоже об этом думал

    просто будут блочить TXT в DNS


    1. GennPen
      13.03.2026 03:37

      Передавать в записях домена. Это до 16 байт информации на одну запись.


      1. zarazaexe
        13.03.2026 03:37

        а, реально

        хотя тут можно использовать активное зондирование, но решается страничкой заглушкой


    1. kuza2000
      13.03.2026 03:37

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


      1. vesper-bot
        13.03.2026 03:37

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


        1. vikarti
          13.03.2026 03:37

          С чего это DNSSEC требует обязательно DoT/DoH?


    1. MrShandy
      13.03.2026 03:37

      А как они doh заблокируют? Никак по идее


      1. zarazaexe
        13.03.2026 03:37

        запретят HTTPS

        :)


        1. GennPen
          13.03.2026 03:37

          Не запретят, но потребуют пользоваться национальным сертификатом. Кстати, что с ним? А то что-то бухтение по этому поводу приутихло.


          1. zarazaexe
            13.03.2026 03:37

            ну про запрет HTTPS шутка была, хотя...

            а сертификаты? да затерпели как всегда

            ну вот я автор той статьи самой


  1. LaoSan
    13.03.2026 03:37

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

    (Как вариант могут приехать к вам, и вы отдадите им все явки/пароли)


    1. nooblik
      13.03.2026 03:37

      Как ты заблочишь запросы DNS без ломания этого днс?


  1. LaoSan
    13.03.2026 03:37

    Вот вам вариант с каналом распространения (на подумать).

    • Шифровать и размещать полезную нагрузку в отдельном слое в картинке JPG.

    • Саму картинку например размещать аки аватарку/фотку/в коментах на популярном публичном портале. (том же ВК, ОК. Дзене, Рутрубе)

    • К картинке обращаться не сразу напрямую, а, в куче других запросов к выбранному порталу.


    1. nooblik
      13.03.2026 03:37

      Саму картинку например размещать аки аватарку/фотку/в коментах на популярном публичном портале. (том же ВК, ОК. Дзене, Рутрубе)
      ___________________
      Картинки сжимаются при загрузке в сервисы. Есть не хилая вероятность того что лишнее отрежется

      Давай я придумаю более бредовый метод. В чат wow на сервере пишите конфиг каждые 5 минут. Клиенты авторизуются и слушают эти чаты и достают их оттуда.

      А на самом деле вы слишком преувеличиваете.

      В комментариях на хабре публикуете новый конфиг и всё.

      Хабр никто не заблочит весь.

      Если администрация пойдёт на уступки и удалит пост - гитхаб/гитлаб любой другой сервис где можно выложить свой текст. Его не заблочат. Если заблочат то только весь изза https.


      1. iamkisly
        13.03.2026 03:37

        Есть не хилая вероятность того что лишнее отрежется

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


    1. s5384
      13.03.2026 03:37

      Довольно наивно, есть места поинтереснее и более подходящие. JPG часто подвергается перекодированию, лишние теги срежутся. Тут остаётся либо теги выбирать, которые не будут трогать, либо другой формат, например, PNG.

      Можно хранить в тексте к аудиозаписи ВК, который по API можно каждый раз получать. И, как вариант, иметь несколько вариантов хранения, чтобы был ключ и конфиг в зашифрованном виде


  1. thereisnocolor
    13.03.2026 03:37

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


  1. ewill
    13.03.2026 03:37

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


    1. cyberscoper Автор
      13.03.2026 03:37

      Есть еще ряд идей как это можно реализовать, буду писать!


  1. oforum
    13.03.2026 03:37

    С учётом всего этого, не думали ли добавить к такой схеме ещё слой версионирования/подписи — например, хранить в TXT не только URI, но и версию с подписью (HMAC/ED25519), чтобы клиент мог отличать подменённый ответ провайдера от легитимного обновления конфига?