Гайд

Как мы вышли из-под TSPU за 48 часов: AmneziaWG + Hysteria 2 после смерти Reality

10 мин чтения
2046 слов

В апреле 2026 моя клиентская VPN-инфра умерла за два дня. Reality перестал ходить через мобильного оператора, VLESS-XHTTP падал на TSPU, NaiveProxy ничем не отличался. Через 48 часов всё работало — на AmneziaWG плюс Hysteria 2 как страховке.

Этот гайд — что именно сломалось, почему, и какой стек выживает на мобильном МегаФон в середине 2026 года.

TL;DR одной карточкой

Хронология: как умирал Reality

Дата Событие
Q3 2025 Первые массовые сообщения о маркировке IP-диапазонов foreign VPS-хостеров на TSPU (Hetzner AS24940 — наиболее громкий кейс)
Декабрь 2025 РКН разворачивает AI-powered statistical traffic analysis на TSPU. Цель — VLESS+Reality поверх TCP. Алгоритм опознаёт соединения по TLS 1.3 handshake patterns на non-whitelisted foreign IP и троттлит сессии с payload свыше 15-20 KB
Январь-февраль 2026 Команда Xray-core отвечает: XTLS Vision testpre, testseed, Hysteria 2 transport как fallback. На уже маркированных IP — не помогает
Март 2026 Опубликована полная версия «белого списка» сайтов и сервисов от Минцифры — сигнал к whitelist-режиму (источник)
15 апреля 2026 На моих VPS Reality и NaiveProxy отрезаются до 500 B/s через мобильный канал. WiFi всё ещё работает
16 апреля 2026 Полный uninstall x-ui и xray-core. На их месте — AmneziaWG (primary) и Hysteria 2 (backup). Параллельно — cascade WG через RU VPS на случай мобильных лимитов
1 мая 2026 Surcharge на foreign mobile traffic вступает в силу
Июнь 2026 Стабильная работа стека. Добавлен резервный канал на DNS-туннеле для worst-case-сценария — whitelist day

Почему все TLS-протоколы умерли разом

TSPU — это deep packet inspection-устройства, установленные на сети каждого российского ISP под законом «О суверенном Рунете» 2019 года. Контролирует их Роскомнадзор (Wikipedia).

До 2025 года TSPU умел блокировать протоколы по сигнатуре — например, OpenVPN опознавался по байтовым последовательностям handshake. Reality обходил это тем, что его TLS 1.3 трафик был неотличим от обычного HTTPS к легитимному сайту.

В декабре 2025 РКН поменял подход. Вместо детекции по содержимому пакетов — статистический анализ соединения: распределение размеров пакетов, тайминги, энтропия. Целевая поверхность — VLESS+Reality на foreign IP. Threshold — 15-20 KB payload, после которого сессия классифицируется как «возможный proxy» и режется.

Контр-меры от Xray-core команды — testpre для устранения timing-сигнатур и testseed для рандомизации padding — работают, но только на немаркированных IP. На IP foreign VPS-хостеров, которые TSPU уже выделил в отдельный bucket, любой TLS 1.3 трафик попадает под statistical analysis независимо от обфускации. Это и сделало Reality нерабочим — не сам протокол был «взломан», а среда вокруг него.

NaiveProxy, OpenVPN-over-TLS, Shadowsocks — все TLS-based решения умирают по той же причине. Не сигнатурой, а статистикой.

Что выжило и почему

Из двух классов решений на mid-2026 устойчиво работают только два.

AmneziaWG 2.0 — форк WireGuard-Go с криптографически идентичным ядром (Curve25519, ChaCha20-Poly1305, bidirectional key rotation), но переписанным network-слоем. AmneziaWG добавляет dynamic-range packet headers, random padding во всех типах сообщений, и pre-handshake CPS-пакеты, мимикрирующие под QUIC, DNS или SIP (docs). Network-fingerprint становится неотличимым от рандомного UDP-трафика. Crypto-engine не изменён, поэтому миграция с WireGuard на AmneziaWG — это замена одного бинаря на другой плюс синхронизация обфускационных параметров (Jc, Jmin, Jmax, S1-S4, H1-H4) между сервером и клиентом.

Hysteria 2 — proxy-протокол поверх QUIC. Маскируется под HTTP/3 трафик, который TSPU генерально не фильтрует — слишком много законного. В Initial-пакете QUIC включается отдельный обфускационный слой Salamander и ломает pattern detection до того, как TSPU успеет среагировать (protocol spec). Brutal congestion control держит throughput при packet loss до 5-10% — критично для мобильных сетей, где TSPU намеренно роняет процент пакетов, чтобы попортить UX без полной блокировки.

Дело не только в протоколе. Дело в сочетании protocol + IP reputation + obfuscation pattern. AmneziaWG на чистом IP — работает. Тот же AmneziaWG на foreign VPS, который мобильный оператор отдельно занёс в blacklist (см. Contabo-кейс ниже), — handshake пройдёт, трафик умрёт.

Архитектура клиентского стека

Финальная схема, к которой пришёл в мае 2026:

