todo/Hysteria/port-hopping-manual.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

105 lines
9.5 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
- iptables
- nftables
- dnat
- linux
aliases:
- Hysteria port hopping вручную
- Hysteria DNAT проброс портов
- Hysteria ручной проброс диапазона
link: https://v2.hysteria.network/docs/advanced/Port-Hopping/
---
# 🦎 Hysteria 2 — port hopping вручную (DNAT)
> [!info] О чём заметка
> Как настроить серверную часть [[Hysteria/obfs-port-hopping|port hopping]] вручную через правила фаервола (iptables/nftables DNAT), когда встроенный диапазон в `listen` не подходит. Что такое сам port hopping, зачем он нужен и как настраивается клиент — разобрано в [[Hysteria/obfs-port-hopping|заметке про обфускацию и port hopping]]; здесь — только про ручной проброс на сервере. Обзор протокола — [[Hysteria/00-overview|тут]].
## TL;DR
- **Port hopping** — приём против блокировки/троттлинга UDP на конкретном порту: клиент постоянно перескакивает между портами из диапазона. Полная механика и настройка клиента — в [[Hysteria/obfs-port-hopping|основной заметке]].
- Обычно серверу достаточно встроенного диапазона в `listen: :20000-50000` — Hysteria сама поднимет правила фаервола. **Ручной DNAT нужен редко** — когда встроенный способ не подходит (нестандартная сеть, свой контроль над правилами, конфликт с существующим фаерволом).
- Идея ручного способа: сервер слушает **один** порт (например, 443), а правило DNAT перенаправляет на него весь UDP-трафик с диапазона портов (например, 2000050000).
- Правила сбрасываются при перезагрузке — сделайте их постоянными или выполняйте при старте системы.
## Когда нужен ручной способ
По умолчанию серверную часть port hopping делать вручную не надо: на Linux достаточно указать диапазон прямо в `listen`, и Hysteria сама настроит и уберёт правила фаервола (подробнее — в разделе «На сервере» [[Hysteria/obfs-port-hopping|основной заметки]]):
```yaml
listen: :20000-50000
```
Ручной проброс через DNAT нужен в исключительных случаях:
- Встроенный способ по каким-то причинам не работает или недоступен в вашей сети.
- Вы хотите сами управлять правилами фаервола (например, они уже сложные, и автоматические правила Hysteria конфликтуют с ними).
- Сервер слушает фиксированный порт, и вы отдельно администрируете сетевой стек.
Во всех остальных случаях проще и надёжнее встроенный диапазон в `listen` — он же сам подчищает правила при остановке сервера.
## Как это работает
Идея простая: сервер Hysteria слушает **один** порт (в примерах — 443), а фаервол перенаправляет (DNAT/REDIRECT) на этот порт весь UDP-трафик, приходящий на любой порт из диапазона. Для клиента это выглядит так, будто сервер отвечает на всех портах диапазона, — а физически он слушает один.
**Проще говоря:** клиент стучится на случайные порты 2000050000, фаервол ловит эти пакеты и молча переставляет им адрес назначения на порт 443, где реально сидит Hysteria. Сам Hysteria о диапазоне даже не знает.
> [!note] `--dport 20000:50000` — это диапазон, а не два порта
> В iptables двоеточие в `--dport` означает диапазон «с 20000 по 50000 включительно». Не перепутайте с запятой (перечисление). В примере ниже перенаправляется весь диапазон на один порт 443.
## iptables
Замените `eth0` на имя вашего внешнего интерфейса, `443` — на порт, который реально слушает Hysteria, а `20000:50000` — на нужный диапазон.
```bash
# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
# IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
```
## nftables
Тот же смысл на nftables. Значения вынесены в переменные — поправьте под себя:
```nginx
define INGRESS_INTERFACE="eth0"
define PORT_RANGE=20000-50000
define HYSTERIA_SERVER_PORT=443
table inet hysteria_porthopping {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname $INGRESS_INTERFACE udp dport $PORT_RANGE counter redirect to :$HYSTERIA_SERVER_PORT
}
}
```
В этом примере сервер слушает порт 443, а клиент может подключаться к любому порту из диапазона 2000050000.
> [!warning] Правила не переживают перезагрузку
> Команды iptables/nftables выше сбрасываются при перезапуске системы. Чтобы port hopping продолжал работать после ребута, сделайте правила постоянными штатными средствами дистрибутива (`iptables-save`/`netfilter-persistent`, `nftables.service` с конфигом в `/etc/nftables.conf` и т.п.) либо выполняйте их скриптом при старте. Это отличие от встроенного `listen: :20000-50000`, где Hysteria сама ставит правила при запуске и убирает при остановке.
> [!danger] Не забудьте открыть диапазон в фаерволе провайдера
> DNAT перенаправляет пакеты уже внутри сервера, но до этого они должны до сервера дойти. Если у хостера есть внешний фаервол (в панели VPS) или на самом сервере включён `INPUT`-фильтр, откройте в нём весь UDP-диапазон 2000050000 — иначе пакеты будут отброшены раньше, чем сработает DNAT. Заблокированный порт — частая причина ошибки «timeout», см. [[Hysteria/troubleshooting|разбор проблем]].
## Клиентская сторона
Ручной DNAT — это только про сервер. Клиент настраивается одинаково независимо от того, встроенный у вас диапазон или ручной: в поле `server` указывается мульти-порт адрес (`example.com:20000-50000`), а интервал смены порта задаётся в `transport`. Всё это подробно расписано в [[Hysteria/obfs-port-hopping|основной заметке про port hopping]], здесь не дублируется.
## 📚 См. также
- [[Hysteria/obfs-port-hopping|Обфускация и port hopping]] — что такое port hopping, зачем он, настройка клиента и встроенный серверный диапазон.
- [[Hysteria/config-server|Конфиг сервера]] — где задаётся `listen`.
- [[Hysteria/troubleshooting|Решение проблем]] — если после настройки диапазона клиент не подключается (частая причина — закрытый порт в фаерволе).
- [[Hysteria/00-overview|Hysteria 2 — обзор]] — общая картина.
- 🔗 [Port Hopping — официальная документация](https://v2.hysteria.network/docs/advanced/Port-Hopping/)
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Hysteria/port-hopping-manual.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).