Hysteria2: установка и настройка сервера
Установка и настройка сервера Hysteria2 на VPS: официальный скрипт, TLS через ACME или pinSHA256, masquerade, obfs Salamander, port hopping и клиенты.
Ниже — установка по официальной схеме, параметры, которые реально влияют на работу, и признаки того, что сеть режет UDP. Всё сверено с документацией и исходным кодом и актуально на сентябрь 2026 года: Hysteria 2.12.3, sing-box 1.14, 3x-ui 3.8.
Что понадобится
- VPS ForestsNet Cloud на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9. Скрипту установки нужны systemd,
bashиcurl. - SSH под
rootили пользователем сsudo, вход по ключу — см. «Усиление SSH». - Домен с A-записью на IP сервера для сертификата Let's Encrypt — см. «Как привязать домен к серверу». Без домена можно, с оговорками из Шага 4.
- Приложение с поддержкой Hysteria2 — список в Шаге 9.
Шаг 1. Оцените, подходит ли Hysteria2
Как он устроен
Hysteria2 работает на QUIC — транспорте HTTP/3. Клиент авторизуется HTTP/3-запросом с паролем в заголовке. Если пароль неверный или подключился сканер, сервер ведёт себя как сайт из блока masquerade. TCP-соединения клиента идут в QUIC-потоках, UDP — в QUIC-датаграммах.
Если в клиенте не задана скорость (bandwidth), работает обычный BBR. Если задана — Brutal: он держит указанную скорость, при потерях не сбрасывает её, а досылает пакеты. Поэтому на каналах с потерями и большой задержкой — мобильный интернет, перегруженные международные стыки, слабый Wi-Fi — Hysteria2 обгоняет протоколы поверх TCP. Обратная сторона: без UDP он не работает совсем, а QUIC в пространстве пользователя нагружает процессор сильнее, чем TCP в ядре.
Что происходит с UDP и QUIC в российских сетях
- Фильтр по SNI. По замерам исследователей Падерборнского университета (март–апрель 2026 года) ТСПУ расшифровывает первый пакет QUIC, достаёт из него имя домена и отбрасывает соединения к доменам из реестра, причём не только на порту 443, а затем 420 секунд блокирует ту же пару адресов и портов. Ваш домен, которого нет в реестре, под фильтр не попадает.
- Широкий фильтр уже включали. С марта по июнь 2022 года ТСПУ отбрасывал весь QUIC к зарубежным адресам на порту 443, опознавая его по первому пакету. Пакеты с obfs Salamander (Шаг 6) признаков QUIC не несут.
- Мобильные сети — лотерея. На ntc.party в октябре 2025 года описан оператор, у которого Hysteria2 не подключался, а QUIC не работал даже к VK и Яндексу, хотя VLESS Reality работал; в мае 2026 года там же пишут, что у другого оператора Hysteria2 работает.
- Белые списки. С осени 2025 года в части регионов, а с марта 2026 года и в Москве мобильный интернет периодически переводят в режим белых списков: зарубежные адреса недоступны целиком, и протокол ничего не решает.
- Поведение Brutal. На Хабре предполагают, что ровная высокая скорость без реакции на потери нетипична для браузерного HTTP/3 и может выдавать протокол. Измерений, что ТСПУ этим пользуется, нет.
Вывод: Hysteria2 — быстрый канал там, где UDP проходит, но рядом держите протокол поверх TCP.
Hysteria2, VLESS Reality или AmneziaWG
- Hysteria2 — для каналов с потерями или большой задержкой, где UDP проходит. Лучше — вторым профилем рядом с TCP-вариантом.
- VLESS Reality — основной вариант там, где UDP режут или он нестабилен: TCP 443 и TLS 1.3 от вашего собственного сайта. См. «3x-ui: установка и настройка VLESS + Reality».
- AmneziaWG — VPN на всё устройство с простыми клиентами: WireGuard с маскировкой сигнатур, которые ТСПУ распознаёт с 2023 года. Но это тоже UDP. См. «Amnezia VPN на своём сервере».
Сравнение — «Свой VPN на VPS: какой протокол выбрать».
Шаг 2. Установите сервер
Официальный скрипт ставит последнюю версию и systemd-юниты. Код с get.hy2.sh совпадает с scripts/install_server.sh в репозитории проекта — прочитайте его перед запуском. Если вы не root, скрипт сам перезапустится через sudo.
bash <(curl -fsSL https://get.hy2.sh/)
hysteria versionЧто появится:
- бинарник
/usr/local/bin/hysteriaи пример конфига/etc/hysteria/config.yaml, который повторные запуски не перезаписывают; - системный пользователь
hysteriaс каталогом/var/lib/hysteria, где хранятся сертификаты ACME; - юнит
hysteria-server.serviceи шаблонный[email protected]для файлов/etc/hysteria/<имя>.yaml; - запуск от
hysteriaс правамиCAP_NET_BIND_SERVICE(порт 443 без root),CAP_NET_ADMINиCAP_NET_RAW(правила port hopping) и сNoNewPrivileges=true.
Версию фиксирует флаг --version v2.12.3, сборку под AVX2 — переменная ARCHITECTURE=amd64-avx перед командой. Без скрипта — бинарник с download.hysteria.network/app/latest/ или образ Docker tobyxdd/hysteria.
Шаг 3. Откройте порты
sudo ufw allow 443/udp
sudo ufw allow 80/tcpUDP 443 — сам Hysteria2, TCP 80 — только выпуск и продление сертификата в варианте А. Если ufw ещё выключен, сначала разрешите SSH — см. «Файрвол ufw: порты». На AlmaLinux и Rocky Linux: sudo firewall-cmd --permanent --add-port=443/udp --add-port=80/tcp && sudo firewall-cmd --reload.
Шаг 4. Настройте TLS
TLS в Hysteria2 обязателен. Вариантов два.
Вариант А. Домен и ACME
Hysteria сам получает и продлевает сертификат Let's Encrypt. Блок для конфига из Шага 5:
acme:
domains:
- hy.example.com
email: [email protected]
type: httptype: http — проверка на TCP 80, порт должен быть открыт и свободен. Без type допускается ещё TLS-ALPN на TCP 443; явное указание выручает, если TCP 443 занят, например Xray с VLESS Reality, — с UDP 443 он не конфликтует. Если порт 80 занят nginx, есть type: dns (Cloudflare, DuckDNS, GoDaddy, Namecheap и другие провайдеры).
Если сертификат уже выпускает certbot: файлы в /etc/letsencrypt читает только root, и сервис упадёт с permission denied. Вместо HYSTERIA_USER=root, который предлагает документация, копируйте файлы в /etc/hysteria с владельцем hysteria из deploy-хука certbot, см. «Бесплатный SSL с Let's Encrypt». Перезапуск после продления не нужен: Hysteria сам перечитывает изменившиеся файлы.
Вариант Б. Самоподписанный сертификат и pinSHA256
Если домена нет, с версии 2.9 сертификат делает сам Hysteria. В --host и в sni клиента — только IP вашего сервера (здесь 203.0.113.10) или ваш домен, без чужих имён:
cd /etc/hysteria
sudo hysteria cert --host 203.0.113.10 --valid-for 87600h
sudo chown hysteria:hysteria server.crt server.keyКоманда создаёт ключ ECDSA P-256, печатает отпечаток pinSHA256 и готовые блоки конфига. Срок по умолчанию — год; --valid-for 87600h даёт десять лет, чтобы не раздавать клиентам новый отпечаток. На сервере:
tls:
cert: /etc/hysteria/server.crt
key: /etc/hysteria/server.key
sniGuard: disableВ клиенте — insecure: true вместе с pinSHA256: цепочка не проверяется, но сертификат сверяется с отпечатком. Одно insecure без отпечатка позволяет незаметно подменить сервер.
Самоподписанный сертификат хуже для маскировки: у настоящих сайтов таких нет.
Шаг 5. Соберите конфиг и запустите сервер
Пароль сгенерируйте командой openssl rand -hex 16: в шестнадцатеричной строке нет символов, которые пришлось бы кодировать в ссылке. Замените содержимое /etc/hysteria/config.yaml:
listen: :443
acme:
domains:
- hy.example.com
email: [email protected]
type: http
auth:
type: password
password: ВАШ_ПАРОЛЬ
masquerade:
type: file
file:
dir: /var/www/masqДля варианта Б вместо acme вставьте блок tls. listen: :443 слушает IPv4 и IPv6 сразу.
Зачем нужен masquerade
Цензор может сам подключиться к серверу и посмотреть на ответ — это активное зондирование. Без masquerade Hysteria отвечает на всё 404 Not Found, с ним — ведёт себя как сайт. В примере — режим file: ваш простой сайт из /var/www/masq (нужен хотя бы index.html, читаемый пользователем hysteria). Если на сервере уже есть ваш веб-сервер, подойдёт proxy на него, например url: http://127.0.0.1:8080.
На серверах ForestsNet Cloud нельзя выдавать себя за чужой сайт — проксировать его, указывать его домен в SNI или в сертификате: из-за таких подмен адреса попадают в баны, которые бьют по всей сети. Подробности — в Условиях использования.
Запустите сервер и посмотрите журнал:
sudo systemctl enable --now hysteria-server.service
sudo journalctl -u hysteria-server.service -e --no-pagerИщите строку server up and running. Маскировку проверьте в Chrome: закройте его полностью, запустите с флагом --origin-to-force-quic-on=hy.example.com:443 и откройте https://hy.example.com.
Шаг 6. Включите obfs Salamander, если режут QUIC
Salamander превращает каждый пакет в случайные байты. Документация советует его, когда блокируют именно QUIC или HTTP/3, а не UDP вообще:
obfs:
type: salamander
salamander:
password: ВТОРОЙ_ПАРОЛЬЦена: без пароля obfs сервер молчит — masquerade теряет смысл, клиенты без obfs не подключатся, а неверный пароль obfs выглядит как таймаут. Чтобы не ломать существующих клиентов, поднимите второй экземпляр: /etc/hysteria/obfs.yaml с другим портом (откройте его в файрволе) и юнит [email protected]. С 2.9.2 есть экспериментальный gecko: поверх Salamander он дробит пакеты рукопожатия на куски случайного размера; его понимают официальный клиент и sing-box 1.14.
Шаг 7. Настройте port hopping
Клиент периодически меняет порт внутри диапазона. По документации это помогает, когда провайдер режет или душит долгую UDP-сессию на одном порту; если режут весь UDP, hopping бесполезен.
С версии 2.8.0 сервер на Linux слушает диапазон сам:
listen: :20000-50000Hysteria занимает первый порт диапазона, остальные перенаправляет на него через nftables или iptables и снимает правила при остановке; права у юнита из скрипта есть. Нужна версия 2.12.3 или новее: в ней правила перестали перехватывать исходящий UDP.
sudo ufw allow 20000:50000/udpufw видит пакеты уже после перенаправления, так что строго нужен лишь первый порт, но открытый диапазон не мешает.
Оставить сервер на 443 и перенаправлять диапазон на него можно правилами из документации (eth0 замените на свой интерфейс из ip -br addr):
sudo iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
sudo ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443Такие правила живут до перезагрузки. Сохранять их через iptables-persistent можно, только если нет ufw: в Debian и Ubuntu эти пакеты несовместимы, и apt предложит удалить ufw. С ufw правило кладут в секцию *nat файла /etc/ufw/before.rules, см. «Основы iptables».
В клиенте порт заменяется диапазоном: hy.example.com:20000-50000 или, для ручного варианта, hy.example.com:443,20000-50000. Интервал смены — hopInterval, по умолчанию 30 секунд, минимум 5; с 2.8.0 можно случайный через minHopInterval и maxHopInterval.
Шаг 8. Настройте скорость: Brutal, BBR и буферы UDP
Алгоритм выбирается при подключении:
- в клиенте нет
bandwidth— обе стороны работают на BBR; - клиент указал
bandwidth— это направление идёт через Brutal; еслиbandwidthесть и на сервере, берётся меньшее, так что серверные цифры — потолок на клиента; - на сервере
ignoreClientBandwidth: true— BBR для всех, что бы ни стояло в клиентах.
Для личного сервера документация советует ничего не задавать на сервере, а скорость указать в клиенте — не выше реальной скорости канала без VPN: Brutal шлёт ровно столько, сколько сказано, и завышенные цифры оборачиваются потерями и повторами. Если сервером пользуются несколько человек, ограничьте их:
bandwidth:
up: 300 mbps
down: 300 mbps
# или вместо этого — BBR для всех:
# ignoreClientBandwidth: trueУчитывайте трафик: в пакет VPS ForestsNet Cloud входит исходящий трафик, в том числе повторные отправки Brutal. Если на канале с потерями трафик уходит, а скорость не растёт, добавьте в серверный блок bandwidth параметр disableLossCompensation: true (с 2.10) — Brutal перестанет превышать заданную скорость ради компенсации потерь.
Буферы UDP документация советует поднять до 16 МБ:
sudo tee /etc/sysctl.d/99-hysteria.conf >/dev/null <<'EOF'
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
sudo sysctl --systemПризнак нехватки — сообщение quic-go failed to sufficiently increase receive buffer size в журнале. На сервере оно редкость: с правом CAP_NET_ADMIN из юнита quic-go увеличивает буфер принудительно; на Linux-клиентах без этого права настройка обязательна. QUIC к тому же упирается в процессор раньше TCP — при свободном канале и низкой скорости проверьте CPU, см. «Высокая нагрузка на сервер».
Шаг 9. Подключите клиентов
Ссылка hysteria2://
hysteria2://ВАШ_ПАРОЛЬ@hy.example.com:443/?sni=hy.example.com#forestsnetДля obfs добавьте obfs=salamander&obfs-password=..., для самоподписанного сертификата — insecure=1&pinSHA256=..., для hopping впишите диапазон вместо 443. Скорость в ссылку намеренно не входит — её задают в клиенте. Ссылку и QR-код можно получить на сервере (для obfs и отпечатка добавьте в файл блоки obfs и tls):
cat > ~/hy2-client.yaml <<'EOF'
server: hy.example.com:443
auth: ВАШ_ПАРОЛЬ
EOF
hysteria share -c ~/hy2-client.yaml --qrКлиенты
- Официальный клиент
hysteriaдля Windows, macOS и Linux — режимы SOCKS5, HTTP и TUN. Новое появляется в нём первым: имитация рукопожатия Chrome с 2.11,geckoс 2.9.2. - sing-box и его приложения для Android, iOS и macOS: port hopping (
server_ports) с 1.11,geckoс 1.14. - Hiddify (Windows, macOS, Linux, Android, iOS) и NekoBox for Android — на ядре sing-box.
- v2rayN (Windows, macOS, Linux) — ядро для Hysteria2 выбирается в настройках: Xray или sing-box. v2rayNG на Android с версии 2.0 работает с ним через Xray.
- iOS: Shadowrocket, Streisand, Stash, Loon, Surge, Egern — из официального списка сторонних клиентов.
Сторонние реализации, как предупреждает документация, могут отставать. С pinSHA256 особенно: у sing-box свои поля и формат отпечатка (base64). После импорта ссылки проверьте, что отпечаток в профиле на месте, — иначе insecure=1 просто отключит проверку сервера.
3x-ui, Remnawave и sing-box в роли сервера
Инбаунд Hysteria2 есть в 3x-ui с версии 2.9.0 (апрель 2026, актуальная — 3.8.5) и в Remnawave. Обе панели работают на реализации Xray-core (входящий Hysteria 2 — с версии 26.3.27), а не на сервере Hysteria; Salamander, Brutal и hopping там задаются через finalmask, quicParams и маску udphop. Панель удобна для многих пользователей с учётом трафика, для личного сервера проще официальный бинарник. Сервером может быть и sing-box (входящий hysteria2 с пользователями, obfs и masquerade), hopping для него — через iptables или nftables.
Диагностика
timeout: no recent network activity. Сервер не запущен, UDP-порт закрыт, домен указывает на другой IP или не совпадают настройки obfs. Проверьтеsudo systemctl status hysteria-serverиsudo ss -ulpn | grep hysteria.- Через Wi-Fi работает, через мобильный интернет — нет. Оператор режет UDP или QUIC. Попробуйте Salamander, затем port hopping; не помогло — переводите клиента на VLESS Reality. IP-адреса ForestsNet Cloud ежедневно проверяются на блокировки ТСПУ, так что дело скорее в сети оператора; белые списки настройкой сервера не обходятся. Mimic (маскировка UDP под TCP, с 2.12) работает только между Linux-машинами и несовместим с hopping.
authentication error, HTTP status code: 404. Неверный пароль или чужой сервер; до 2.9.3+в пароле из ссылки превращался в пробел.certificate signed by unknown authorityилиno certificate matches the pinned hash. Самоподписанный сертификат безinsecureиpinSHA256в клиенте, либо сертификат перевыпущен, либо закреплён отпечаток CA — с 2.6.4 сверяется только конечный сертификат.tls: internal error. SNI клиента не совпадает с сертификатом, и сервер обрывает рукопожатие (параметрsniGuard). Укажите свой домен, а не чужой популярный; для самоподписанного сертификата по IP нуженsniGuard: disable.- Сервер не стартует:
invalid config: tls.cert ... permission denied. Пользовательhysteriaне может прочитать файлы сертификата — см. Шаг 4. - Сертификат ACME не выпускается. TCP 80 закрыт или занят, либо A-запись ещё не обновилась. Альтернатива —
type: dns. - Медленно. Завышен
bandwidthв клиенте, сервер ограничивает скорость своимbandwidth, не хватает процессора или буферов. Замер без приложений:speedTest: trueна сервере иhysteria speedtestв официальном клиенте; с Brutal тест покажет заданную скорость, а не предельную. - Обрывы. Если они совпадают со сменой порта (по умолчанию раз в 30 секунд), часть портов диапазона недоступна или нет правил перенаправления: проверьте
sudo nft list tablesиsudo iptables -t nat -S, сузьте диапазон. Долгое переподключение после сна телефона лечится сервером 2.12.1+: он отправляет QUIC stateless reset. - TCP через прокси работает, UDP (звонки, игры) — нет. Сервер старше 2.8.2, а клиент новее — обновите сервер.
- Клиент на Xray подключается, но трафик не идёт. Такой случай в российской сети описан в Xray-core issue #6717 (сентябрь 2026): с тем же сервером sing-box работал. Попробуйте клиент или ядро sing-box.
Безопасность и обслуживание
Обновление. Повторный запуск скрипта ставит новую версию и перезапускает работающие экземпляры, а флаг --check только проверяет, есть ли обновление:
bash <(curl -fsSL https://get.hy2.sh/) --check
bash <(curl -fsSL https://get.hy2.sh/)Держите версию не ниже 2.9.2: в 2.8.2 и 2.9.2 закрыты четыре серьёзные уязвимости — падение сервера из-за параметров QUIC от клиента, отказ в обслуживании при включённом sniff, обход ACL для UDP. Сервер обновляйте раньше клиентов: клиенты 2.8.2 и новее не передают UDP через старые серверы.
ACL. Без правил любой, кто знает пароль, доберётся через прокси до служб на 127.0.0.1 сервера и до частных сетей. Закройте их, а заодно исходящий SMTP, чтобы с вашего IP не рассылали спам:
acl:
inline:
- reject(127.0.0.0/8)
- reject(::1/128)
- reject(10.0.0.0/8)
- reject(172.16.0.0/12)
- reject(192.168.0.0/16)
- reject(fc00::/7)
- reject(all, tcp/25)Пользователи и права. Режим auth.type: userpass даёт каждому свой пароль и позволяет отзывать доступ по одному, в ссылке тогда стоит имя:пароль@. Конфиг скрипт создаёт читаемым для всех, а в нём пароли:
sudo chown root:hysteria /etc/hysteria/config.yaml
sudo chmod 640 /etc/hysteria/config.yamlAPI статистики (trafficStats) включайте только с secret и не открывайте наружу. Общие меры — в «Чеклисте базовой защиты VPS».
Источники
- Документация Hysteria 2: установка, скрипт установки, сторонние клиенты, конфиг сервера, конфиг клиента, URI Scheme, Port Hopping, Performance, Troubleshooting, Mimic
- apernet/hysteria — релизы, install_server.sh, уязвимости
- sing-box — входящий Hysteria2 и исходящий
- 3x-ui — релизы, Xray-core v26.3.27, Xray-core issue #6717
- FOCI 2026 — On Russia's Early Introduction of QUIC SNI Censorship
- net4people — Blocking of HTTP/3 (QUIC) in Russia
- ntc.party — Hysteria2 на мобильном операторе, блокировка VPN-протоколов на ТСПУ
- Хабр — «Заморозка по fingerprint», «Hysteria 2: протокол, который притворяется HTTP/3»
- Википедия — «Белые списки» сайтов в России