Skip to content

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

vpn-infra

Разворачивает личный 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.

Windows: подготовка WSL

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-ключ с открытыми правами клиент отказывается использовать.

Linux / macOS

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.

About

Личный VPN-сервер на чистом VPS одной командой: WireGuard, VLESS+Reality, DNS-туннели и RustDesk — каждый сервис отдельным выключателем

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages