Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
129 lines
12 KiB
Markdown
129 lines
12 KiB
Markdown
---
|
||
date: 2026-07-11
|
||
tags:
|
||
- hysteria
|
||
- обход-блокировок
|
||
- обфускация
|
||
- port-hopping
|
||
- quic
|
||
aliases:
|
||
- Hysteria обфускация
|
||
- Hysteria port hopping
|
||
- Hysteria Salamander
|
||
- Hysteria обход DPI
|
||
link: https://v2.hysteria.network/docs/advanced/Port-Hopping/
|
||
---
|
||
|
||
# 🦎 Hysteria 2 — обфускация и port hopping
|
||
|
||
> [!info] О чём заметка
|
||
> Что делать, если провайдер мешает Hysteria: два независимых приёма — **обфускация** (шифрует пакеты так, что они перестают выглядеть как QUIC/HTTP/3) и **port hopping** (постоянная смена порта, чтобы обойти блокировку/троттлинг конкретного UDP-порта). Базовые конфиги — в заметках [[Hysteria/config-server|сервер]] и [[Hysteria/config-client|клиент]]. Обзор протокола — [[Hysteria/00-overview|тут]].
|
||
|
||
## TL;DR
|
||
|
||
- **Обфускация** нужна, когда сеть блокирует именно QUIC/HTTP/3 (но не UDP вообще). Она превращает пакеты в «случайный шум», убирая узнаваемый почерк QUIC. Реализации — **Salamander** и экспериментальный **Gecko**.
|
||
- Пароль обфускации должен **совпадать** на сервере и клиенте. Неверный пароль = таймаут подключения, как будто сервер выключен.
|
||
- **Port hopping** нужен, когда провайдер блокирует или троттлит долгие UDP-сессии на конкретном порту. Клиент постоянно случайно меняет порт из заданного диапазона.
|
||
- Включение обфускации ломает совместимость со стандартным QUIC — сервер перестаёт быть валидным HTTP/3-сервером, [[Hysteria/config-server|masquerade]] под настоящий сайт больше не работает. Это осознанный размен.
|
||
- Оба приёма независимы: можно включить только один, оба или ни одного.
|
||
|
||
## Когда что применять
|
||
|
||
Сначала разберитесь, что именно ломает провайдер — от этого зависит выбор приёма:
|
||
|
||
- **Всё работает, но иногда рвётся / троттлится через время** — вероятно, режут долгие UDP-сессии на порту. → **Port hopping**.
|
||
- **Соединение вообще не поднимается, при этом другой UDP-трафик ходит** — вероятно, DPI распознаёт и блокирует именно QUIC/HTTP/3. → **Обфускация**.
|
||
- **UDP зарезан полностью (любой)** — ни один приём Hysteria не поможет, protocol работает поверх UDP. Держите про запас TCP-решение вроде [[VLESS/dpi-tls-june-2026|VLESS+TLS]].
|
||
|
||
## Обфускация — маскировка от DPI
|
||
|
||
По умолчанию Hysteria имитирует HTTP/3. Но если сеть точечно блокирует QUIC/HTTP/3-трафик (при этом обычный UDP пропускает), обфускация помогает обойти это: она перемешивает пакеты так, что они теряют узнаваемый почерк протокола.
|
||
|
||
Доступны две реализации, обе требуют пароль, **одинаковый на клиенте и сервере**:
|
||
|
||
- **Salamander** — превращает каждый пакет в набор псевдослучайных байт без видимого паттерна.
|
||
- **Gecko** (экспериментальный) — надстройка над Salamander: дополнительно дробит пакеты QUIC-рукопожатия на куски случайного размера со случайным паддингом, чтобы усложнить их обнаружение по размеру.
|
||
|
||
**На сервере** ([[Hysteria/config-server|серверный конфиг]]), Salamander:
|
||
|
||
```yaml
|
||
obfs:
|
||
type: salamander
|
||
salamander:
|
||
password: cry_me_a_r1ver
|
||
```
|
||
|
||
**На клиенте** ([[Hysteria/config-client|клиентский конфиг]]) — ровно та же секция с тем же паролем.
|
||
|
||
Вариант Gecko (тоже симметрично на обеих сторонах):
|
||
|
||
```yaml
|
||
obfs:
|
||
type: gecko
|
||
gecko:
|
||
password: cry_me_a_r1ver
|
||
minPacketSize: 512
|
||
maxPacketSize: 1200
|
||
```
|
||
|
||
`minPacketSize`/`maxPacketSize` — границы размера дробящихся датаграмм рукопожатия (по умолчанию 512 и 1200 байт; `maxPacketSize` должен быть `>= minPacketSize` и `<= 2048`).
|
||
|
||
> [!warning] Обфускация ломает маскировку под HTTP/3
|
||
> Включив `obfs`, вы делаете сервер несовместимым со стандартными QUIC-соединениями — он перестаёт быть валидным HTTP/3-сервером, и [[Hysteria/config-server|masquerade]] под настоящий сайт уже не сработает (браузер не откроет ваш «сайт»). Это размен: вы прячете почерк QUIC от DPI ценой того, что сервер больше не выглядит как обычный веб-сервер. Включайте обфускацию, только если DPI реально блокирует QUIC, — иначе вы теряете полезную маскировку без причины.
|
||
|
||
> [!danger] Неверный пароль обфускации = «сервер как будто выключен»
|
||
> Если пароль обфускации на клиенте и сервере не совпадает, соединение просто уйдёт в таймаут — точно так же, как если бы сервер не был запущен. Никакой явной ошибки «неверный пароль» не будет. Поэтому при проблемах с подключением после включения `obfs` первым делом сверьте пароль на обеих сторонах.
|
||
|
||
## Port hopping — смена порта
|
||
|
||
Некоторые провайдеры (изначально приём появился как обход ограничений в Китае) блокируют или троттлят долгие UDP-соединения, но ограничение часто действует **только на конкретный порт**. Port hopping обходит это: клиент постоянно перескакивает между портами из заданного диапазона, не давая привязать блокировку к одному порту. Для верхних уровней (ваших приложений) это прозрачно — данные не теряются и соединение не рвётся.
|
||
|
||
### На клиенте — мульти-порт адрес
|
||
|
||
В поле `server` вместо одного порта укажите список/диапазон:
|
||
|
||
```yaml
|
||
server: example.com:20000-50000
|
||
```
|
||
|
||
Форматы адреса: `example.com:1234,5678,9012` (отдельные порты), `example.com:20000-50000` (диапазон), либо комбинация `example.com:1234,5000-6000,7044,8000-9000`. Число портов не ограничено.
|
||
|
||
Интервал переключения задаётся в секции `transport`:
|
||
|
||
```yaml
|
||
transport:
|
||
udp:
|
||
hopInterval: 30s
|
||
```
|
||
|
||
`hopInterval` — фиксированный интервал (по умолчанию 30s, минимум 5s). Для менее предсказуемого поведения можно задать случайный интервал через `minHopInterval`/`maxHopInterval` (тоже минимум 5s) — но одновременно с `hopInterval` их использовать нельзя.
|
||
|
||
### На сервере — диапазон в `listen` (Linux)
|
||
|
||
На Linux серверу достаточно указать диапазон прямо в `listen`:
|
||
|
||
```yaml
|
||
listen: :20000-50000
|
||
```
|
||
|
||
Сервер слушает первый порт диапазона и **автоматически настраивает правила фаервола** (nftables или iptables), перенаправляя трафик со всех остальных портов на первый. При остановке сервера правила автоматически убираются.
|
||
|
||
> [!warning] Серверный диапазон портов требует прав и Linux
|
||
> Автоматический диапазон в `listen` работает только на Linux и требует наличия `nft` (nftables) или `iptables`/`ip6tables`. Серверу нужны привилегии для правки фаервола — запуск от root или с capability `CAP_NET_ADMIN`. Если ставите через [[Hysteria/install-server|Docker]], для port hopping нужна `cap_add: NET_ADMIN`.
|
||
|
||
Если автоматический способ не подходит, диапазон можно пробросить вручную через DNAT (iptables/nftables) на порт, который слушает сервер. Готовые правила для iptables и nftables, а также подводные камни (постоянство правил после ребута, фаервол хостера) вынесены в отдельную заметку — [[Hysteria/port-hopping-manual|Port hopping вручную (DNAT)]].
|
||
|
||
## 📚 См. также
|
||
|
||
- [[Hysteria/00-overview|Hysteria 2 — обзор]] — когда сильные стороны QUIC становятся слабостью.
|
||
- [[Hysteria/config-server|Конфиг сервера]] — куда вписывать `obfs` и `listen` с диапазоном.
|
||
- [[Hysteria/config-client|Конфиг клиента]] — мульти-порт `server` и `transport`.
|
||
- [[Hysteria/port-hopping-manual|Port hopping вручную (DNAT)]] — детальные правила iptables/nftables, когда встроенный диапазон не подходит.
|
||
- [[Hysteria/troubleshooting|Решение проблем]] — таймауты и ошибки подключения.
|
||
- [[VLESS/dpi-tls-june-2026|VLESS + TLS: DPI-почерк]] — TCP-запасной вариант, если UDP зарезан полностью.
|
||
- 🔗 [Port Hopping](https://v2.hysteria.network/docs/advanced/Port-Hopping/) · [Full Server Config — Obfuscation](https://v2.hysteria.network/docs/advanced/Full-Server-Config/#obfuscation)
|
||
|
||
---
|
||
|
||
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
|
||
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Hysteria/obfs-port-hopping.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).
|