Skip to content

Latest commit

 

History

History
155 lines (120 loc) · 9.31 KB

File metadata and controls

155 lines (120 loc) · 9.31 KB

Wireguard Control — Web-интерфейс для wireguard

Простой 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. Это упрощает развёртывание и обновление:

# Глобальная установка
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 для хранения информации о клиентах.

Доступные команды CLI

@gratio/wg init              # Инициализация проекта (копирует файлы в текущую директорию)
@gratio/wg serve             # Запуск сервера
@gratio/wg init-config       # Создаёт config.json из config.example.json (если его ещё нет)
@gratio/wg help              # Справка по командам

Запуск с PM2 (после установки через NPM)

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.

Дополнительно

Пример конфигурации Wireguard для корпоративной сети