Files
Wireguard_server/README.md

331 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 сервера.
При объявлении сетей за клиентом скрипт автоматически включает `ip_forward` и добавляет правила `iptables` (forward + nat) через `PostUp/PostDown`.
### 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
```