В сети есть множество гайдов об установке и настройке прокси-протокола 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-сервис с общей учетной записью, а собственный личный сервер. Настройка крайне сложная и не масштабируется, но взамен дает меньшее количество уязвимостей, понимание работы протоколов и базовые понятия сетевой гигиены.

Если вам нужна помощь в настройке или вы нашли ошибку в конфигах и тексте, напишите мне в личные сообщения. Помогу чем смогу.

Комментарии (0)