# 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" ``` Скрипт интерактивно спросит недостающие данные: - публичный 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 ``` Скрипт попросит: - адрес сервера - 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://: ``` Пример: ```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 '' ``` ### Проверка клиента ```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 ```