330 lines
14 KiB
Markdown
330 lines
14 KiB
Markdown
# WireGuard Server + Client Automation
|
||
|
||
Проект автоматизирует установку и настройку WireGuard-сервера и WireGuard-клиента на Debian/Ubuntu.
|
||
|
||
Основная идея: один репозиторий с понятными Bash-скриптами для быстрого разворачивания и переустановки WireGuard-стека.
|
||
|
||
## Назначение проекта
|
||
|
||
- Быстро развернуть WireGuard-сервер (`wg-quick@wg0`) с автозапуском через `systemd`.
|
||
- Включить IP forwarding и NAT для выхода клиентов в интернет через сервер.
|
||
- Установить встроенный GUI для управления peer'ами и QR (`wg-admin-gui`) с хранением данных в SQLite.
|
||
- Автоматизировать добавление клиента с клиентской машины через SSH на сервер.
|
||
- Поддержать 2 режима маршрутизации клиента:
|
||
- полный туннель (весь трафик через VPN)
|
||
- выборочный туннель (только заданные сети)
|
||
|
||
## Поддерживаемые ОС
|
||
|
||
- Debian 11/12
|
||
- Ubuntu 22.04/24.04
|
||
|
||
Скрипты ориентированы на Debian-family (APT, systemd).
|
||
|
||
## Структура проекта
|
||
|
||
- `README.md`
|
||
- `.gitignore`
|
||
- `lib/common.sh` — общие функции
|
||
- `bootstrap/install_wg_install.sh` — установка короткой команды `wg-install`
|
||
- `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 (`wg-admin-gui`) работает поверх того же `/etc/wireguard`, где лежит серверный конфиг.
|
||
- Метаданные GUI хранятся в SQLite.
|
||
- На сервере ставится `wg-syncconf@wg0.path`: при изменении `/etc/wireguard/wg0.conf` конфиг автоматически применяется в живой интерфейс `wg0`.
|
||
- Клиентский скрипт:
|
||
1. генерирует ключи локально,
|
||
2. подключается к серверу по SSH,
|
||
3. вызывает `/usr/local/sbin/wg-peerctl add ...`,
|
||
4. получает параметры подключения,
|
||
5. пишет локальный `/etc/wireguard/wg0.conf`,
|
||
6. запускает и включает `wg-quick@wg0`.
|
||
Каждый запуск клиентского установщика сначала очищает старые клиентские ключи/конфиг выбранного интерфейса и поднимает клиента заново.
|
||
|
||
## Про GUI
|
||
|
||
- `wg-admin-gui` показывает клиентов, статус, трафик, роуты и важные скрипты.
|
||
- Поддерживает добавление peer и генерацию QR.
|
||
- Основной WireGuard остается нативным в `systemd` (`wg-quick@wg0`).
|
||
|
||
## Какие пакеты устанавливаются
|
||
|
||
### Сервер
|
||
|
||
- `wireguard`, `wireguard-tools`
|
||
- `iproute2`, `iptables`
|
||
- `curl`, `ca-certificates`, `openssl`, `qrencode`
|
||
- `python3`, `python3-venv`, `python3-pip` (для `wg-admin-gui`)
|
||
|
||
### Клиент
|
||
|
||
- `wireguard`, `wireguard-tools`
|
||
- `iproute2`
|
||
- `openssh-client`, `sshpass`
|
||
- `ca-certificates`
|
||
|
||
## Установка сервера
|
||
|
||
1. Клонировать/открыть репозиторий.
|
||
2. Запустить:
|
||
|
||
```bash
|
||
sudo bash server/install_server.sh
|
||
```
|
||
|
||
Важно: серверный установщик теперь всегда выполняет полный reset прошлого состояния (`/etc/wireguard` + данные GUI/SQLite) и поднимает всё заново.
|
||
|
||
### Запуск сервера одной командой (без `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"
|
||
```
|
||
|
||
### Короткая команда `wg-install` (установить один раз)
|
||
|
||
Из локального репозитория:
|
||
```bash
|
||
sudo bash bootstrap/install_wg_install.sh
|
||
```
|
||
|
||
После этого запуск сервера:
|
||
```bash
|
||
sudo wg-install
|
||
```
|
||
|
||
С аргументами тоже работает:
|
||
```bash
|
||
sudo wg-install --non-interactive --server-public-ip 203.0.113.10 --default-iface eth0
|
||
```
|
||
|
||
Установка `wg-install` без `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/bootstrap/install_wg_install.sh"
|
||
```
|
||
|
||
Скрипт интерактивно спросит недостающие данные:
|
||
- публичный IP (если не определился автоматически)
|
||
- порт WireGuard
|
||
- параметры GUI (логин/пароль)
|
||
|
||
Если пароль GUI не передан аргументом, скрипт генерирует случайный пароль из 8 символов. В интерактивном режиме можно ответить `y` и ввести новый пароль отдельным шагом или сразу ввести пароль в том же вопросе.
|
||
|
||
### 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
|
||
```
|
||
|
||
Важно: клиентский установщик теперь всегда выполняет reset старой конфигурации для выбранного интерфейса (`wg0` по умолчанию): удаляет клиентские ключи/конфиг и создает их заново.
|
||
|
||
### Запуск клиента одной командой (без `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`)
|
||
|
||
По умолчанию адрес интерфейса клиента пишется как `/24` (например `10.66.66.2/24`).
|
||
При необходимости можно изменить маску параметром `--client-address-prefix <1-32>`.
|
||
Если за клиентом есть локальная сеть (например `192.168.33.0/24`), передайте `--advertise-subnets 192.168.33.0/24`, чтобы сервер маршрутизировал эту сеть через клиента.
|
||
Если `--advertise-subnets` не задан, скрипт автоматически пытается определить LAN-сети клиента и объявить их на сервере.
|
||
В режиме `split`, если `--allowed-ips` не задан, скрипт автоматически использует сеть WG сервера.
|
||
|
||
### 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 \
|
||
--advertise-subnets 192.168.33.0/24 \
|
||
--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`.
|
||
- При каждом запуске серверного установщика серверные ключи создаются заново (так как выполняется полный reset).
|
||
|
||
## Как задаются маршруты
|
||
|
||
Клиентский скрипт поддерживает режимы:
|
||
|
||
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. Перейдите в раздел добавления peer.
|
||
3. Создайте клиента.
|
||
4. Используйте показанный QR или скачайте готовый `.conf`.
|
||
5. На iPhone: WireGuard → `Add Tunnel` → `Create from QR code` и отсканируйте код.
|
||
|
||
## Взаимодействие клиента с сервером
|
||
|
||
- Клиент генерирует локальные ключи.
|
||
- Клиент по 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 systemctl status wg-admin-gui --no-pager
|
||
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
|
||
bash bootstrap/install_wg_install.sh
|
||
```
|