Shadowsocks-AEAD-2022, ShadowTLS, AmneziaWG

Это три «специальных» инструмента, каждый под свой случай: Shadowsocks — минималистичный proxy без TLS-обёртки, ShadowTLS — обёртка чтобы он выглядел как HTTPS, AmneziaWG — модификация WireGuard с обфускацией для РФ.

Что узнаешь
Вспомни из прошлых уроков

Три инструмента урока — это переигровка уже знакомых приёмов на «лёгких» протоколах. AEAD и целостность против bit-flipping — урок 2; ShadowTLS «крадёт» чужой TLS-handshake — идея Reality (урок 7); AmneziaWG — обфускация сигнатуры WireGuard, с которой мы уже сталкивались в уроке 4. А почему «голый» SS вообще палится — прямо из модели противника (урок 5): active probing на stream-шифре без MAC.

1. Эволюция Shadowsocks

Shadowsocks (clowwindy, 2012) — самый простой SOCKS-прокси с шифрованием. Изначально создан для китайских пользователей: минимум кода, никаких сложных handshake, «трафик выглядит как случайный шум».

ВерсияГодШифрБезопасность
Stream2012RC4-MD5, AES-CFBСломан
AEAD2017AES-GCM, ChaCha20-Poly1305C — replay
AEAD-202220222022-blake3-aes-256-gcm, 2022-blake3-chacha20-poly1305A — современный
Почему старый SS убили в Китае

Stream cipher без аутентификации

Старый Shadowsocks использовал stream-cipher (RC4, AES-CFB) без MAC. Атакующий мог менять биты ciphertext — расшифровка проходила без обнаружения. Active probe эксплуатировал это: слал крафтнутые пакеты, по реакции сервера опознавал SS. К 2019 в Китае любой SS-сервер банился за 24 часа.

2. AEAD-2022 — что нового

SIP022 (spec, 2022) добавил три ключевых улучшения:

  1. Pre-shared key из BLAKE3. Не пароль (легко перебрать), а 256-битный ключ. Active probe без знания ключа — отвергается на этапе MAC.
  2. Replay protection. Каждый пакет имеет уникальный nonce + timestamp. Replay в окне 30 секунд — отвергается. Это закрывает probing-атаки последнего поколения.
  3. Padding. К каждому пакету добавляется случайный padding 0-900 байт. Распределение размеров становится «более случайным» — статистические классификаторы работают хуже.

В конфиге сервера (sing-box):

{
  "inbounds": [{
    "type": "shadowsocks",
    "listen": "::",
    "listen_port": 8388,
    "method": "2022-blake3-aes-256-gcm",
    "password": "BASE64-32-BYTES-KEY",                    // сгенерируй: openssl rand -base64 32
    "multiplex": { "enabled": true }
  }]
}
  

SS-AEAD-2022 в чистом виде НЕ маскируется под HTTPS. Это «шум на UDP/TCP-порту». В РФ работает локально, но любой DPI с classifier'ом поймёт «непонятный шифрованный поток». Для production-обхода нужна обёртка — ShadowTLS.

Аналогия

Три инструмента — три уровня «одетости» одного человека

Shadowsocks — человек в неприметной серой одежде без единой надписи: в толпе теряется, но если охрана целенаправленно ищет «людей без документов» (active probing на непонятный шифрованный поток), его выцепят. ShadowTLS надевает поверх этой одежды настоящую униформу известной компании (реальный TLS-handshake с microsoft.com) — теперь он выглядит как сотрудник, к которому не подойдут. AmneziaWG — это не про одежду, а про походку: WireGuard остаётся собой, но перестаёт «маршировать» узнаваемым шагом (0x01 + 148 байт), подмешивая случайные движения (junk-пакеты, H1–H4), чтобы камеры-сигнатуры его не опознали. Первое — база, второе — маскировка под HTTPS, третье — обфускация. Разные ответы на разные угрозы.

3. ShadowTLS — обёртка под настоящий TLS

