feat: автоматизация установки и настройки WireGuard сервера и клиента

This commit is contained in:
Ruslan
2026-04-14 00:04:06 +03:00
commit a31f1a1090
8 changed files with 1416 additions and 0 deletions

271
README.md Normal file
View File

@@ -0,0 +1,271 @@
# WireGuard Server + Client Automation
Проект автоматизирует установку и настройку WireGuard-сервера и WireGuard-клиента на Debian/Ubuntu.
Основная идея: один репозиторий с понятными Bash-скриптами, которые можно повторно запускать без бессмысленной поломки уже существующей конфигурации.
## Назначение проекта
- Быстро развернуть WireGuard-сервер (`wg-quick@wg0`) с автозапуском через `systemd`.
- Включить IP forwarding и NAT для выхода клиентов в интернет через сервер.
- Установить легкий GUI для управления (`wireguard-ui` в Docker).
- Автоматизировать добавление клиента с клиентской машины через SSH на сервер.
- Поддержать 2 режима маршрутизации клиента:
- полный туннель (весь трафик через VPN)
- выборочный туннель (только заданные сети)
## Поддерживаемые ОС
- Debian 11/12
- Ubuntu 22.04/24.04
Скрипты ориентированы на Debian-family (APT, systemd).
## Структура проекта
- `README.md`
- `.gitignore`
- `lib/common.sh` — общие функции
- `templates/wg0.conf.template` — шаблон базового `wg0.conf`
- `server/install_server.sh` — установка сервера + GUI
- `server/wg-peerctl.sh` — helper для регистрации peer на сервере
- `client/install_client.sh` — установка и автонастройка клиента
## Архитектура решения
- Сервер разворачивается нативно на `wg-quick` + `systemd` (стабильность после reboot).
- GUI (`wireguard-ui`) запускается в Docker, но работает с тем же `/etc/wireguard`, где лежит серверный конфиг.
- Клиентский скрипт:
1. генерирует ключи локально,
2. подключается к серверу по SSH,
3. вызывает `/usr/local/sbin/wg-peerctl add ...`,
4. получает параметры подключения,
5. пишет локальный `/etc/wireguard/wg0.conf`,
6. запускает и включает `wg-quick@wg0`.
## Почему выбран GUI `wireguard-ui`
- Легкий для VPS (один контейнер).
- Понятный веб-интерфейс.
- Не требует переносить основной WireGuard в Docker: VPN остается в нативном `systemd`.
- Проще обслуживание: серверная сеть и NAT остаются под полным контролем Bash-скрипта.
## Какие пакеты устанавливаются
### Сервер
- `wireguard`, `wireguard-tools`
- `iproute2`, `iptables`
- `curl`, `ca-certificates`, `openssl`, `qrencode`
- `docker.io`, `docker-compose-plugin`
### Клиент
- `wireguard`, `wireguard-tools`
- `iproute2`
- `openssh-client`, `sshpass`
- `ca-certificates`
## Установка сервера
1. Клонировать/открыть репозиторий.
2. Запустить:
```bash
sudo bash server/install_server.sh
```
Скрипт интерактивно спросит недостающие данные:
- публичный IP (если не определился автоматически)
- порт WireGuard
- параметры GUI (логин/пароль)
### Non-interactive пример
```bash
sudo bash server/install_server.sh \
--non-interactive \
--wg-interface wg0 \
--wg-port 51820 \
--wg-network 10.66.66.0/24 \
--wg-address 10.66.66.1/24 \
--server-public-ip 203.0.113.10 \
--default-iface eth0 \
--gui-enable yes \
--gui-host vpn.example.com \
--gui-port 5000 \
--gui-user admin \
--gui-password 'StrongPass123!'
```
## Установка клиента
Запускать на клиентской машине:
```bash
sudo bash client/install_client.sh
```
Скрипт попросит:
- адрес сервера
- SSH-учетные данные
- режим маршрутизации (full/split)
- список сетей (если `split`)
### Non-interactive пример (SSH-ключ)
```bash
sudo bash client/install_client.sh \
--non-interactive \
--server-host 203.0.113.10 \
--server-user root \
--ssh-auth key \
--mode full \
--client-name laptop-01
```
### Non-interactive пример (SSH-пароль)
```bash
sudo bash client/install_client.sh \
--non-interactive \
--server-host 203.0.113.10 \
--server-user root \
--ssh-auth password \
--ssh-password 'your_password' \
--mode split \
--allowed-ips 10.0.0.0/8,192.168.0.0/16 \
--client-name laptop-02
```
## Как создаются ключи
- Сервер: `/etc/wireguard/server_private.key` и `/etc/wireguard/server_public.key`.
- Клиент: `/etc/wireguard/wg0_client_private.key`, `..._public.key`, `..._psk.key`.
- Повторный запуск не перегенерирует ключи без необходимости.
## Как задаются маршруты
Клиентский скрипт поддерживает режимы:
1. `full``AllowedIPs = 0.0.0.0/0,::/0`
2. `split``AllowedIPs` задается списком сетей
Для `full` добавляется route-exception до IP WireGuard-сервера, чтобы не потерять SSH/доступ при переключении default route.
## Как включается автозапуск
Используется `systemd`:
- Сервер: `wg-quick@wg0.service`
- Клиент: `wg-quick@wg0.service`
Скрипты выполняют `systemctl enable --now ...`.
## Как открыть GUI
После установки сервера GUI доступен по адресу:
```text
http://<GUI_HOST>:<GUI_PORT>
```
Пример:
```text
http://203.0.113.10:5000
```
Логин/пароль задаются во время установки сервера.
## Взаимодействие клиента с сервером
- Клиент генерирует локальные ключи.
- Клиент по SSH вызывает на сервере `wg-peerctl add`.
- Серверный helper:
- выделяет IP клиенту внутри VPN-сети,
- добавляет peer идемпотентно,
- применяет конфиг,
- возвращает параметры подключения.
- Клиент собирает локальный `wg0.conf`, запускает интерфейс и автозапуск.
## Примеры использования
### Проверка статуса на сервере
```bash
sudo systemctl status wg-quick@wg0
sudo wg show
```
### Ручное добавление peer через helper
```bash
sudo /usr/local/sbin/wg-peerctl add \
--client-name test-client \
--client-public-key '<client_pub_key>'
```
### Проверка клиента
```bash
sudo wg show
ip route
curl -4 ifconfig.me
```
## Безопасность и ограничения
- Приватные ключи не пишутся в лог.
- Конфиги и ключи сохраняются с ограниченными правами (`600`).
- Перед перезаписью конфигов делаются backup-файлы.
- SSH по паролю поддержан, но менее безопасен, чем SSH-ключи.
- В non-interactive режиме пароль в командной строке может попасть в shell history — лучше использовать SSH-ключ.
- Скрипты предполагают root-доступ на сервере для изменения `/etc/wireguard` и `systemd`.
- GUI запускается без TLS по умолчанию (HTTP). Для production рекомендуется ставить reverse proxy (Nginx/Caddy) с HTTPS и ограничением доступа.
## Диагностика и устранение проблем
1. WireGuard не поднялся:
```bash
sudo systemctl status wg-quick@wg0
sudo journalctl -u wg-quick@wg0 -n 100 --no-pager
sudo wg show
```
2. Не работает интернет у клиента:
```bash
ip route
sudo wg show
```
Проверьте `AllowedIPs`, `ip_forward`, NAT и внешний интерфейс сервера.
3. Клиент не добавляется по SSH:
- Проверьте доступность SSH (`ssh user@server`).
- Проверьте, что на сервере установлен helper:
```bash
ls -l /usr/local/sbin/wg-peerctl
```
4. GUI недоступен:
```bash
sudo docker ps
sudo docker logs wireguard-ui --tail=100
sudo ss -tulpn | grep 5000
```
## Важные пути
- Серверный конфиг: `/etc/wireguard/wg0.conf`
- Метаданные сервера: `/etc/wireguard/wg-meta.env`
- Клиентский конфиг: `/etc/wireguard/wg0.conf`
- Server install log: `/var/log/wireguard-server-install.log`
- Client install log: `/var/log/wireguard-client-install.log`
- Peer helper log: `/var/log/wireguard-peerctl.log`
## Справка по ключам
```bash
bash server/install_server.sh --help
bash client/install_client.sh --help
```