Мы писали для своей сети что-то такое:
https://github.com/Gratio-tech/WireguardControl
Немного костыльно - приходится WG дёргать через вот spawn:
import { spawn } from 'child_process';
export const executeSingleCommand = (command: string, args: string[] = []): Promise<string> => {
return new Promise((resolve, reject) => {
const childProcess = spawn(command, args);
let stdoutData = '';
let stderrData = '';
childProcess.stdout.on('data', data => {
stdoutData += data.toString();
});
childProcess.stderr.on('data', data => {
stderrData += data.toString();
});
childProcess.on('close', code => {
if (code !== 0) {
reject(new Error(`executeSingleCommand failed with code ${code}: ${stderrData}`));
} else {
resolve(stdoutData.trim());
Но в целом всё неплохо работает. Единственный минус - приходится перезагружать руками после добавления клиента. Там как-то гиморно это решается по другому.