ShadowTLS v3 (ihciah, 2022-2023) — гениально простая идея: проводим настоящий TLS-handshake с настоящим сервером, а потом «переключаемся» на Shadowsocks payload в том же TCP-стриме.

  1. Клиент шлёт ClientHello с SNI=apple.com (реальный сайт)
  2. ShadowTLS-сервер проксирует ClientHello на apple.com:443
  3. Получает ServerHello, Certificate от apple — пересылает клиенту
  4. Handshake завершается между клиентом и apple через прокси-сервер
  5. Дальше клиент шлёт не настоящие HTTP-запросы, а зашифрованный Shadowsocks payload внутри того же TCP. Сервер видит «после handshake пошёл шифр» — не парсит, просто снимает «оболочку», достаёт SS-payload и обрабатывает как обычно

Снаружи DPI видит идеальный TLS handshake с apple.com и шифрованный поток. Это идентично Reality в плане «маскировки», но проще в реализации.

Где ShadowTLS лучше Reality
Где хуже

Конфигурация ShadowTLS-сервера (sing-box):

{
  "inbounds": [{
    "type": "shadowtls",
    "listen": "::",
    "listen_port": 443,
    "version": 3,
    "users": [{
      "name": "user1",
      "password": "PSK-BASE64"
    }],
    "handshake": {
      "server": "www.microsoft.com",     // ← маскируемся под MS
      "server_port": 443
    },
    "detour": "ss-in"                                  // ← после ShadowTLS — на SS
  }, {
    "type": "shadowsocks",
    "tag": "ss-in",
    "listen": "127.0.0.1",
    "listen_port": 8388,
    "method": "2022-blake3-aes-256-gcm",
    "password": "BASE64-32-BYTES-KEY"
  }]
}
  

4. AmneziaWG — российский ответ ТСПУ

Российская команда AmneziaVPN в 2023 году выпустила модификацию протокола WireGuard, которая ломает байтовые сигнатуры ТСПУ. AmneziaWG — это патч к референсному WG-демону.

Идея — параметризовать handshake/data так, чтобы пакеты больше не выглядели как «стандартный WG»:

ПараметрЧто делаетЭффект
JcКоличество junk-пакетов перед handshake (1-128)DPI видит «много мусора», не находит сигнатуру
Jmin / JmaxДлина каждого junk-пакета (50-1000 байт)Распределение размеров не как у обычного WG
S1 / S2Префикс/суффикс к каждому data-пакетуДлина пакета меняется → не «148-байт детект»
H1 / H2 / H3 / H4Замена magic header (0x01, 0x02, 0x03, 0x04)Первый байт больше не 0x01
Под капотом

Что меняется в пакете

Оригинальный WG-init: 01 00 00 00 [148 байт]. AmneziaWG-init: [H1] [random][actual payload][random]. Первый байт уже не 0x01 (можно поставить любую цифру от 5 до 127). Длина пакета — переменная. Перед handshake летят несколько junk-пакетов случайных размеров.

DPI с pattern-matching «01 + 148 байт» больше не срабатывает. Чтобы детектить AmneziaWG по таким сигнатурам — нужно знать H1/H2/H3/H4 (а они уникальные для каждой инсталляции).

Конфиг AmneziaWG (на сервере, /etc/amnezia/awg/wg0.conf):

[Interface]
PrivateKey = SERVER_PRIV
Address    = 10.8.2.1/24
ListenPort = 51820

# AmneziaWG extension
Jc   = 5           # 5 junk-пакетов перед handshake
Jmin = 50
Jmax = 1000
S1   = 50          # prefix size
S2   = 100         # postfix size
H1   = 1234567     # подменённый magic byte type 1
H2   = 2345678
H3   = 3456789
H4   = 4567890

[Peer]
PublicKey  = CLIENT_PUB
AllowedIPs = 10.8.2.2/32
  

На клиенте — те же Jc/Jmin/Jmax/S1/S2/H1-H4 (обязательно идентичные серверу). Клиенты AmneziaVPN (Android, iOS, Win, Mac) автоматически принимают конфиг с этими параметрами.

Эффект 2024-2025

AmneziaWG работает в России. ТСПУ не научился детектить эту обфускацию (поскольку она кастомизируется per-server, нет «общего» паттерна). Это решение №1 для домашнего VPN в РФ для тех, кто хочет «просто работающий WG».