[клиент: Windows / Android]
   ├─ default        → AmneziaWG     → foreign VPS (Amsterdam DC) → internet
   ├─ fallback       → Hysteria 2    → тот же foreign VPS         → internet
   └─ whitelist-day  → DNS-tunnel    → RU VPS (SPb)               → cascade WG → foreign VPS → internet

AmneziaWG как primary: UDP-порт нестандартный (37337 в моём случае — любой high-port в диапазоне 30000-50000 подходит, главное — не 51820, который опознаётся как WireGuard-default). Контейнер amnezia-awg2 на foreign VPS, конфиг в /opt/amnezia/awg/awg0.conf. Клиент — AmneziaVPN-приложение на Windows и Android.

Split tunneling — обязательно, иначе RU-сайты (банки, госуслуги, авито) ломаются: они отвергают соединения с foreign IP. В исключениях держу 192.168.0.0/16 (LAN), 100.64.0.0/10 (Tailscale-подобные подсети), 127.0.0.0/8 и явный список российских доменов: vk.com, ok.ru, yandex/yandex.ru, mail.ru, sberbank.ru, tinkoff.ru, gosuslugi.ru, nalog.ru, avito.ru, wildberries.ru, ozon.ru.

Hysteria 2 как backup: отдельный UDP-порт (36712), отдельный домен с Let’s Encrypt сертификатом (TLS-ALPN-01 валидация через :443), config с masquerade на https://www.bing.com/ — если кто-то постучится HTTP’ом на этот порт, получит proxied Bing вместо подозрительного 502. Клиент на Android — NekoBox.

Зачем держать оба сразу. Если AmneziaWG отваливается (например, мобильный оператор отдельно занёс foreign VPS в blacklist, как с Contabo), переключение на Hysteria 2 — это один тап в приложении, без переподнятия конфига. На текущем foreign VPS оба порта живут стабильно три месяца.

Каскад через российский VPS — на чёрный день

Зачем нужен. С 1 мая 2026 операторам мобильной связи в РФ предписано брать 150₽ за GB международного трафика свыше 15 GB/месяц. Параллельно периодически активируется whitelist mode: разрешён трафик только к доменам из утверждённого списка. Прямой канал к foreign VPS попадает и под surcharge, и под whitelist.

Решение — каскад. Клиент соединяется не с foreign VPS, а с RU VPS — IP российского, мобильный оператор не считает это международным трафиком и не блокирует в whitelist mode. RU VPS, в свою очередь, держит постоянный WireGuard-туннель к foreign VPS поверх datacenter-uplink (не мобильного). Выход в интернет — с foreign IP.

[мобильный клиент]
   │ WireGuard, UDP
   ▼
[RU VPS, SPb] — wg-entry (принимает клиентов)
   │  policy routing: трафик клиентских подсетей → cascade-туннель
   ▼
[RU VPS] — wg-cascade (peer foreign VPS)
   │
   ▼ datacenter uplink
[foreign VPS, NL] — wg-cascade (peer RU VPS)
   │  iptables MASQUERADE
   ▼
интернет (видит foreign IP)

Минимальный сетап RU VPS — 200₽/месяц у RuVDS или аналогичных RU-хостеров. Никакого DPI-anti-detection там не нужно: трафик внутри РФ.

Что сломается, если делать наивно: - Без policy routing на RU VPS весь его outbound уйдёт в каскад — поломает всё, что на нём ещё крутится (Headscale, любые сервисы). - Без фикса MTU=1420 на обеих сторонах каскада handshake пройдёт, data plane молчит. wg-quick на foreign VPS по умолчанию ставит MTU 8920 из-за eth0 — нужно прописать вручную. - AllowedIPs на стороне foreign VPS должен включать и link-IP, и подсеть клиентов: AllowedIPs = <link-ip>/32, <client-subnet>/24. Без этого пакеты от клиентов будут silently dropped.

Когда переключаться: WiFi и desktop — всегда прямой канал. Мобильный при whitelist day или после превышения 15 GB — каскад.

Шесть граблей, на которые наступил я

1. Мобильный тест обязателен до миграции. Первый раз я мигрировал Reality на foreign VPS Frankfurt. WiFi-тесты прошли — ставлю в production. Дальше выясняется, что мобильный МегаФон не отвечает на этот IP — даже curl http://<vps-ip> уходит в таймаут. Не TSPU, а персональный blacklist оператора на конкретного хостера. Перенос на другой foreign VPS (Amsterdam DC) с IP вне этого blacklist — заработало. Чек-лист на будущее: до коммита на хостера — curl -v http://<vps-ip> со своего телефона на мобильном интернете, минимум двух операторов.

2. AmneziaVPN Desktop ломает серверный конфиг. Любой клик в admin-меню десктопного приложения — «Share configuration», «Manage server», «Add client», «Settings → Server» — SSH’ится на foreign VPS под cached root credentials и переписывает runtime AmneziaWG со своей view сервера. Manually-добавленные peer’ы теряются. Случилось два раза подряд за месяц. Правило: на десктопе только Connect/Disconnect. Все админ-операции — через скрипты на сервере.

