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–5.

Шаг 3. Откройте порты

sudo ufw allow 443/udp
sudo ufw allow 80/tcp

UDP 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: http

type: 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 без отпечатка позволяет незаметно подменить сервер.

Важно: не делайте сертификат на ключе Ed25519. С версии 2.11 официальный клиент имитирует QUIC-рукопожатие Chrome, а Chrome не объявляет поддержку Ed25519 — соединение не установится. Сертификаты ACME и hysteria cert подходят.

Самоподписанный сертификат хуже для маскировки: у настоящих сайтов таких нет.

Шаг 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–8 — по необходимости, ссылка для клиентов — в Шаге 9.

Шаг 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-50000

Hysteria занимает первый порт диапазона, остальные перенаправляет на него через nftables или iptables и снимает правила при остановке; права у юнита из скрипта есть. Нужна версия 2.12.3 или новее: в ней правила перестали перехватывать исходящий UDP.

sudo ufw allow 20000:50000/udp

ufw видит пакеты уже после перенаправления, так что строго нужен лишь первый порт, но открытый диапазон не мешает.

Оставить сервер на 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.yaml

API статистики (trafficStats) включайте только с secret и не открывайте наружу. Общие меры — в «Чеклисте базовой защиты VPS».

Источники