todo/Hysteria/port-hopping-manual.md
loop-uh baf0091fa3
Some checks failed
Published content check / validate (push) Failing after 17s
git.zapret.moe → git2.zapret.moe во всём хранилище, защита от возврата старых имён
git.zapret.moe в России заблокирован по имени, как и wiki.zapret.moe. Ссылки
на Forgejo во всех заметках, футерах, wizard.html и главной заменены на
git2.zapret.moe (включая закодированные адреса значков shields.io).

Какое имя рабочее, теперь решают реестры хоста /etc/zapret-*-domains.conf через
zapret-site-names: pre-commit хук vault отклоняет добавленные строки с
заблокированным именем, сборка Quartz сама переводит ссылки и baseUrl на
рабочие имена. Правило в AGENTS.md переписано под этот механизм.

scripts/wiki-stats.py: переходы с любых имён вики и git (wikiN, gitN) больше
не считаются внешними сайтами. content-check: проверка зеркал сторонних
проектов узнаёт любое имя git.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:51:32 -04:00

10 KiB
Raw Permalink Blame History

date tags aliases link description
2026-07-11
hysteria
port-hopping
iptables
nftables
dnat
linux
Hysteria port hopping вручную
Hysteria DNAT проброс портов
Hysteria ручной проброс диапазона
https://v2.hysteria.network/docs/advanced/Port-Hopping/ Ручная настройка port hopping для сервера Hysteria 2: DNAT-правила iptables и nftables, перенаправление UDP-диапазона портов на один порт 443.

[!mirror] Резервное зеркало Актуальная версия этой страницы — на основной вики: wiki2.zapret.moe/Hysteria/port-hopping-manual

🦎 Hysteria 2 — port hopping вручную (DNAT)

[!info] О чём заметка Как настроить серверную часть Hysteria/obfs-port-hopping вручную через правила фаервола (iptables/nftables DNAT), когда встроенный диапазон в listen не подходит. Что такое сам port hopping, зачем он нужен и как настраивается клиент — разобрано в Hysteria/obfs-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):

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 — на нужный диапазон.

# 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. Значения вынесены в переменные — поправьте под себя:

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, здесь не дублируется.

📚 См. также


[!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.