3. Peer с allowed_ips=пусто — silent failure. WireGuard разрешает peer’у иметь пустой allowed_ips. Handshake продолжает работать — peer прошёл аутентификацию — но data-пакеты дропаются: сервер не знает, какому пиру отправить ответ, и не принимает пакеты с source IP вне allowed_ips. Клиент при этом показывает «Connected», зелёный индикатор. Пользователь не замечает поломку, потому что мобильный fallback на провайдера её прячет — сайты открываются, но мимо VPN. Фикс: awg set awg0 peer <pub> allowed-ips <client-subnet>/32 плюс audit awg show после каждой админ-операции.

4. MTU mismatch в каскаде. wg-quick по умолчанию выбирает MTU исходя из MTU физического интерфейса. На foreign VPS с eth0 MTU 9000 получается jumbo 8920. На RU VPS — стандартный 1420. Разный MTU между сторонами одного туннеля → handshake проходит, data plane молчит. Решение — явный MTU = 1420 в [Interface] на обеих сторонах. Не диагностируется по логам wg, только по факту «handshake есть, ping мимо».

5. TSPU троттлит UDP/53 при длительной нагрузке. Когда поднимал DNS-tunnel на foreign IP как primary endpoint, первые 1-2 часа работало нормально. После — packet loss скачет, throughput падает до неюзабельного. TSPU маркирует foreign IP при стабильной UDP-нагрузке на :53. Lesson: foreign IP как primary DNS-tunnel endpoint — не вариант. Primary должен быть RU IP, foreign — fallback через DoH.

6. Hysteria 2 не работает на любом VPS. На том же Contabo-IP, который МегаФон не пускал, Hysteria тоже отказывалась работать — даже через WiFi: QUIC handshake проходил, streams не устанавливались. Скорее всего, особенность VMware UDP offload у хостера. Mobile-test до production-деплоя ловит обе проблемы разом.

Сравнительная таблица решений 2026

Решение Desktop foreign Mobile RU Где умирает
WireGuard ванильный TSPU опознаёт handshake-pattern
OpenVPN / OpenVPN-over-TLS DPI + TLS statistical analysis
Shadowsocks / SSR ⚠️ DPI
XRay / VLESS / Reality / XHTTP ✓ → ✗ TSPU AI analysis с декабря 2025
NaiveProxy ✓ → ✗ TLS-pattern, тот же mechanism что Reality
AmneziaWG 2.0 если IP-хостер в blacklist оператора
Hysteria 2 ✓ (4.9 Mbps замер) при mobile whitelist
Cascade WG (RU entry) основной канал для whitelist + квот
DNS-tunnel (dnstt) ⚠️ медленно потолок 10-50 KB/s — только текст

Чек-лист whitelist-готовности на 30 минут

Что держать готовым к моменту, когда мобильный «отвалится»:

  1. Российский VPS — RuVDS или аналог, 200₽/месяц, с настроенной cascade WG к foreign exit. Минимум — 1 vCPU, 512 MB RAM, 5 GB диск.
  2. Hysteria 2 на foreign VPS на отдельном UDP-порте, с TLS-сертификатом на сабдомен. Время поднятия — 15 минут с нуля.
  3. DNS-tunnel клиент (SlipNet на Android, AnyBridge на iOS) с импортированным профилем. Тестировать заранее, в момент whitelist-day разбираться поздно.
  4. Бэкап конфигов вне облака.conf-файлы AmneziaWG/WireGuard в зашифрованном архиве на физическом носителе или в RU-облаке, которое не отвалится. Telegram-сейв-чат подходит как минимум.

Что дальше

Если каскад через RU VPS — новый паттерн в вашей инфре, имеет смысл добавить healthcheck-cron: dig к dnstt-серверу каждые 5 минут, при empty-ответе — restart сервиса. Иначе после reboot VPS обнаружите неработающий канал в самый неподходящий момент. Я ловил такое дважды после биллинговых ребутов.

И главное — не надейтесь, что текущий стек проживёт долго. Декабрь 2025 показал, что РКН может включать новые statistical-методы детекции без предупреждения, и контр-меры от Xray-core команды на маркированных IP не помогают. Следующий шаг TSPU, скорее всего — обнаружение QUIC-обфускации по timing-паттернам. Когда это случится, AmneziaWG + cascade останется единственным рабочим вариантом, до следующего раунда гонки.

Параллельный вектор: если РКН перейдёт от ограничений по протоколу к давлению на RU-VPS-провайдеров с требованием отключать transit к иностранным IP, текущая cascade-архитектура сломается. Тогда entry-точку придётся переносить на иностранный хостинг с РФ-видимым IP через ASN-trick — это уже другая статья.


Связано: - Headscale на русском VPS — почему Tailscale тут не годится (готовится) - Self-hosted Spotify через Lidarr + Plex: миграция с Яндекс.Музыки (готовится) - Канал «ИИ Судного дня» — еженедельные апдейты по AI и инфре