В сети есть множество гайдов об установке и настройке прокси-протокола Hysteria 2 с панелями и без. Мы углубимся в самую пучину системного администрирования, разберем работу с исполняемыми файлами, открытыми/закрытыми портами, SSH-ключами и безопасностью. Руководство универсально, написано сверху вниз и рассчитано на новичков и тех, кто интересуется темой CLI в Linux; вместо Hysteria 2 подставьте Nginx, и суть мало поменяется. Перед настройкой проверьте требования законодательства, правила провайдера и внутренние политики вашей организации. Без лишних слов начнем.
Нам нужно приобрести VPS с виртуализацией KVM, пускай это будет нулевым шагом. Где и как каждый решает сам, я не буду тут оставлять реферальную ссылку своего хостера. Главное, на что смотреть, — это на выдачу статического IPv4-адреса, остальное слабо влияет. Если VPS уже есть, переходим к ней.
Гайд рассчитан на семейство дистрибутивов Debian/Ubuntu, если раскатка идет на RHEL-подобных AlmaLinux и т. д., мысленно замените apt update/install на dnf update/install.
Заходим на наш сервер по выданному паролю от хостера:
ssh root@ip_addres
При первом подключении SSH запросит создание отпечатка ключа сервера, нажмите yes, далее потребуется пароль. Скопируйте его из письма или панели управления хостера в терминал. Чаще всего всё работает без проблем. Если вы не вошли, скорее всего, VPS еще не развернулась либо порт 22 закрыт провайдером.
ВАЖНО!!!
Создаем на своем локальном ПК пару из приватного и публичного SSH-ключа с помощью утилиты в составе SSH — ssh-keygen:
ssh-keygen -t ed25519
После ввода парольной фразы (по желанию) в папке, где был открыт терминал, появятся файлы ed25519 и ed25519.pub. Открываем файл ed25519.pub, копируем всё его содержимое, переходим к терминалу с открытым SSH и вводим на нашей VPS:
mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "скопированное содержимое из ed25519.pub" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
Чтобы боты не взломали нас, нужно отредактировать конфиг sshd_config.
Открываем его с помощью nano:
nano /etc/ssh/sshd_config
и меняем параметры:
PasswordAuthentication yes -> no PermitEmptyPasswords yes -> no
Выходим из nano с сохранением изменений и перезапускаем сервис sshd:
systemctl restart ssh # иногда может быть sshd
Обязательная часть была закончена. Если всё правильно сделано, вас выкинет из сессии SSH, либо пишем exit и пытаемся использовать наш ключ для входа:
ssh -i /путь/к/нашему/приватному/ключу/ed25519 root@ip_addres # пароль больше не сработает, будет требование приватного ключа, т. е. все боты/сканеры/брутеры мимо.
Далее всё стандартно, как в обычном дистрибутиве Linux: обновляем базу пакетов, ставим ufw и wget, производим скачивание Hysteria 2 с официального репозитория на GitHub с помощью wget:
wget https://github.com/HyNetworks/hysteria/releases/latest/download/hysteria-linux-amd64
По стандарту наш исполняемый файл скачается в папку ~/root, для удобства перемещаем его оттуда в /usr/local/bin.
Чтобы файл стал исполняемым, ставим на нем маркер:
chmod +x /usr/local/bin/hysteria-linux-amd64
Про сам исполняемый файл
Исполняемый код Hysteria 2 написан на Go, по умолчанию компилятор Golang делает статическую линковку, что удобно и снимает ограничения на совместимость с системными библиотеками. Ему без разницы, где работать: на старом Debian 10 или на свежем Arch Linux; главное — открытые порты и ядро Linux не ниже 5.4 для правильной работы алгоритма Brutal BBR.
Второй по значимости шаг — настройка самой Hysteria 2. В отличие от веб-панелей, мы будем рассматривать пару «сервер — клиент» без динамического содержимого. В последних версиях программы добавили обработку конфигов в более наглядном формате .toml. Hysteria 2 сама по себе умеет работать с форматами .json, .yaml, .toml; если вам нужен строго один из них, есть конвертер yq.
У нашей подопытной на серверной стороне есть два различных по сути и несовместимых режима работы masquerade и два режима шифрования трафика gecko/salamander на выбор. Режим masquerade применяется только к серверу и работает схоже по принципу с Xray Reality, только на QUIC-потоке вместо TCP. С шифрованием всё неоднозначно: если алгоритм salamander, простой xor + BLAKE2b, превращает весь ваш трафик в нечитаемый математический мусор по паролю, то gecko — новая имплементация. Он всё еще экспериментален и по сути является надстройкой над salamander, цель которой — убрать специфическое рукопожатие в 1200 байт оригинала, внедрить фрагментацию служебных пакетов и паддинг трафика. Далее будет рассмотрено использование алгоритма salamander как наиболее простого в настройке.
шаг 1: серверная часть
На данный момент наш сервер висит в сети всеми портами сразу; многие гайды с красивыми панелями (или ЫЫ) именно этот момент не расписывают. На нашем сервере единственный, кто принимает трафик, — это Hysteria 2 на 443-м порту по UDP. Чтобы сервер не привлекал внимание сканеров и ботов со всей сети, мы ограничим доступные на вход порты с помощью утилиты ufw. Нам нужны порт 22 на TCP и порт 443 на UDP. Входные порты ограничены, выход свободен:
ufw default deny incoming ufw default allow outgoing ufw allow in 22/tcp ufw allow in 443/udp # включаем файрволл и жмем да, нас может выкинуть из сессии ssh ufw enable
про udp и tcp порты
с точки зрения ядра операционной системы это разные сущности, две разные программы могут иметь один порт и слушать их одновременно.
Стандарт QUIC требует сертификата для работы вне зависимости от конфига. Его можно добыть через Let's Encrypt, купить или сгенерировать самому самоподписанный сертификат. В нашем случае нет маскировки, с сертификатом можно не усердствовать, генерируем его в папке /etc/hysteria:
mkdir /etc/hysteria openssl req -x509 -nodes -newkey rsa:2048 \ -keyout /etc/hysteria/server.key \ -out /etc/hysteria/server.crt \ -days 3650 \ -subj "/CN=enter your gecko now" chmod 644 /etc/hysteria/server.crt chmod 600 /etc/hysteria/server.key
Собираем нашу server-side конфигурацию в /etc/hysteria/config.toml:
listen = ":443" [tls] cert = "/etc/hysteria/server.crt" key = "/etc/hysteria/server.key" [auth] type = "password" password = "sad river" [obfuscation] type = "salamander" [obfuscation.salamander] password = "sea by the river"
У нас нет удобных скриптов автоустановки, systemd-юниты или автозагрузку через инит нужно писать самому. Простой юнит systemd для автозапуска в случае падения или перезагрузки создаем в папке /etc/systemd/system:
[Unit] Description=Hysteria.Service After=network.target [Service] ExecStart=/usr/local/bin/hysteria-linux-amd64 server -c /etc/hysteria/config.toml Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target
Осталось его применить и запустить с помощью systemctl:
systemctl enable --now hysteria
шаг 2: клиентская часть
Собираем нашу client-side конфигурацию:
server = "ip address:443" auth = "sad river" [tls] insecure = true pinSHA256 = "cert hash" [obfuscation] type = "salamander" [obfuscation.salamander] password = "sea by the river" [socks5] listen = "local ip address:port"
Чтобы предотвратить MITM-атаку из-за нашего самоподписанного сертификата, параметр pinSHA256 обязателен к заполнению! Хеш (в формате hex) от нашего сертификата нужно сгенерировать на сервере:
openssl x509 -noout -fingerprint -sha256 -in /etc/hysteria/server.crt # скопируйте из терминала вывод A5:3E:2F... с ssh в pinSHA256
Для подключения скачиваем точно такую же Hysteria для Windows/macOS/Linux себе на ПК. Запуск схож с серверной частью:
hysteria-windows-amd64.exe client -c /path/to/config/client-config.toml
Итого: в результате у нас получился не VPN-сервис с общей учетной записью, а собственный личный сервер. Настройка крайне сложная и не масштабируется, но взамен дает меньшее количество уязвимостей, понимание работы протоколов и базовые понятия сетевой гигиены.
Если вам нужна помощь в настройке или вы нашли ошибку в конфигах и тексте, напишите мне в личные сообщения. Помогу чем смогу.