В этом году я, как и многие посетители Хабра, с огромным интересом читал статьи уважаемого @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, поэтому замечания и советы приветствуются.
Также обязательно наличие домена, его можно купить на год за небольшие деньги (например, на regway.com), или получить бесплатно на dynu.com.
Рассмотрим два варианта установки Hysteria на сервер: в контейнере Docker или установкой на сервер.
Запуск в контейнере Docker
Установить Docker engine можно по официальному руководству.
Загрузите образ командой:
sudo docker pull teddysun/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 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: RZhuNfVtgQgQuPInznsiygIq
masquerade:
type: proxy
proxy:
url: https://news.ycombinator.com/
rewriteHost: true
Это набор необходимых параметров файла конфигурации. Разберём эти параметры.
# listen: :443
По умолчанию Hysteria слушает 443 порт, но если вы хотите использовать другой порт - надо убрать комментарий с этого параметра и указать нужный вам порт.
acme:
domains:
- your.domain.net
email: your@email.com
Здесь нужно указать ваш домен и email для получения сертификата с помощью скрипта acme.sh. Сертификаты будут автоматически получены и сохранены в подпапку использованного центра сертификации по пути /var/lib/hysteria/acme/certificates
Вместо этого можно указать уже имеющиеся у вас файлы сертификата:
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: RZhuNfVtgQgQuPInznsiygIq
auth:
type: userpass
userpass:
user1: pass1
user2: pass2
user3: pass3
HTTP-аутентификация задаётся так:
auth:
type: http
http:
url: http://your.backend.com/auth
insecure: false
command: /etc/some_command
При использовании HTTP-аутентификации при попытке подключения клиента сервер будет отправлять на внутренний сервер POST-запрос со следующим JSON:
{
"addr": "123.123.123.123:44556",
"auth": "something_something",
"tx": 123456
}
Ваша конечная точка должна ответить объектом JSON со следующими полями:
{
"ok": true,
"id": "john_doe"
}
При использовании командной аутентификации при попытке подключения клиента сервер будет выполнять указанную команду со следующими аргументами:
/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 прокси я использовал этот: https://github.com/P3TERX/warp.sh, установка происходит командой
cd && bash <(curl -fsSL git.io/warp.sh) proxy
Правда, с Debian 12 скрипт не работает, надо добавить в 164 строку кодовое имя этой ОС bookworm. Автору я тикет отправил, он пока не отреагировал:
Для себя я пока сделал форк и запускаю на Debian 12 установку WARP прокси командой
cd && bash <(curl -fsSL https://raw.githubusercontent.com/Rennats/warp.sh/main/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.
В обеих программах при добавлении конфигурации необходимо выбрать тип Hysteria, в пунктах Сервер и SNI прописать имя домена, указать удаленный порт на сервере, пароль подключения и пароль обфускации.
Комментарии (13)
quakin
26.11.2023 08:36+4Для Hysteria пока нет никаких панелей...
Иранская панель Hiddify-manager вроде как поддерживает Hysteria2.
(по крайней мере тег `hysteria2` стоит у них на гитхабе)
Renaissance
26.11.2023 08:36+4После установки вам надо определиться со способом указания сертификата и приватного ключа домена: вы можете указать путь к уже имеющимся у вас файлам сертификата или позволить Hysteria автоматически получить (и продлевать) сертификат с помощью установленного скрипта acme.sh, указав домен и почту в файле конфигурации сервера.
не нужны никакие дополнительные acme.sh, hysteria2 уже имеет в своем составе встроенный ACME клиент (о его конфигурации ниже же и написано), абсолютно нет смысла дублировать функционал.
Все что нужно для получения сертификата, это секция "acme" в конфигурации и открытый порт 443/tcp (дефолтный, изменяемый). Для российских доменов нужно изменить параметр ca на letsencrypt, т.к. zerossl отказывается выдавать сертификаты на российские домены (RU точно).
HTTP-аутентификация задаётся так:
в этом блоке 2 типа аутентификации вообще указаны. command это отдельный 3 тип.
Для port hopping при использовании nftables можно использовать redirect в таблице nat, типа такого (при условии что hysteria2 запущена на дефолтном 443 порту и нет разделения на ip4/ip6):
udp dport 20000-50000 redirect to 443
Вы можете указать, какой DNS-сервер использовать для разрешения доменных имен в клиентских запросах.
судя по вопросам на GitHub, указать можно несколько, но использоваться будет только первый, а в случае его недоступности будет использован системный DNS (также он будет использоваться если не задавать dns в конфигурации вообще).
Ну в итоге Hysteria2 выглядит неплохо, работает тоже неплохо.
Но нужен незаблокированный провайдером QUIC (обходится использованием obfs) и лучше всего свой домен на который можно получать сертификат LE, иначе будут пляски с добавлением самоподписанных в доверенные.
РКН баловался блокировкой QUIC точно, блокировал все по белым спискам (vk.com в нем), дают ли еще где-то бесплатно домены - вопрос открытый.
MiraclePtr
26.11.2023 08:36А встроенный acme нормально работает при включенном obfs?
Renaissance
26.11.2023 08:36Да, только что проверил, работает.
Используется challenge tls-alpn-01.
Stanner Автор
26.11.2023 08:36Спасибо, внес ваши замечания и предложения.
А встроенный клиент поддерживает смену CA?
Renaissance
26.11.2023 08:36+3Еще одно дополнение в конфигурацию:
разработчики рекомендуют запрещать QUIC/HTTP3 внутри прокси, в конфигурации это как раз пример использования ACL:
acl: inline: - reject(all, udp/443)
Renaissance
26.11.2023 08:36+1Из интересного: разработчики собирают бинарники под довольно большой круг архитектур, в т.ч. и arm, поэтому hysteria2 можно запускать даже на роутерах (на примере OpenWRT):
root@AC2100:/opt/hysteria# ./hysteria-linux-mipsle version ░█░█░█░█░█▀▀░▀█▀░█▀▀░█▀▄░▀█▀░█▀█░░░▀▀▄ ░█▀█░░█░░▀▀█░░█░░█▀▀░█▀▄░░█░░█▀█░░░▄▀░ ░▀░▀░░▀░░▀▀▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀░▀░░░▀▀▀ a powerful, lightning fast and censorship resistant proxy Aperture Internet Laboratory <https://github.com/apernet> Version: v2.2.2 BuildDate: 2023-11-23T04:58:09Z BuildType: release CommitHash: f48a5edd39433f51647c3739e8fed3adae21525c Platform: linux Architecture: mipsle-sf
Но вот как там с QUIC, TLS последних версий, это надо пробовать. В теории должно работать, в моем роутере mbedtls quic не умеет, надо собирать отдельно с явной поддержкой.
Stanner Автор
26.11.2023 08:36Да, надо попробовать на моем кинетике, там только через Entware, правда, это возможно
RoundRobin
26.11.2023 08:36+1Спасибо за статью, как раз в дополнение с 3X-UI c Shadowsocks-2022 и VLESS-Realty (боевая система) и X-UI/Marzban (там все остальное для тестов всякие Trojan, VMESS и пр. с gRPC / Websockets / mKCP транспортами) хотел поиграться c Hiddify-Manager и Hysteria2.
Но какие плюсы по сравнению с SS-2022 в РФ?
QUIC массово блокируется, а с доп. обфускацией OBFS теряется сам смысл - выглядит так же, шифрованный поток данных, непохожий ни на что.
И недавние события в Дагестане, показали, что такое полностью блокируют (там блокировали только TCP, но и с UDP провернуть это несложно).По скорости / загрузке на слабом железе есть приемущества?
Пока остановился на XRay с SS-2022 и Realty для боевого применения, в планах еще вебсокеты через CDN добавить.
UPD. С сертификатами у них очень удобно сделано из коробки, в 3X-UI хотели подобное сделать, но там свой путь.
А домены можно по 0.55 в regway брать в неограниченных количествах (и крипту и карты РФ и ЯД принимают), дешевле нигде не видел.
RoundRobin
26.11.2023 08:36@Stanner это тонкий намек, что странно бороться с блокировками в РФ, но советовать покупать домены в РегРу.
В компании, которая:
с некоторых пор принадлежит специально назначенному порулить доменами Рунета самизнаетекем человеку;
всячески поддерживает "суверенитезацию" интернета, обязательный СОРМ для РФ хостеров с 1 декабря (а другой рукой рассылает им предложения купить их бизнес за копейки, пока не поздно) и пр.;
успех бизнеса которой и при старых владельцах напрямую был связан с ЕР и которая использовала админресурс в бизнесе.
Stanner Автор
26.11.2023 08:36QUICK у меня cейчас чаще всего работает (проверяю на https://quic.nginx.org/quic.html, например)
Будут блокировки QUICK - включим обфускацию и проброс портов (port hopping) с большим диапазоном.
Ну и другие протоколы нам в помощь, не будем держать все яйца в одной корзине ;)По регистрации - подправил, когда разбираться начал с Hysteria - зарегистрировал по быстрому просто для тестов. Если делать по правильному - то нужно и VPS, и домен офорлять анонимно на зарубежных сайтах.
Renaissance
не нужны никакие дополнительные acme.sh, hysteria2 уже имеет в своем составе встроенный ACME клиент (о его конфигурации ниже же и написано), абсолютно нет смысла дублировать функционал.
Все что нужно для получения сертификата, это секция "acme" в конфигурации и открытый порт 443/tcp (дефолтный, изменяемый). Для российских доменов нужно изменить параметр ca на letsencrypt, т.к. zerossl отказывается выдавать сертификаты на российские домены (RU точно).
в этом блоке 2 типа аутентификации вообще указаны. command это отдельный 3 тип.
Для port hopping при использовании nftables можно использовать redirect в таблице nat, типа такого (при условии что hysteria2 запущена на дефолтном 443 порту и нет разделения на ip4/ip6):
udp dport 20000-50000 redirect to 443
судя по вопросам на GitHub, указать можно несколько, но использоваться будет только первый, а в случае его недоступности будет использован системный DNS (также он будет использоваться если не задавать dns в конфигурации вообще).
Ну в итоге Hysteria2 выглядит неплохо, работает тоже неплохо.
Но нужен незаблокированный провайдером QUIC (обходится использованием obfs) и лучше всего свой домен на который можно получать сертификат LE, иначе будут пляски с добавлением самоподписанных в доверенные.
РКН баловался блокировкой QUIC точно, блокировал все по белым спискам (vk.com в нем), дают ли еще где-то бесплатно домены - вопрос открытый.