Browse Source

improve wireguard helpers

pull/1356/head
Bernd Storath 11 months ago
parent
commit
065fc450df
  1. 31
      src/server/utils/WireGuard.ts
  2. 39
      src/server/utils/wgHelper.ts

31
src/server/utils/WireGuard.ts

@ -78,16 +78,15 @@ class WireGuard {
persistentKeepalive, persistentKeepalive,
}) => { }) => {
const client = clients.find((client) => client.publicKey === publicKey); const client = clients.find((client) => client.publicKey === publicKey);
if (!client) return; if (!client) {
return;
client.latestHandshakeAt = }
latestHandshakeAt === '0'
? null client.latestHandshakeAt = latestHandshakeAt;
: new Date(Number(`${latestHandshakeAt}000`)); client.endpoint = endpoint;
client.endpoint = endpoint === '(none)' ? null : (endpoint ?? null); client.transferRx = transferRx;
client.transferRx = Number(transferRx); client.transferTx = transferTx;
client.transferTx = Number(transferTx); client.persistentKeepalive = persistentKeepalive;
client.persistentKeepalive = persistentKeepalive ?? null;
} }
); );
@ -423,15 +422,15 @@ class WireGuard {
returnText += '\n# HELP wireguard_configured_peers\n'; returnText += '\n# HELP wireguard_configured_peers\n';
returnText += '# TYPE wireguard_configured_peers gauge\n'; returnText += '# TYPE wireguard_configured_peers gauge\n';
returnText += `wireguard_configured_peers{interface="wg0"} ${Number(wireguardPeerCount)}\n`; returnText += `wireguard_configured_peers{interface="wg0"} ${wireguardPeerCount}\n`;
returnText += '\n# HELP wireguard_enabled_peers\n'; returnText += '\n# HELP wireguard_enabled_peers\n';
returnText += '# TYPE wireguard_enabled_peers gauge\n'; returnText += '# TYPE wireguard_enabled_peers gauge\n';
returnText += `wireguard_enabled_peers{interface="wg0"} ${Number(wireguardEnabledPeersCount)}\n`; returnText += `wireguard_enabled_peers{interface="wg0"} ${wireguardEnabledPeersCount}\n`;
returnText += '\n# HELP wireguard_connected_peers\n'; returnText += '\n# HELP wireguard_connected_peers\n';
returnText += '# TYPE wireguard_connected_peers gauge\n'; returnText += '# TYPE wireguard_connected_peers gauge\n';
returnText += `wireguard_connected_peers{interface="wg0"} ${Number(wireguardConnectedPeersCount)}\n`; returnText += `wireguard_connected_peers{interface="wg0"} ${wireguardConnectedPeersCount}\n`;
returnText += '\n# HELP wireguard_sent_bytes Bytes sent to the peer\n'; returnText += '\n# HELP wireguard_sent_bytes Bytes sent to the peer\n';
returnText += '# TYPE wireguard_sent_bytes counter\n'; returnText += '# TYPE wireguard_sent_bytes counter\n';
@ -465,9 +464,9 @@ class WireGuard {
} }
} }
return { return {
wireguard_configured_peers: Number(wireguardPeerCount), wireguard_configured_peers: wireguardPeerCount,
wireguard_enabled_peers: Number(wireguardEnabledPeersCount), wireguard_enabled_peers: wireguardEnabledPeersCount,
wireguard_connected_peers: Number(wireguardConnectedPeersCount), wireguard_connected_peers: wireguardConnectedPeersCount,
}; };
} }
} }

39
src/server/utils/wgHelper.ts

@ -4,11 +4,17 @@ import type { System } from '~~/services/database/repositories/system';
export const wg = { export const wg = {
generateServerPeer: (client: Client) => { generateServerPeer: (client: Client) => {
const allowedIps = [
`${client.address4}/32`,
`${client.address6}/128`,
...(client.serverAllowedIPs ?? []),
];
return `# Client: ${client.name} (${client.id}) return `# Client: ${client.name} (${client.id})
[Peer] [Peer]
PublicKey = ${client.publicKey} PublicKey = ${client.publicKey}
PresharedKey = ${client.preSharedKey} PresharedKey = ${client.preSharedKey}
AllowedIPs = ${client.address4}/32, ${client.address6}/128${client.serverAllowedIPs ? ` ${client.serverAllowedIPs.join(', ')}` : ''}`; AllowedIPs = ${allowedIps.join(', ')}`;
}, },
generateServerInterface: (system: System) => { generateServerInterface: (system: System) => {
@ -47,8 +53,6 @@ PersistentKeepalive = ${client.persistentKeepalive}
Endpoint = ${system.wgHost}:${system.wgConfigPort}`; Endpoint = ${system.wgHost}:${system.wgConfigPort}`;
}, },
// TODO?: generate keys using plain javascript
generatePrivateKey: () => { generatePrivateKey: () => {
return exec('wg genkey'); return exec('wg genkey');
}, },
@ -75,16 +79,28 @@ Endpoint = ${system.wgHost}:${system.wgConfigPort}`;
return exec('wg syncconf wg0 <(wg-quick strip wg0)'); return exec('wg syncconf wg0 <(wg-quick strip wg0)');
}, },
// TODO: properly convert
dump: async () => { dump: async () => {
const rawDump = await exec('wg show wg0 dump', { const rawDump = await exec('wg show wg0 dump', {
log: false, log: false,
}); });
type wgDumpLine = [
string,
string,
string,
string,
string,
string,
string,
string,
];
return rawDump return rawDump
.trim() .trim()
.split('\n') .split('\n')
.slice(1) .slice(1)
.map((line) => { .map((line) => {
const splitLines = line.split('\t');
const [ const [
publicKey, publicKey,
preSharedKey, preSharedKey,
@ -94,17 +110,20 @@ Endpoint = ${system.wgHost}:${system.wgConfigPort}`;
transferRx, transferRx,
transferTx, transferTx,
persistentKeepalive, persistentKeepalive,
] = line.split('\t'); ] = splitLines as wgDumpLine;
return { return {
publicKey, publicKey,
preSharedKey, preSharedKey,
endpoint, endpoint: endpoint === '(none)' ? null : endpoint,
allowedIPs, allowedIPs,
latestHandshakeAt, latestHandshakeAt:
transferRx, latestHandshakeAt === '0'
transferTx, ? null
persistentKeepalive, : new Date(Number.parseInt(`${latestHandshakeAt}000`)),
transferRx: Number.parseInt(transferRx),
transferTx: Number.parseInt(transferTx),
persistentKeepalive: persistentKeepalive,
}; };
}); });
}, },

Loading…
Cancel
Save