В этом году я, как и многие посетители Хабра, с огромным интересом читал статьи уважаемого @MiraclePtr учился применять озвученные им идеи и рекомендации, на практике знакомясь с протоколами, клиентами и графическими панелями. Для многих протоколов существуют подробные инструкции по установке и настройке, доступные самым неискушенным пользователям, начинающим знакомиться с миром Linux.
Дошли у меня руки и до вкратце описанного в статье Современные технологии обхода блокировок: V2Ray, XRay, XTLS, Hysteria, Cloak и все-все-все протокола Hysteria, который уже добрался до второй версии. Но для него я не нашёл цельной русскоязычной инструкции, что вызвало желание собрать воедино информацию, когда я разобрался с основными вопросами установки, настройки сервера и клиентов для использования этого протокола.

Hysteria – это быстрый кроссплатформенный работающий на основе модифицированного протокола QUIC протокол с широким набором режимов (SOCKS5, HTTP-прокси, пересылка TCP/UDP, Linux TProxy), поддержкой пользовательской аутентификации, статистики трафика и контроля доступа, проброс портов, маскирующийся под стандартный трафик HTTP/3, что делает его сложным для обнаружения и блокирования. Несмотря на то, что QUIC почти полностью блокируется в России, в Hysteria возможно использовать обфускацию трафика, что, правда, может привести к его блокировке вместе с другими неопознанными протоколами. Для Hysteria пока нет никаких панелей, но на практике и без них настроить сервер и клиентов довольно просто.
Протокол развивается, хорошо работает и вполне может вам пригодиться наряду с популярными сейчас Shadowsocks, XTLS-Reality и другими протоколами. Мы же не кладём все яйца в одну корзинку ?
Установка
Домашняя страница Hysteria2
Официальный репозиторий Hysteria
В дальнейшем предполагаю, что у вас есть VPS c Debian/Ubuntu и SSH доступ к нему (как и права root на нём). Для других дистрибутивов Linux синтаксис и команды могут отличаться, но общий смысл команд будет аналогичным. Признаюсь сразу, я не великий знаток Linux, поэтому замечания и советы приветствуются.
Также обязательно наличие домена, его можно купить на год за небольшие деньги (например, на spaceship.com), или получить бесплатно на dynu.com.
Рассмотрим два варианта установки Hysteria на сервер: в контейнере Docker или установкой на сервер.
Запуск в контейнере Docker
Установить Docker engine можно по официальному руководству.
Загрузите образ командой:
sudo docker pull tobyxdd/hysteria
Создайте папку для конфигурации:
sudo mkdir -p /etc/hysteria
Создайте файл конфигурации server.yaml (параметры конфигурации рассматриваются ниже), в котором укажите путь к вашим файлам сертификата домена (если используете свои сертификаты, а не скрипт acme.sh) и остальные параметры конфигурации сервера. Вам надо обеспечить доступность файлов для чтения.
sudo nano /etc/hysteria/server.yaml
Запустите контейнер, указав тот же порт, что и в файле конфигурации:
sudo docker run -d -p 443:443/udp --name hysteria --restart=always -e TZ=Europe/Moscow -v /etc/hysteria:/etc/hysteria teddysun/hysteria
Логи контейнера можно посмотреть этой командой:
sudo docker logs hysteria
Установка на сервер
Дальнейшие команды приведены для запуска от обычного пользователя с повышением прав командой sudo. В качестве подготовки к установке для новичков в Linux приведу рекомендуемые команды после разворачивания образа ОС на VPS:
sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt install curl -y
После этого я обычно перегружаю VPS для возможной установки обновленного ядра.
Как и для большинства современных протоколов VPN/proxy, у разработчиков существует скрипт для установки/обновления или удаления Hysteria на Linux сервере. Для пользователя root установка/обновление Hysteria выполняется командой:
bash <(curl -fsSL https://get.hy2.sh/)
Запуск этого скрипта от обычного пользователя с повышением прав командой sudo у меня выдаёт ошибку об отсутствии доступа curl к специальным файлам /dev/fd/хх. Это решается обычным скачиванием скрипта в папку пользователя и последующим запуском с повышением прав командой sudo:
wget https://get.hy2.sh/install_server.sh && chmod 755 install_server.sh && sudo ./install_server.sh
После установки вам надо определиться со способом указания сертификата и приватного ключа домена: вы можете указать путь к уже имеющимся у вас файлам сертификата или позволить Hysteria автоматически получить (и продлевать) сертификат с помощью встренного скрипта acme.sh, указав домен и почту в файле конфигурации сервера.
Конфигурация сервера
После этого надо отредактировать конфигурацию сервера. Описание всех параметров файла конфигурации сервера доступно здесь. В YAML отступы из пробелов (символы табуляции не допускаются) используются для обозначения структуры, поэтому убирать и добавлять лишние пробелы не рекомендуется. Часть непонятных ошибок в процессе настройки и тестирования разных режимов у меня было из-за лишнего/отсутствующего пробела.
sudo nano /etc/hysteria/config.yaml
Конфигурация по умолчанию выглядит так:
# listen: :443
acme:
domains:
- your.domain.net
email: your@email.com
auth:
type: password
password: o9s+p5+sR5Bi13XWBjjf2ymW
masquerade:
type: proxy
proxy:
url: https://news.ycombinator.com/
rewriteHost: true
Это набор необходимых параметров файла конфигурации. Разберём эти параметры.
# listen: :443
По умолчанию Hysteria слушает 443 порт (как порт по умолчанию для HTTP/3), но если вы хотите использовать другой порт - надо убрать комментарий с этого параметра и указать нужный вам порт.
acme:
domains:
- your.domain.net
email: your@email.com
Здесь нужно указать ваш домен и email для получения сертификата с помощью скрипта acme.sh. Сертификаты будут автоматически получены и сохранены в подпапку использованного центра сертификации по пути /var/lib/hysteria/acme/certificates
Полный список параметров этого раздела:
acme:
domains:
- domain1.com
- domain2.org
email: your@email.net
ca: zerossl
listenHost: 0.0.0.0
dir: my_acme_dir
type: http | tls | dns
http:
altPort: 8888
tls:
altPort: 44333
dns:
name: gomommy
config:
key1: value1
key2: value2
Дополнительные полезные параметры этого раздела:
ca - используемый центр сертификации, допустимые значения letsencrypt
или zerossl
, для российских доменов надо указывать letsencrypt
dir - папка для сохранения полученных по протоколу ACME сертификатов
type - тип вызова ACME, я обычно использую для Cloudflare dns
(подробнее тут) с указанием токена Cloudflare API с правами редактирования DNS для указанных доменов:
dns:
name: cloudflare
config:
cloudflare_api_token: Dxabckw9dB_jYBdi89kgyaS8wRjqqSsd679urScKOBP
Вместо этого можно указать уже имеющиеся у вас файлы сертификата:
tls:
cert: your_cert.crt
key: your_key.key
В этом случае вам надо обеспечить доступность к чтению файлов сертификата для Hysteria, для этого достаточно команды
sudo chmod 644 -Rf путь_к_файлам_сертификата
Например, если файлы сертификата лежат в /etc/ssl/private, то этот параметр принимает такой вид:
tls:
cert: /etc/ssl/private/fullchain.cer
key: /etc/ssl/private/private.key
Аутентификация
Эта секция задаёт аутентификацию. Возможна аутентификация по паролю, HTTP и командная аутентификация.
При выборе аутентификации по паролю можно использовать единый пароль или использовать многопользовательскую конфигурацию:
auth:
type: password
password: o9s+p5+sR5Bi13XWBjjf2ymW
auth:
type: userpass
userpass:
user1: pass1
user2: pass2
user3: pass3
HTTP-аутентификация задаётся так:
auth:
type: http
http:
url: http://your.backend.com/auth
insecure: false
При использовании HTTP-аутентификации при попытке подключения клиента сервер будет отправлять на внутренний сервер POST-запрос со следующим JSON:
{
"addr": "123.123.123.123:44556",
"auth": "something_something",
"tx": 123456
}
Ваша конечная точка должна ответить объектом JSON со следующими полями:
{
"ok": true,
"id": "john_doe"
}
При использовании командной аутентификации при попытке подключения клиента сервер будет выполнять указанную команду со следующими аргументами (аргументы такие же, как для HTTP-аутентификации):
/etc/some_command addr auth tx
Команда отправляет уникальный идентификатор клиента в stdout и возвращает код 0, если соединение с клиентом разрешено, или ненулевым кодом, если клиент отвергнут.
Если команда не выполняется, то клиент также будет отвергнут.
Маскировка
Секция “маскарад” определяет используемую маскировку. Одним из ключевых моментов противодействия цензуре в Hysteria является его способность маскироваться под стандартный трафик HTTP/3. Это означает, что пакеты не только отображаются как HTTP/3 для промежуточных узлов, но и сервер отвечает на HTTP-запросы как обычный веб-сервер.
Однако это означает, что ваш сервер должен действительно обслуживать некоторый контент, чтобы он казался подлинным для потенциальных цензоров.
Если цензура не вызывает опасений, можно полностью отказаться от секции masquerade. В этом случае Hysteria всегда будет возвращать "404 Not Found" для всех HTTP-запросов.
В настоящее время Hysteria предоставляет следующие режимы "маскарада":
file: Действует как статический файловый сервер, отображая файлы из каталога.
proxy: Действует как обратный прокси-сервер, передавая содержимое с другого сайта.
string (строка): Действует как сервер, который всегда возвращает строку, заданную пользователем.
type: file
file:
dir: /www/masq
type: proxy
proxy:
url: https://news.ycombinator.com/
rewriteHost: true
type: string
string:
content: hello stupid world
headers:
content-type: text/plain
custom-stuff: ice cream so good
statusCode: 200
Я обычно выбираю действующий сайт, расположенный в подсети моего VPS (в этом мне помогает BGP Toolkit)
Обфускация трафика
По умолчанию протокол Hysteria имитирует HTTP/3. Если ваша сеть специально блокирует трафик QUIC или HTTP/3 (но не UDP в целом), то для обхода этого можно использовать обфускацию. В настоящее в Hysteria реализована обфускация под названием "Salamander", которая преобразует пакеты в случайные байты без шаблона. Для работы этой функции требуется пароль, который должен быть одинаковым как на стороне клиента, так и на стороне сервера (Включение обфускации сделает ваш сервер несовместимым со стандартными QUIC-соединениями, и он больше не будет функционировать как действительный HTTP/3-сервер)
Для включения обфускации трафика в конфигурацию надо добавить следующий раздел
obfs:
type: salamander
salamander:
password: cry_me_a_r1ver
Проброс портов
Пользователи в Китае иногда сообщают, что их провайдеры блокируют или ограничивают постоянные UDP-соединения. Однако эти ограничения часто распространяются только на конкретный используемый порт. В качестве обходного пути в этой ситуации можно использовать проброс портов.
Конфигурация клиента
Клиент Hysteria поддерживает специальный формат многопортовых адресов:
example.com:1234,5678,9012
example.com:20000-50000
example.com:1234,5000-6000,7044,8000-9000
Количество портов, которые можно указать, не ограничено.
Клиент будет случайным образом выбирать один из указанных портов для первоначального соединения и периодически переключаться на другой порт. Опция для управления интервалом - hopInterval в транспортной секции:
transport:
udp:
hopInterval: 30s
Конфигурация сервера
Сервер Hysteria не имеет встроенной поддержки прослушивания нескольких портов, поэтому вы не можете использовать приведенный выше формат в качестве адреса прослушивания на стороне сервера. Разработчики рекомендуют использовать iptables DNAT для перенаправления портов на прослушивающий порт сервера.
# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j DNAT --to-destination :443
# IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j DNAT --to-destination :443
В этом примере сервер прослушивает порт 443, но клиент может подключиться к любому порту в диапазоне 20000-50000.
Как подсказал уважаемый @Renaissance, для port hopping при использовании nftables можно использовать redirect в таблице NAT (при условии что hysteria2 запущена на дефолтном 443 порту и нет разделения на ip4/ip6):
udp dport 20000-50000 redirect to 443
Полезные пункты конфигурации сервера
Вы можете указать, какой DNS-сервер использовать для разрешения доменных имен в клиентских запросах.
resolver:
type: udp
tcp:
addr: 8.8.8.8:53
timeout: 4s
udp:
addr: 8.8.4.4:53
timeout: 4s
tls:
addr: 1.1.1.1:853
timeout: 10s
sni: cloudflare-dns.com
insecure: false
https:
addr: 1.1.1.1:443
timeout: 10s
sni: cloudflare-dns.com
insecure: false
Правила ACL, часто используемые в сочетании с outbounds, являются мощной функцией сервера Hysteria, позволяющей настраивать способ обработки запросов клиентов. C помощью ACL можно блокировать определенные адреса или использовать разные outbounds для разных сайтов. Можно использовать либо файловый, либо инлайн вариант указания правил обработки. Подробно доступные правила ACL приведены здесь.
Как напомнил уважаемый @Renaissance, разработчики не рекомендуют использовать Hysteria для проксирования трафика HTTP/3 (когда можно использовать HTTP/2 или ниже):
"В настоящее время все сайты и приложения используют QUIC только в качестве "апгрейда". Если сеть его не поддерживает (например, UDP заблокирован), то происходит переход на HTTP/2 или более низкий уровень (который использует TCP).
Если вы используете Chrome или Firefox с прокси-сервером HTTP/SOCKS5 на ПК, то браузер сам по себе фактически отключил HTTP/3, поскольку прокси-сервер HTTP не может поддерживать пересылку UDP. Что касается SOCKS5, то, хотя теоретически он поддерживает UDP, в Chrome и Firefox он не реализован.
Если вы используете VPN-клиент типа Shadowrocket, SagerNet на телефоне (или TUN на ПК), рекомендуется вручную отключить HTTP/3 одним из следующих способов":
Chrome: Откройте страницу
chrome://flags/
, найдите параметрExperimental QUIC protocol
и переключите его значение вDisabled
Firefox: Откройте страницу
about:config
, найдите параметрnetwork.http.http3.enable
и переключите его значение вfalse
Блокируйте UDP порт 443 правилом ACL (
inline
):- reject(all, udp/443)
В настоящее время Hysteria поддерживает следующие типы исходящих соединений outbounds:
direct: Прямое соединение через локальный интерфейс.
socks5: SOCKS5-прокси.
http: HTTP/HTTPS‑прокси.
В частности, я использую на сервере WARP прокси и некоторые сайты пускаю через него, что позволяет без проблем пользоваться сервисами OpenAI.com, например. Также я отключил доступ на российские ресурсы (вдруг в клиенте шаловливые ручки отключат для них обход прокси).
outbounds:
- name: warp_proxy
type: socks5
socks5:
addr: 127.0.0.1:40000
acl:
inline:
# WARP proxy
- warp_proxy(suffix:google.com)
- warp_proxy(suffix:openai.com)
# Block RU
- reject(geoip:ru)
# Block Google Ads
- reject(geosite:google@ads)
# Block UDP port 443
- reject(all, udp/443)
# Direct all other connections
- direct(all)
Скриптов установки WARP в режиме прокси много, я использовал этот, установка происходит командой
cd && bash <(curl -fsSL git.io/warp.sh) proxy
Завершение установки
После редактирования файла конфигурации остаётся только запустить сервис и добавить его в запускаемые при старте сервера сервисы:
sudo systemctl start hysteria-server.service
sudo systemctl enable hysteria-server.service
Посмотреть журнал сервиса можно этой командой:
sudo journalctl -u hysteria-server.service
Настройка клиентов
Вы можете использовать официальный клиент под нужную ОС, который можно скачать с Github, или сторонние клиенты, список которых доступен здесь.
Официальный клиент под Windows x64 (https://download.hysteria.network/app/latest/hysteria-windows-amd64.exe) запускается с расположенным с ним в одном каталоге файлом config такого содержания, параметры которого должны совпадать с файлом конфигурации сервера:
server: your.domain.net:443
auth: RZhuNfVtgQgQuPInznsiygIq
obfs:
type: salamander
salamander:
password: cry_me_a_r1ver
http:
listen: 127.0.0.1:8080
socks5:
listen: 127.0.0.1:1080
В случай многопользовательской конфигурации секция auth: выглядит так:
auth: user:pass
Описание всех параметров файла конфигурации клиента доступно здесь.
Из сторонних клиентов можно использовать NekoBox for Android / Nekoray для Windows или Hiddify под необходимую ОС.
В NekoBox/Nekoray при добавлении конфигурации необходимо выбрать тип Hysteria, в пунктах Сервер и SNI прописать имя домена, указать удаленный порт на сервере, пароль подключения и пароль обфускации.

В Hiddify достаточно вставить из буфера скопированную туда конфигурацию в таком формате:
{
"outbounds": [
{
"type": "hysteria2",
"tag": "Hysteria 2",
"server": "IP of your domain as xx.xx.xx.xx",
"server_port": 443,
"obfs": {
"type": "salamander",
"password": "cry_me_a_r1ver"
},
"password": "o9s+p5+sR5Bi13XWBjjf2ymW",
"tls": {
"enabled": true,
"server_name": "your.domain.net"
}
}
]
}