todo/Hysteria/obfs-port-hopping.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

129 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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).