- ACME TLS challenge on 443 (no port 80 or nginx decoy) - Auto-generate and persist obfs password per server - Update client export, HTML catalog, and vault examples - Document Salamander vs main and ACME auto-renewal in README
Hysteria2 Ansible — ветка Salamander
Ветка:
salamander
Режим: обфускация Salamander (без masquerade-сайта nginx)
Основная веткаmain: masquerade под HTTPS-сайт — см. другую ветку
Ansible-роль для установки Hysteria 2 на Debian/Ubuntu VPS с Salamander obfs — запутывание пакетов для обхода DPI, когда masquerade под «обычный сайт» недостаточен.
Чем Salamander отличается от main
main (masquerade) |
salamander (эта ветка) |
|
|---|---|---|
| Маскировка | HTTPS-сайт nginx + Let's Encrypt | Salamander obfs — пакеты выглядят как шум |
| Порт 80/tcp | Нужен (ACME HTTP + masquerade) | Не нужен |
| ACME | type: http |
type: tls (TLS-ALPN на 443) |
| Сайт-заглушка | /var/www/masq |
Нет |
| Obfs-пароль | — | Обязателен (один на сервер) |
| URI клиента | hysteria2://user:pass@domain:443 |
+ obfs=salamander&obfs-password=... |
| Лучше когда | Нужен «легитимный» сайт в браузере | Агрессивный DPI, блокировка QUIC fingerprint |
Быстрый старт
git clone https://git.antropoff.ru/DevOpsTools/hysteria2.git
cd hysteria2
git checkout salamander
make init
# отредактировать inventory/hosts.yml, group_vars/all.yml, vault
make vault-encrypt
make ping
make install # → output/index.html откроется в браузере
Makefile
| Команда | Описание |
|---|---|
make init |
Создать конфиги из .example |
make ping |
Проверить SSH к VPS |
make install |
Установка Salamander + экспорт URL/QR/HTML |
make update |
Обновить бинарник, конфиг, перевыпустить экспорт |
make export |
Только экспорт (URL, QR, HTML) |
make uninstall |
Удалить Hysteria2 с VPS |
make vault-encrypt |
Зашифровать vault |
make install LIMIT=vps-de
make update EXTRA_VARS='hysteria2_wait_for_acme=false'
make install EXTRA_VARS='hysteria2_open_browser=false'
Inventory
all:
children:
hysteria2_servers:
hosts:
vps-de:
ansible_host: 203.0.113.10
ansible_port: 2222 # SSH-порт (если не 22)
ansible_user: root
ansible_password: "{{ vault_ssh_passwords['vps-de'] }}"
hysteria2_domain: vpn-de.example.com # для TLS/SNI и ACME
hysteria2_users:
- my
- friend
SSH (VPS)
# group_vars/hysteria2_servers/vault.yml
vault_ssh_passwords:
vps-de: "root-password"
Пароли VPN и Salamander obfs тоже можно хранить в vault — см. ниже.
Как работает Salamander в этом проекте
Сервер (/etc/hysteria/config.yaml)
listen: 0.0.0.0:443
acme:
type: tls # сертификат без порта 80
domains:
- vpn-de.example.com
email: admin@example.com
auth:
type: userpass
userpass:
my: "..."
friend: "..."
obfs:
type: salamander
salamander:
password: "общий_obfs_пароль_сервера"
Клиент (генерируется автоматически)
server: vpn-de.example.com:443
auth: my:password
obfs:
type: salamander
salamander:
password: общий_obfs_пароль_сервера
URI (пример)
hysteria2://my:password@vpn-de.example.com:443?obfs=salamander&obfs-password=OBFS_PASS#my
Роль вызывает hysteria share — URI и QR уже содержат параметры Salamander.
Пароли
VPN-пользователи (userpass)
- Vault:
vault_hysteria2_user_passwords - Inventory:
hysteria2_user_passwords - Авто:
pwgen -s 40
Salamander obfs (один на сервер)
- Vault (рекомендуется):
vault_hysteria2_obfs_passwords:
vps-de: "cry_me_a_r1ver_salamander_obfs"
Подключается через group_vars/hysteria2_servers/vars.yml:
- Авто:
pwgen -s 32при первой установке - При update: загружается из
output/<server>/server-info.yml
Важно: obfs-пароль на сервере и клиенте должен совпадать. При
make updateбез vault пароль сохраняется из предыдущего экспорта.
Let's Encrypt — обновление сертификата
Да, Hysteria2 обновляет сертификат автоматически.
При acme: в конфиге встроенный ACME-клиент Hysteria2 сам получает и продлевает сертификат Let's Encrypt (срок ~90 дней). Перезапуск ansible для продления не нужен — процесс hysteria-server делает это сам (подтверждено maintainer проекта).
Условия для авто-продления:
- Сервер запущен и доступен из интернета
- Домен по-прежнему указывает на IP VPS
- Порт 443 открыт (для
acme type: tls— TLS-ALPN challenge) - Конфиг
acmeне удалён
Проверка логов: journalctl -u hysteria-server -f
Firewall
Открываются только порты Hysteria2 (по умолчанию 443/tcp и 443/udp).
Порт 80 не используется — в отличие от ветки main.
Результат: папка output/
output/
├── index.html ← все серверы (открывается в браузере)
├── vps-de/
│ ├── index.html ← страница сервера + obfs-пароль
│ ├── my.url ← URI с obfs=salamander
│ ├── my.png ← QR
│ ├── my.txt
│ └── server-info.yml ← mode, obfs_password, users
└── vps-nl/
└── ...
HTML-страницы показывают:
- режим Salamander
- obfs-password с кнопкой копирования
- пароль и URL каждого пользователя
- QR-коды
Переменные
| Переменная | Где | Описание |
|---|---|---|
hysteria2_mode |
defaults | salamander (информативно) |
hysteria2_domain |
host | Домен для TLS/SNI/ACME |
hysteria2_users |
host | VPN-пользователи |
hysteria2_acme_email |
group | Email Let's Encrypt |
hysteria2_obfs_password |
host/vault | Пароль Salamander (или авто) |
hysteria2_obfs_password_length |
group | Длина автопароля obfs (32) |
hysteria2_listen_port |
group | Порт (443) |
hysteria2_open_browser |
group | Открыть output/index.html |
vault_hysteria2_obfs_passwords |
vault | obfs-пароли по серверам |
Когда выбирать эту ветку
Используйте salamander, если:
- masquerade из
mainблокируют или «палят» по fingerprint - не нужен фейковый сайт в браузере
- готовы хранить дополнительный obfs-пароль
Используйте main, если:
- нужен «нормальный» HTTPS-сайт при проверке домена
- достаточно маскировки под nginx
- хотите минимум параметров в URI
Безопасность
output/содержит пароли, obfs-ключи и URL — не коммититьmake vault-encryptобязателен послеmake init- Salamander не делает вас невидимым: IP VPS и постоянный UDP-поток всё ещё можно анализировать
Требования
- Ansible 2.14+
- Debian/Ubuntu VPS
- Домен с A-записью на IP (для ACME TLS)
- Клиент Hysteria2 с поддержкой Salamander (Shadowrocket, NekoBox, Hiddify и др.)
Структура роли
roles/hysteria2/
├── tasks/
│ ├── obfs.yml ← генерация/загрузка obfs-пароля
│ ├── configure.yml ← без masquerade, только Salamander
│ └── export_global.yml ← общий output/index.html
└── templates/
├── config.yaml.j2 ← acme tls + obfs salamander
└── client.yaml.j2 ← клиент с obfs
Переключение между ветками
git checkout main # masquerade + nginx
git checkout salamander # Salamander obfs
Конфиги на уже установленном сервере не меняются при переключении ветки в git — нужен make install или make update на целевой ветке (это перекатит конфиг сервера).