Минус

AmneziaWG не маскируется под HTTPS — это всё равно «странный UDP-поток на нестандартный порт». На сильно агрессивном DPI (Иран в режиме blackout, Китай) — может быть задетектен через ML на flow statistics. В РФ — пока ок, на 1-2 года точно хватит.

Три инструмента — три уровня «одетости»
Shadowsocks быстрый прокси-база «шум на порту» палится active probing'ом + ShadowTLS обёртка в настоящий TLS маскировка под HTTPS идея Reality, проще AmneziaWG WireGuard + обфускация junk + H1–H4 ломает сигнатуру, не форму не конкуренты — разные ответы на разные угрозы
Shadowsocks — база, ShadowTLS — маскировка под HTTPS, AmneziaWG — обфускация другого протокола.

5. Что выбирать в 2026

СценарийРекомендация
Домашний VPN РФ, нужна простотаAmneziaWG (клиент Amnezia)
Домашний VPN РФ, максимум стабильностиVLESS + Reality + Vision
Корпоративный VPN с разных платформVLESS + Reality (Xray) + sing-box клиенты
Мобильный, плохие сетиHysteria 2 + Brutal
Запасной канал (когда основной не работает)ShadowTLS + Shadowsocks AEAD-2022
Для КитаяReality + uTLS:chrome или VLESS+WS+TLS через Cloudflare
Для Ирана (когда жёстко)Hysteria 2 с port hopping + Salamander, или MASQUE

6. Мини-лаба: попробуй прямо сейчас

Сгенерируй ключи для всех трёх инструментов и посмотри, чем отличается «голый» SS от завёрнутого:

# 1. Ключ Shadowsocks AEAD-2022 — это 32 байта, НЕ пароль (перебор бесполезен)
openssl rand -base64 32
# именно это идёт в "password" метода 2022-blake3-aes-256-gcm

# 2. PSK для ShadowTLS
openssl rand -base64 32

# 3. Донор для ShadowTLS — как и в Reality, нужен настоящий TLS 1.3-сайт
openssl s_client -connect www.microsoft.com:443 -tls1_3 2>/dev/null | grep -E "Protocol|Cipher"

# 4. Ключи AmneziaWG — те же, что у WireGuard, плюс параметры обфускации
wg genkey | tee awg.key | wg pubkey
# H1..H4 — просто случайные числа; сгенерируй четыре:
for i in 1 2 3 4; do echo "H$i = $((RANDOM*RANDOM))"; done
Ожидаемый результат

Пункты 1–2 дают 32-байтные ключи: обрати внимание — это НЕ «пароль словом», а полноценный 256-битный секрет, из-за чего active probing без ключа отбивается ещё на MAC (раздел 2). Пункт 3 подтверждает, что донор ShadowTLS должен реально говорить TLS 1.3 — иначе «кража» handshake не сработает (та же логика, что у Reality). Пункт 4 показывает, что AmneziaWG стоит на обычных WG-ключах, а H1–H4 — просто случайные числа, уникальные для твоей инсталляции: именно поэтому у ТСПУ нет «общего паттерна» для детекта.

7. Задачи самопроверки — реши, потом раскрой ответ

Задача 1. Почему старый Shadowsocks на stream-шифре банили в Китае за сутки, а AEAD-2022 живёт?

Stream-шифр без MAC не проверял целостность: цензор слал крафтнутые/битые пакеты (active probing) и по реакции сервера опознавал SS. AEAD добавил тег аутентичности — подделанный пакет отбрасывается без ответа, probing слепнет. AEAD-2022 усилил это 256-битным PSK (не перебираемый пароль), защитой от replay (nonce+timestamp) и padding'ом против статистики. Отсюда: только AEAD-2022 в 2026.

Задача 2. ShadowTLS и Reality оба «крадут» чужой TLS-handshake. Назови по одному плюсу ShadowTLS и одному, где Reality сильнее.

