Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
105 lines
9.5 KiB
Markdown
105 lines
9.5 KiB
Markdown
---
|
||
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-трафик с диапазона портов (например, 20000–50000).
|
||
- Правила сбрасываются при перезагрузке — сделайте их постоянными или выполняйте при старте системы.
|
||
|
||
## Когда нужен ручной способ
|
||
|
||
По умолчанию серверную часть port hopping делать вручную не надо: на Linux достаточно указать диапазон прямо в `listen`, и Hysteria сама настроит и уберёт правила фаервола (подробнее — в разделе «На сервере» [[Hysteria/obfs-port-hopping|основной заметки]]):
|
||
|
||
```yaml
|
||
listen: :20000-50000
|
||
```
|
||
|
||
Ручной проброс через DNAT нужен в исключительных случаях:
|
||
|
||
- Встроенный способ по каким-то причинам не работает или недоступен в вашей сети.
|
||
- Вы хотите сами управлять правилами фаервола (например, они уже сложные, и автоматические правила Hysteria конфликтуют с ними).
|
||
- Сервер слушает фиксированный порт, и вы отдельно администрируете сетевой стек.
|
||
|
||
Во всех остальных случаях проще и надёжнее встроенный диапазон в `listen` — он же сам подчищает правила при остановке сервера.
|
||
|
||
## Как это работает
|
||
|
||
Идея простая: сервер Hysteria слушает **один** порт (в примерах — 443), а фаервол перенаправляет (DNAT/REDIRECT) на этот порт весь UDP-трафик, приходящий на любой порт из диапазона. Для клиента это выглядит так, будто сервер отвечает на всех портах диапазона, — а физически он слушает один.
|
||
|
||
**Проще говоря:** клиент стучится на случайные порты 20000–50000, фаервол ловит эти пакеты и молча переставляет им адрес назначения на порт 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, а клиент может подключаться к любому порту из диапазона 20000–50000.
|
||
|
||
> [!warning] Правила не переживают перезагрузку
|
||
> Команды iptables/nftables выше сбрасываются при перезапуске системы. Чтобы port hopping продолжал работать после ребута, сделайте правила постоянными штатными средствами дистрибутива (`iptables-save`/`netfilter-persistent`, `nftables.service` с конфигом в `/etc/nftables.conf` и т.п.) либо выполняйте их скриптом при старте. Это отличие от встроенного `listen: :20000-50000`, где Hysteria сама ставит правила при запуске и убирает при остановке.
|
||
|
||
> [!danger] Не забудьте открыть диапазон в фаерволе провайдера
|
||
> DNAT перенаправляет пакеты уже внутри сервера, но до этого они должны до сервера дойти. Если у хостера есть внешний фаервол (в панели VPS) или на самом сервере включён `INPUT`-фильтр, откройте в нём весь UDP-диапазон 20000–50000 — иначе пакеты будут отброшены раньше, чем сработает 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).
|