Разворачивает личный VPN-сервер одной командой с вашего компьютера. Без панелей, без чужих облаков, без CI — только Ansible и чистый VPS.
Серверов может быть сколько угодно: каждый независим, ляжет один — остальные работают.
Important
Материал опубликован в научно-технических и образовательных целях — для ознакомления, а не для применения. Использование в иных целях может нарушать закон вашей страны; выяснить это до запуска — ваша задача. Всё, что вы развернёте, вы развернёте самостоятельно и на свой риск. Автор ничего не хостит, никому не предоставляет доступ и ответственности за использование этих материалов не несёт. Подробнее — DISCLAIMER.md.
Tip
Здесь только серверная часть. Клиентская — vpn-configurator.
Программа с графическим интерфейсом берёт .conf из админки wg-easy и делает из
него конфиг с раздельным туннелированием: в VPN уходят только выбранные сервисы,
остальной интернет идёт напрямую и не теряет скорость. Windows и macOS, готовые
наборы адресов для YouTube, Discord, Telegram и ещё десятка сервисов.
Каждый пункт разворачивается и выключается отдельно, независимо от соседей. Ставится только то, что включено — остальное на сервер даже не приезжает.
| Сервис | Зачем | Что нужно | По умолчанию |
|---|---|---|---|
| WireGuard (wg-easy) | обычный быстрый VPN, веб-админка с QR-кодами | только адрес сервера | включён |
| Reality (панель 3x-ui) | обход DPI: выглядит как обычный визит на чужой сайт | только адрес сервера | включён |
| Slipstream | DNS-туннель: работает там, где оператор пускает только белый список | свой домен | выключен |
| dnstt | второй DNS-туннель, для операторов, душащих поток UDP-ответов | свой домен + IPv6 | выключен |
| RustDesk | свой сервер удалённого доступа | ничего | выключен |
Плюс база на каждом сервере: swap, ufw, fail2ban, автообновления, закрытый по паролю SSH и страж, не дающий Docker случайно выставить порт наружу.
Что выбрать под свою ситуацию — короткий разбор в OPERATORS.md. Если коротко: обычная блокировка — Reality, белый список у мобильного оператора — DNS-туннель, всё остальное — WireGuard.
Сервер. Чистый VPS на Ubuntu или Debian с доступом по SSH под root.
Хватает самого дешёвого: 1 ядро, 1 ГБ памяти. Где брать и как проверить адрес
перед оплатой — HOSTING.md.
Компьютер, с которого разворачиваете. Ansible работает только из Linux или macOS — в Windows напрямую он не запускается. Варианты:
| Ваша система | Что делать |
|---|---|
| Windows 10/11 | поставить WSL — см. ниже, это 10 минут и один перезапуск |
| Linux | ничего, работает как есть |
| macOS | ничего, работает как есть |
Сам Ansible ставится в локальный .venv внутри репозитория, системный не трогается.
Нужны только python3 (3.10+), make, git и python3-venv.
WSL — это настоящий Linux внутри Windows, с общими файлами и без виртуальной машины. В PowerShell от администратора:
wsl --install -d Ubuntu-22.04Перезагрузиться, при первом запуске Ubuntu придумать имя пользователя и пароль.
Дальше все команды из этой документации выполняются внутри Ubuntu, а не в
PowerShell. Открыть её: меню «Пуск» → Ubuntu, либо wsl в терминале.
sudo apt update && sudo apt install -y git make python3-venvДержите репозиторий внутри домашнего каталога WSL (~/projects/...), а не на
диске C:: на смонтированных дисках Windows не работают права 0600, а
ssh-ключ с открытыми правами клиент отказывается использовать.
sudo apt install -y git make python3-venv # Debian, Ubuntu
brew install make # macOS, python3 уже естьgit clone https://github.com/Friskes/vpn-infra.git
cd vpn-infra
make init # окружение, ssh-ключ, инвентарь, пароли
make new-host NAME=vpn1 IP=203.0.113.10 # ваш сервер
make deploy # развернутьmake init делает всё разом: создаёт .venv с Ansible, генерирует ssh-ключ,
заводит инвентарь и придумывает случайные пароли для админок. Отвечать ни на
что не нужно.
Перед make deploy разложите на сервере публичный ключ — он печатается после
make init, лежит в keys/vpn-infra.pub. Проще всего вставить его в панели
хостера при создании VPS. Если сервер уже создан с root-паролем — впишите его в
vault этого сервера (make decrypt, поле vault_ssh_password в
host_vars/<имя>/vault.yaml, затем make encrypt) и поставьте sshpass
(sudo apt install sshpass). Ansible зайдёт по паролю один раз, дальше будет
ходить по ключу.
После развёртывания в artifacts/<сервер>/CONNECTION_INFO.md появится сводка:
куда подключаться, какие порты, как войти в админки. Пароли админок —
make show-secrets.
make ping # есть ли связь с серверами
make check # сухой прогон: что изменится, ничего не меняяСтавить всё сразу не нужно. Набор сервисов задаётся в
group_vars/all/vars.yaml одной строкой на сервис:
wireguard_enabled: true
xui_enabled: true # Reality
slipstream_enabled: false
dnstt_enabled: false
rustdesk_enabled: falseДля отдельного сервера то же самое переопределяется в его
host_vars/<имя>/vars.yaml. Выключенный сервис не просто пропускается: уже
поднятый гасится, а порт файрвол не откроет.
Обновить один сервис, не трогая остальные:
make deploy TAGS=wireguard # только WireGuard
make deploy TAGS=xui # только панель Reality
make deploy HOST=vpn1 TAGS=ssh # один сервис на одном сервереТеги совпадают с именами ролей: swap, common, ssh, docker, firewall,
fail2ban, wireguard, slipstream, dnstt, xui, rustdesk, summary.
| Файл | О чём |
|---|---|
| DISCLAIMER.md | зачем это выложено, кто за что отвечает, что не гарантируется |
| CLIENTS.md | какие приложения ставить на телефон и компьютер, и почему именно эти |
| HOSTING.md | где брать VPS, чем оплачивать, как проверить адрес до покупки |
| SERVER.md | эксплуатация: секреты, несколько серверов, переезд при блокировке, грабли |
| PROXY.md | Reality против DPI: панель, домен прикрытия, что ломает канал |
| TUNNEL.md | DNS-туннель: домен, подбор резолвера, выдача доступа, диагностика |
| OPERATORS.md | белые списки операторов: как отличить и что из обходов работает |
| MEASUREMENTS.md | полевые замеры: какой резолвер сколько даёт, что уже проверено |
| MEASURE.md | скрипты замеров и как ими пользоваться, чтобы цифры не врали |
Наглядно, по шагам, с картинками: как устроен DNS-туннель.
site.yaml # плейбук: какие роли и в каком порядке
Makefile # все команды
inventory/hosts.yaml # список серверов (создаётся из .example, не в git)
group_vars/all/ # общие настройки и общие секреты
host_vars/ИМЯ/ # настройки конкретного сервера (не в git)
keys/ # ssh-ключ проекта (не в git)
roles/ # swap, common, ssh, docker, firewall, fail2ban, wireguard,
# slipstream, dnstt, xui, rustdesk, summary, backup
tools/measure/ # скрипты замеров (см. MEASURE.md)
artifacts/ # ключи и сводки, снятые с серверов (не в git)
.vault-key # пароль от vault: не в git, не потерять
Всё, что относится к вашей установке — адреса, домены, пароли, ключи, — лежит в файлах, которых нет в репозитории. Форкнуть и прислать правку можно, не рискуя опубликовать свою инфраструктуру.
CI нет: всё проверяется на машине перед коммитом. Один раз поставьте хуки, дальше они работают сами.
make hooks # gitleaks, yamllint, ansible-lint, shellcheck, проверка секретов
pre-commit run --all-files # прогнать всё разом, не дожидаясь коммита- vpn-configurator — клиентская часть этого же набора: раздельное туннелирование для WireGuard, Amnezia, WireSock и NekoBox.
- SlipNet — Android-клиент DNS-туннелей, которым пользуются Slipstream и dnstt отсюда.
MIT.