Плюс ShadowTLS: проще и легче на CPU — совместим с любыми Shadowsocks-клиентами через sing-box, не нужны X25519-ключи, только PSK, меньше вычислений (нет Vision-шифрования). Где Reality сильнее: после handshake длины/тайминги пакетов ShadowTLS могут отличаться от настоящего HTTP/2 и цепляться ML-эшелоном, а Reality с Vision splice ближе к подлинному профилю и активнее развивается. Выбор — простота против максимальной незаметности.

Задача 3. AmneziaWG в РФ работает, а в Иране в режиме blackout может не пройти. В чём разница подхода и предел обфускации?

AmneziaWG ломает БАЙТОВУЮ сигнатуру WG (0x01+148 → случайные H1–H4, junk-пакеты, переменная длина), но не маскируется под HTTPS — снаружи это по-прежнему «странный UDP-поток на нестандартном порту». ТСПУ ловит по сигнатурам, поэтому обфускации хватает; агрессивный DPI (Иран blackout, Китай) применяет ML по статистике потока, для которого «странный UDP» сам по себе подозрителен. Предел: обфускация прячет форму пакета, но не природу «непонятного шифрованного потока» — против ML нужна маскировка под легитимный трафик.

Задача 4. На сервере ShadowTLS указан handshake.server = www.microsoft.com, а клиент шлёт SNI=example.org. Что произойдёт и почему это важно?

Рассинхрон донора: DPI увидит SNI одного сайта, а сервер проксирует handshake на другой — поведение станет несогласованным и подозрительным, маскировка ослабнет. SNI клиента и целевой сайт сервера должны указывать на один и тот же реальный домен-донор, чтобы снаружи всё выглядело как обычный визит именно на него. Донор должен быть живым, популярным, с TLS 1.3 и без чужого CDN впереди — те же требования, что к dest в Reality.

Задача 5. Разложи три инструмента урока по одной функции каждому — так, чтобы стало ясно, что это не конкуренты.

Shadowsocks (AEAD-2022) — быстрый минималистичный шифрующий прокси, «шум на порту», база. ShadowTLS — обёртка, придающая этому SS вид настоящего HTTPS-визита (маскировка против passive+probing). AmneziaWG — WireGuard с обфускацией сигнатуры для сетей, где WG детектируют по байтам. Разные слои/угрозы: прокси, маскировка прокси, обфускация другого протокола. Выбирают по угрозе-модели сети, а не «какой лучший».

8. Словарик урока

Shadowsocksлёгкий шифрующий SOCKS5-прокси без TLS; «шум на порту»
stream-шифр без MACстарый SS без аутентификации; уязвим к bit-flipping и probing
AEAD-2022 · SIP022SS с 256-битным PSK (BLAKE3), защитой от replay и padding'ом
PSK · pre-shared keyзаранее разделённый 256-битный ключ вместо перебираемого пароля
replay-защитаnonce+timestamp: повтор пакета в окне отбрасывается, глушит probing
padding · набивкаслучайные байты к пакету — ломают статистику размеров
ShadowTLS v3обёртка SS в подлинный TLS-handshake к реальному сайту (идея Reality)
AmneziaWGWireGuard с junk-пакетами и подменой заголовков (Jc/Jmin/Jmax/S1/S2/H1–H4)
junk-пакетымусорные пакеты перед handshake, скрывающие сигнатуру протокола
магический заголовок · magic headerузнаваемый первый байт протокола (0x01 у WG); AmneziaWG его подменяет
Три «спец-инструмента» — не конкуренты, а разные ответы: Shadowsocks AEAD-2022 — быстрый прокси-база (только AEAD-2022, старые шифры мертвы); ShadowTLS — маскировка этого прокси под настоящий HTTPS (идея Reality, но проще); AmneziaWG — обфускация сигнатуры WireGuard для ТСПУ. Обфускация прячет форму пакета, маскировка — природу потока: против ML-эшелона нужна вторая. Выбор — по угрозе-модели конкретной сети, и полезно держать их как fallback к Reality/Hysteria.

9. Дальше

Мы прошли все основные протоколы. Дальше — про развёртывание: панели управления (3x-ui, Marzban, Hiddify), серверная инфра, выбор VPS, антидетект, клиенты. Это уроки 10-12.