feat: автоматизация установки и настройки WireGuard сервера и клиента
This commit is contained in:
271
README.md
Normal file
271
README.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user