Простой web-интерфейс для VPN-wireguard с возможностью как использовать уже созданные конфиги, так и настраивать свои.
- Добавление и удаление клиентов через web-интерфейс, сразу с предпросмотром QR-кода
- Отслеживание статуса в интерфейсе
- Перезагрузка Wireguard через web-интерфейс
- Работа с несколькими
.conf-файлами (интерфейсами) - Максимально простой веб-интерфейс, написан на чистом JS без фреймворков, можно править всё что необходимо прямо на месте
- Ротация проверочного кода на фронте (в репозитории больше нет захардкоженных секретов)
- Секреты клиентов (приватные ключи и PSK) шифруются перед сохранением в
.data/peers.json - Не использует никакие базы данных (данные хранятся в JSON)
- Для применения конфига (например после добавления клиента) требуется перезагрузка Wireguard
- Требует установленной NodeJS, а также, желательно PM2, чтобы поддерживать автоматический перезапуск
Для работы нужен сам Wireguard и NodeJS. Гайд ниже для Ubuntu.
sudo apt install wireguardСамый простой способ установить NodeJS нужной версии это NVM. Данный проект тестировался на NodeJS v.20.10, но вероятно будет работать и на более старых версиях (вероятно на 12-й работать должен), поэтому можете попробовать просто поставить NodeJS через apt. Далее пример команд для установки NVM:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrcПроверить, что nvm установлен можно командой nvm -v. После этого ставим рекомендуемую версию ноды:
nvm install 20.10.0Клонирем репозиторий в удобную вам папку (здесь для примера это /var/@gratio/wg):
git clone https://github.com/Gratio-tech/WireguardControl.git /var/@gratio/wgПереходим в созданную папку и устанавливаем зависимости:
cd /var/@gratio/wg
npm i
npm run buildПереходим в ранее созданную папку и запускаем сервер:
cd /var/@gratio/wg
npm run startНе забудьте указать свои настройки в файле config.example.json (при первом запуске он будет переименован в config.json). Вам следует указать ваш дефольный WG-интерфейс и добавить IP вашего сервера (в сети VPN) в allowedOrigins. Также убедитесь, что webServerPort, используемый этим сервером по умолчанию (8877), открыт в брандмауэре (если у вас включена блокировка портов).
ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ ВСЕ КЛЮЧИ ПО УМОЛЧАНИЮ!
Вы можете сгенерировать себе случайный ключ прямо в bash, например следующими способами:
# C помощью openssl:
openssl rand -base64 16
# C использованием /dev/urandom и base64:
head -c 16 /dev/urandom | base64Либо выполните в консоли разработчика в браузере, открыв веб-интерфейс Wireguard Control:
// Библиотека forge используется в public\index.html для шифрования
forge.util.encode64(forge.random.getBytes(16));Далее следует добавить скрипт сервера в автозагрузку. Есть несколько способов сделать это, но самый удобный и простой это воспользоваться инструментом pm2, он, помимо прочего, позволяет распараллеливать нагрузку, а также следить за потреблением памяти.
npm install pm2 -g
cd /var/@gratio/wg && pm2 start demon.json --watch --ignore-watch="node_modules"
pm2 startup
pm2 saveТеперь для мониторинга состояния сервера достаточно запустить pm2 monit.
Файл config.json (создаётся из config.example.json при первом запуске) содержит следующие поля:
| Ключ | Описание |
|---|---|
defaultInterface |
Имя интерфейса (без .conf), который выбирается по умолчанию |
frontServerPort |
Порт, на котором слушает Express-сервер |
allowedOrigins |
Список разрешённых origin для CORS |
frontendPasskey |
Ключ, которым шифруются ответы API (нужно вводить на фронте) |
dns |
Массив DNS-серверов, которые попадут в сгенерированные конфиги клиентов |
clientEncryptionPass |
Пароль для AES-шифрования приватных ключей в .data/peers.json |
runtimeRotationMinutes |
Интервал ротации проверочного скрипта public/assets/runtime.js |
Проект можно установить и обновлять через NPM. Это упрощает развёртывание и обновление:
# Глобальная установка
npm install -g @gratio/wg
# Создайте папку для проекта и перейдите в неё
mkdir /var/@gratio/wg
cd /var/@gratio/wg
# Инициализируйте проект (копирует необходимые файлы)
@gratio/wg init
# Отредактируйте config.json
# ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ ВСЕ КЛЮЧИ ПО УМОЛЧАНИЮ!
nano config.json
# Запустите сервер
@gratio/wg serveКоманда @gratio/wg init копирует в текущую директорию:
public/— статические файлы веб-интерфейсаconfig.example.json— пример конфигурацииdemon.json— конфиг для PM2
После инициализации все команды выполняются из этой директории. Сервер автоматически создаст папку .data для хранения информации о клиентах.
@gratio/wg init # Инициализация проекта (копирует файлы в текущую директорию)
@gratio/wg serve # Запуск сервера
@gratio/wg init-config # Создаёт config.json из config.example.json (если его ещё нет)
@gratio/wg help # Справка по командамnpm install pm2 -g
cd /var/@gratio/wg
pm2 start demon.json
pm2 startup
pm2 saveФайл demon.json уже настроен для работы с глобально установленным пакетом.
Дополнительные данные о клиентах хранятся в .data/peers.json. В JSON помимо имени и IP есть зашифрованные поля secretKey и presharedKey. Расшифровать их можно только зная clientEncryptionPass из config.json. При загрузке Wireguard-Control ищет все доступные конфиги в /etc/wireguard, парсит и держит их в памяти, поэтому для чтения статуса не требуется постоянно обращаться к файлам.
Есть возможность задать директорию WireGuard на системе. Для этого следует перед запуском установить переменную среды WG_CONFIG_DIR=/path/to/wg с путём к WG.