314 lines
13 KiB
Markdown
314 lines
13 KiB
Markdown
# 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-скрипта.
|
||
- GUI не разрабатывается в этом проекте с нуля: используется готовый `wireguard-ui`, а проект автоматизирует его установку и настройку.
|
||
|
||
## Какие пакеты устанавливаются
|
||
|
||
### Сервер
|
||
|
||
- `wireguard`, `wireguard-tools`
|
||
- `iproute2`, `iptables`
|
||
- `curl`, `ca-certificates`, `openssl`, `qrencode`
|
||
- `docker.io` и один из пакетов: `docker-compose-plugin` или `docker-compose` (в зависимости от версии ОС/репозиториев)
|
||
|
||
### Клиент
|
||
|
||
- `wireguard`, `wireguard-tools`
|
||
- `iproute2`
|
||
- `openssh-client`, `sshpass`
|
||
- `ca-certificates`
|
||
|
||
## Установка сервера
|
||
|
||
1. Клонировать/открыть репозиторий.
|
||
2. Запустить:
|
||
|
||
```bash
|
||
sudo bash server/install_server.sh
|
||
```
|
||
|
||
### Запуск сервера одной командой (без `git clone`)
|
||
|
||
```bash
|
||
tmp="$(mktemp -d)" && curl -fL "https://git.ruslan.xyz/ruslan/Wireguard_server/archive/main.tar.gz" -o "$tmp/repo.tar.gz" && tar -xzf "$tmp/repo.tar.gz" -C "$tmp" && bash "$tmp/wireguard_server/server/install_server.sh"
|
||
```
|
||
|
||
Если GUI уже ранее запускался и нужно переинициализировать его дефолты (подсеть, endpoint, пользователь/пароль), добавьте:
|
||
```bash
|
||
--gui-reset-db yes
|
||
```
|
||
|
||
Скрипт интерактивно спросит недостающие данные:
|
||
- публичный IP (если не определился автоматически)
|
||
- порт WireGuard
|
||
- параметры GUI (логин/пароль)
|
||
|
||
Если пароль GUI не передан аргументом, скрипт генерирует случайный пароль из 8 символов, предлагает заменить его и, если не заменили, показывает этот пароль в итоговой сводке.
|
||
|
||
### 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
|
||
```
|
||
|
||
### Запуск клиента одной командой (без `git clone`)
|
||
|
||
```bash
|
||
tmp="$(mktemp -d)" && curl -fL "https://git.ruslan.xyz/ruslan/Wireguard_server/archive/main.tar.gz" -o "$tmp/repo.tar.gz" && tar -xzf "$tmp/repo.tar.gz" -C "$tmp" && sudo bash "$tmp/wireguard_server/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
|
||
```
|
||
|
||
Логин/пароль задаются во время установки сервера.
|
||
|
||
### Как получить QR для iPhone в GUI
|
||
|
||
1. Откройте GUI по ссылке из итоговой сводки установки.
|
||
2. Перейдите в раздел клиентов (`Clients`).
|
||
3. Создайте клиента (`New Client`) или выберите существующего.
|
||
4. Нажмите кнопку показа QR (или `Show QR`) у клиента.
|
||
5. На iPhone: WireGuard → `Add Tunnel` → `Create from QR code` и отсканируйте код.
|
||
|
||
В установщике уже задаются дефолты GUI для корректной генерации клиентских конфигов: endpoint, DNS, порт и путь к `wg0.conf`.
|
||
|
||
## Взаимодействие клиента с сервером
|
||
|
||
- Клиент генерирует локальные ключи.
|
||
- Клиент по 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
|
||
```
|
||
|
||
Если при запуске встречается ошибка `KeyError: 'ContainerConfig'` (обычно на legacy `docker-compose` v1), перезапустите установщик из актуальной версии репозитория: в нем добавлена автоматическая очистка старого контейнера `wireguard-ui` перед запуском.
|
||
|
||
Для уже сломанного состояния можно вручную очистить старые контейнеры и запустить установщик снова:
|
||
```bash
|
||
docker ps -aq --filter 'label=com.docker.compose.service=wireguard-ui' | xargs -r docker rm -f
|
||
docker ps -a --format '{{.Names}}' | grep -E '(^|[_-])wireguard-ui($|[_-])' | xargs -r docker rm -f
|
||
```
|
||
|
||
Если клиенты из GUI создаются в неправильной подсети (например `10.252.1.x` вместо вашей `10.66.66.x`), запустите установщик с `--gui-reset-db yes`, затем создайте клиента заново и пересканируйте QR.
|
||
|
||
Почему так бывает: `wireguard-ui` хранит глобальные настройки в своей БД. Если БД была создана ранее со старой подсетью, новые переменные окружения не всегда перезаписывают эти значения автоматически.
|
||
|
||
## Важные пути
|
||
|
||
- Серверный конфиг: `/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
|
||
```
|