Разбор архитектуры, Brutal-алгоритма, Salamander-обфускации и честный ответ — почему это работает в 2026-м и при каких условиях падает.

Большинство статей про Hysteria 2 написаны по одному шаблону: «быстро, просто, ставится за 5 минут, вот конфиг». Это не такая статья.

Я хочу разобрать что именно происходит на уровне протокола, почему выбранные инженерные решения работают против современных DPI-систем, и где у этого протокола настоящие слабые места — которые вендор в документации деликатно обходит стороной.

Если тебе нужен гайд «скопируй конфиг и запусти» — закрывай вкладку. Если интересно почему это работает — читай дальше.

Фундамент: почему QUIC, а не TCP

Hysteria 2 построена поверх QUIC. Это не случайный выбор и не дань моде — это инженерное решение с конкретными последствиями.

QUIC (RFC 9000) — протокол транспортного уровня, разработанный Google и стандартизированный в 2021-м. Работает поверх UDP. Внутри реализует всё то, что раньше было в TCP + TLS: мультиплексирование потоков, контроль перегрузки, надёжная доставка, шифрование. HTTP/3 — это HTTP поверх QUIC.

Зачем это нужно для обхода блокировок?

TCP-соединение блокируется легко. Цензор видит SYN-пакет, решает что соединение подозрительное, посылает RST в обе стороны — всё, соединение разорвано. Дёшево, надёжно, работает годами.

С UDP история другая. UDP stateless: нет рукопожатия, нет установки соединения, нет очевидного «момента начала». Послать RST некуда. Чтобы заблокировать UDP-поток, надо либо заблокировать весь UDP на порту (грубо, с коллатеральными потерями), либо анализировать содержимое каждого пакета (дорого, с задержкой). Hysteria 2 эксплуатирует именно эту разницу в стоимости блокировки.

Но есть нюанс, к которому мы вернёмся.

Brutal: когда потери пакетов работают на тебя

Стандартные алгоритмы контроля перегрузки — BBR, CUBIC, Reno — при обнаружении потерь пакетов снижают скорость отправки. Логика: потери значат перегрузку сети, надо уступить.

Hysteria использует собственный алгоритм — Brutal.

Brutal работает наоборот. При обнаружении потерь он увеличивает скорость отправки, компенсируя потери избыточным количеством пакетов. Клиент объявляет серверу желаемую скорость получения (rx rate) при аутентификации. Сервер пытается её обеспечить любой ценой — в том числе через избыточную отправку с расчётом на то, что часть пакетов доберётся.

Это полезно в двух сценариях:

Нестабильные каналы — мобильный интернет, спутник, сети с реальными потерями пакетов. Там, где обычный TCP деградирует до черепашьей скорости, Brutal держит заявленную пропускную способность.

Искусственные потери — некоторые провайдеры в Китае и России применяют rate limiting через намеренные потери пакетов вместо прямой блокировки. Brutal это ломает: провайдер дропает 30% пакетов, Hysteria просто отправляет в 1.4x больше.

Звучит агрессивно — потому что так и есть. На стороне сервера Brutal легко создаёт нагрузку на аплинк, которая заметна. При неправильной настройке bandwidth параметра сервер будет флудить канал независимо от реальной ситуации с сетью.

# Без этого Brutal не включается — используется BBR
bandwidth:
  up: 20 mbps
  down: 100 mbps

Маскировка: два режима с разной философией

Здесь начинается самое интересное — и самое часто неправильно понимаемое.

У Hysteria 2 два принципиально разных подхода к маскировке трафика. Они несовместимы между собой. И выбор между ними — это выбор между разными моделями угроз.

Режим 1: Masquerade (без obfs)

Сервер работает как настоящий HTTP/3 сервер. Если к нему подключиться браузером или curl — он отвечает. По умолчанию возвращает 404, но можно настроить реверс-прокси на реальный сайт.

masquerade:
  type: proxy
  proxy:
    url: https://www.bing.com
    rewriteHost: true

В этом режиме сервер буквально отдаёт страницы HackerNews любому, кто зайдёт на него браузером. DPI-система делает активное зондирование — получает валидный HTTP/3-ответ. Подозрений нет.

Слабое место: стандартный QUIC-трафик с правильными сертификатами и fingerprint всё равно имеет статистические отличия от трафика реального браузера. Межпакетные интервалы другие. Паттерн запросов другой. ML-классификатор это замечает — не сейчас, но в перспективе.

Режим 2: Salamander obfuscation

Salamander оборачивает QUIC-пакеты в дополнительный слой, который инжектирует рандомные «шумовые» пакеты рядом с легитимными данными (меняет структуру начала соединения) . Классификатор трафика не может построить надёжную статистическую моде��ь — данные слишком зашумлены.

textobfs:
  type: salamander
  salamander:
    password: your_obfs_password

Но есть критический момент из документации:
https://github.com/apernet/hysteria/discussions/1115

Enabling obfuscation will make your server incompatible with standard QUIC connections and it will no longer function as a valid HTTP/3 server.

С включённой Salamander сервер не отвечает на стандартные QUIC-запросы. Активное зондирование — молчание. Это само по себе подозрительно для продвинутых DPI-систем: сервер не говорит ни на одном известном протоколе.

Дилемма: masquerade без obfs — хорошая маскировка, но уязвим к статистическому анализу. Salamander с obfs — хаотичный трафик, но нет легенды при зондировании.

Правильный выбор зависит от того, против чего именно ты защищаешься. На большинстве российских провайдеров в 2026-м Salamander даёт лучший результат — ТСПУ активно детектирует QUIC-паттерны, и obfs на уровне Initial пакетов ломает эту детекцию раньше, чем она случается.

Port hopping: изящное решение, которое требует рук

Разработчики Hysteria заметили специфику китайского GFW: при детектировании подозрительного протокола блокируется не IP-адрес целиком, а пара IP+порт. Это даёт лазейку.

Port hopping — клиент прыгает между портами при неудачных соединениях. Важно понять архитектуру: сервер не слушает на диапазоне портов самостоятельно. Он слушает на одном порту (например 443), а диапазон настраивается через перенаправление на уровне iptables/nftables:

# nftables на сервере — обязате��ьно, без этого port hopping не работает
define INGRESS_INTERFACE = "eth0"
define PORT_RANGE = 20000-50000
define HYSTERIA_PORT = 443

table inet hysteria_porthopping {
  chain prerouting {
    typtexte nat hook prerouting priority dstnat; policy accept;
    iifname $INGRESS_INTERFACE udp dport $PORT_RANGE \
    counter redirect to :$HYSTERIA_PORT
  }
}

На клиенте нужна секция transport с hopInterval:

transport:
  udp:
    hopInterval: 30s  # минимум 5s, дефолт 30s

server: your.server.com:20000-50000

Важный практический момент: sing-box как клиент port hopping для Hysteria2 не поддерживает и поддерживать не планирует. Если используешь sing-box — эта фича недоступна. Нужен нативный hysteria2 клиент.

В российском контексте port hopping менее эффективен чем в Китае: ТСПУ блокирует по паттерну трафика, а не по IP+порт. Но против провайдеров, которые режут конкретные порты — работает.

Где Hysteria 2 ломается в 2026-м

Честная часть, которую обычно не пишут.

Проблема 1: QUIC-блокировки

Ряд российских провайдеров режет UDP трафик на 443 порту или замедляет QUIC в целом. Hysteria 2 в базовой конфигурации на таких провайдерах работает хуже TCP-based протоколов или не работает вообще. Это не баг — это фундаментальное ограничение UDP-based архитектуры. FakeTCP режим (когда UDP-пакеты маскируются под TCP-заголовки) теоретически решает эту проблему — но поддерживается только на Linux и требует root. На практике это не «включил и забыл» опция.

Проблема 2: аномальный bandwidth

Brutal генерирует трафик-паттерн, который статистически нетипичен для браузерного HTTPS. Постоянный высокий throughput без пауз, характерных для рендеринга страниц — это подпись. ML-классификатор, обученный на реальном HTTP/3 трафике браузеров, отличит Hysteria 2 от Chrome с хорошей точностью.

Проблема 3: obfs несовместимость

При включённом Salamander сервер не отвечает на стандартные запросы. Активное зондирование возвращает тишину. ТСПУ умеет интерпретировать молчание как подозрение — именно так детектируется часть Shadowsocks-серверов. Это не решённая проблема.

Неудобный вопрос без ответа

Hysteria 2 с Brutal работает отлично в нестабильных сетях с реальными потерями. Но в стабильной московской или питерской сети с низкими потерями — Brutal избыточен и создаёт аномальный трафик-паттерн.

Получается: сильнейшая фича протокола одновременно является его главной детектируемой сигнатурой при хорошем канале.

Я не знаю, как это правильно решить в рамках текущей архитектуры. Возможно, никак — это фундаментальный компромисс.

Когда использовать Hysteria 2, а когда нет

Сценарий

Hysteria 2

Альтернатива

Нестабильный канал, потери >5%

Отлично

VLESS деградирует

Провайдер режет UDP/QUIC

Плохо

VLESS + XHTTP

Нужна максимальная скрытность

Средне

VLESS + Reality

Скорость важнее стелса

Отлично

Мобильный интернет

Хорошо

Корпоративный файрвол без UDP

Не работает

Любой TCP-based

Конфиг, который реально работает в 2026-м

# Сервер
listen: :443

tls:
  cert: /path/to/cert.pem
  key: /path/to/key.pem

auth:
  type: password
  password: strong_password_here

masquerade:
  type: proxy
  proxy:
    url: https://www.bing.com
    rewriteHost: true

quic:
  initStreamReceiveWindow: 26843545
  maxStreamReceiveWindow: 26843545
  initConnReceiveWindow: 67108864
  maxConnReceiveWindow: 67108864
# Клиент — с port hopping
server: your.server.com:20000-50000

auth: strong_password_here

tls:
  sni: your.server.com
  insecure: false

bandwidth:
  up: 20 mbps
  down: 100 mbps

transport:
  udp:
    hopInterval: 30s

socks5:
  listen: 127.0.0.1:1080

Что дальше

Hysteria 2 — это не замена VLESS+Reality для максимального стелса. Это другой инструмент с другими компромиссами: скорость и устойчивость к потерям в обмен на более заметный трафик-паттерн.

В арсенале имеет смысл держать оба. Hysteria 2 на хорошем UDP-канале даёт скорости, которые TCP-based протоколы просто не могут обеспечить физически. VLESS+Reality — когда нужна маскировка.

Код открытый: github.com/apernet/hysteria.
Документация честная — слабые места там признаются, что само по себе редкость в этой экосистеме :)

Если есть идеи для разбора, нашёл ошибку в конфиге
или хочешь предложить тему — пиши на
aleksandr@murzin.digital. Отвечаю.