forked from mirrors_public/oddlama_nix-config
feat(wireguard): qr generation finished
This commit is contained in:
parent
d5f2880457
commit
1630e37afd
5 changed files with 47 additions and 30 deletions
|
@ -25,6 +25,7 @@
|
||||||
extra.wireguard.vms = {
|
extra.wireguard.vms = {
|
||||||
server = {
|
server = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
host = "ward";
|
||||||
port = 51822;
|
port = 51822;
|
||||||
openFirewall = true;
|
openFirewall = true;
|
||||||
externalPeers = {
|
externalPeers = {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
extra.wireguard.vms = {
|
extra.wireguard.vms = {
|
||||||
server = {
|
server = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
host = "vms";
|
||||||
port = 51822;
|
port = 51822;
|
||||||
openFirewall = true;
|
openFirewall = true;
|
||||||
externalPeers = {
|
externalPeers = {
|
||||||
|
|
|
@ -93,17 +93,19 @@
|
||||||
if wgCfg.server.enable
|
if wgCfg.server.enable
|
||||||
then
|
then
|
||||||
# Always include all other server nodes.
|
# Always include all other server nodes.
|
||||||
map (serverNode: {
|
map (serverNode: let
|
||||||
|
snCfg = wgCfgOf serverNode;
|
||||||
|
in {
|
||||||
wireguardPeerConfig = {
|
wireguardPeerConfig = {
|
||||||
PublicKey = builtins.readFile (peerPublicKeyPath serverNode);
|
PublicKey = builtins.readFile (peerPublicKeyPath serverNode);
|
||||||
PresharedKeyFile = config.rekey.secrets.${peerPresharedKeySecret nodeName serverNode}.path;
|
PresharedKeyFile = config.rekey.secrets.${peerPresharedKeySecret nodeName serverNode}.path;
|
||||||
# The allowed ips of a server node are it's own addreses,
|
# The allowed ips of a server node are it's own addreses,
|
||||||
# plus each external peer's addresses,
|
# plus each external peer's addresses,
|
||||||
# plus each client's addresses that is connected via this node.
|
# plus each client's addresses that is connected via that node.
|
||||||
AllowedIPs =
|
AllowedIPs =
|
||||||
(wgCfgOf serverNode).addresses
|
snCfg.addresses
|
||||||
++ attrValues (wgCfgOf serverNode).server.externalPeers
|
++ attrValues snCfg.server.externalPeers; # TODO ++ map (n: (wgCfgOf n).addresses) snCfg.ourClientNodes;
|
||||||
++ map (n: (wgCfgOf n).addresses) ourClientNodes;
|
Endpoint = "${snCfg.server.host}:${toString snCfg.server.port}";
|
||||||
};
|
};
|
||||||
}) (filterSelf associatedServerNodes)
|
}) (filterSelf associatedServerNodes)
|
||||||
# All our external peers
|
# All our external peers
|
||||||
|
@ -155,10 +157,15 @@ in {
|
||||||
server = {
|
server = {
|
||||||
enable = mkEnableOption (mdDoc "wireguard server");
|
enable = mkEnableOption (mdDoc "wireguard server");
|
||||||
|
|
||||||
|
host = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = mdDoc "The hostname or ip address which other peers can use to reach this host.";
|
||||||
|
};
|
||||||
|
|
||||||
port = mkOption {
|
port = mkOption {
|
||||||
default = 51820;
|
default = 51820;
|
||||||
type = types.port;
|
type = types.port;
|
||||||
description = mdDoc "The port to listen on, if {option}`listen` is `true`.";
|
description = mdDoc "The port to listen on.";
|
||||||
};
|
};
|
||||||
|
|
||||||
openFirewall = mkOption {
|
openFirewall = mkOption {
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
unique
|
unique
|
||||||
;
|
;
|
||||||
|
|
||||||
inherit (self.extraLib) rageDecryptArgs;
|
|
||||||
|
|
||||||
nodeNames = attrNames self.nodes;
|
nodeNames = attrNames self.nodes;
|
||||||
wireguardNetworks = unique (concatMap (n: attrNames self.nodes.${n}.config.extra.wireguard) nodeNames);
|
wireguardNetworks = unique (concatMap (n: attrNames self.nodes.${n}.config.extra.wireguard) nodeNames);
|
||||||
|
|
||||||
|
@ -39,27 +37,8 @@ in
|
||||||
serverNode=$(${pkgs.jq}/bin/jq -r .serverNode <<< "$json_sel")
|
serverNode=$(${pkgs.jq}/bin/jq -r .serverNode <<< "$json_sel")
|
||||||
peer=$(${pkgs.jq}/bin/jq -r .peer <<< "$json_sel")
|
peer=$(${pkgs.jq}/bin/jq -r .peer <<< "$json_sel")
|
||||||
|
|
||||||
serverPubkey=$(nix eval --raw ".#extraLib" \
|
createConfigScript=$(nix build --no-link --print-out-paths --impure --show-trace --expr \
|
||||||
--apply 'extraLib: builtins.readFile ((extraLib.wireguard "'"$wgName"'").peerPublicKeyPath "'"$serverNode"'")')
|
'let flk = builtins.getFlake "${../../.}"; in (flk.extraLib.wireguard "'"$wgName"'").wgQuickConfigScript "${pkgs.system}" "'"$serverNode"'" "'"$peer"'"')
|
||||||
privKeyPath=$(nix eval --raw ".#extraLib" \
|
|
||||||
--apply 'extraLib: (extraLib.wireguard "'"$wgName"'").peerPrivateKeyPath "'"$peer"'"')
|
|
||||||
serverPskPath=$(nix eval --raw ".#extraLib" \
|
|
||||||
--apply 'extraLib: (extraLib.wireguard "'"$wgName"'").peerPresharedKeyPath "'"$serverNode"'" "'"$peer"'"')
|
|
||||||
|
|
||||||
privKey=$(${pkgs.rage}/bin/rage -d ${rageDecryptArgs} "$privKeyPath") \
|
"$createConfigScript" | tee /dev/tty | ${pkgs.qrencode}/bin/qrencode -t ansiutf8
|
||||||
|| { echo "[1;31merror:[m Failed to decrypt!" >&2; exit 1; }
|
|
||||||
serverPsk=$(${pkgs.rage}/bin/rage -d ${rageDecryptArgs} "$serverPskPath") \
|
|
||||||
|| { echo "[1;31merror:[m Failed to decrypt!" >&2; exit 1; }
|
|
||||||
|
|
||||||
cat <<EOF | tee /dev/tty | ${pkgs.qrencode}/bin/qrencode -t ansiutf8
|
|
||||||
[Interface]
|
|
||||||
Address =
|
|
||||||
PrivateKey = $privKey
|
|
||||||
|
|
||||||
[Peer]
|
|
||||||
PublicKey = $serverPubkey
|
|
||||||
PresharedKey = $serverPsk
|
|
||||||
AllowedIPs =
|
|
||||||
Endpoint =
|
|
||||||
EOF
|
|
||||||
''
|
''
|
||||||
|
|
29
nix/lib.nix
29
nix/lib.nix
|
@ -9,6 +9,7 @@
|
||||||
attrValues
|
attrValues
|
||||||
concatMap
|
concatMap
|
||||||
concatMapStrings
|
concatMapStrings
|
||||||
|
concatStringsSep
|
||||||
escapeShellArg
|
escapeShellArg
|
||||||
filter
|
filter
|
||||||
flatten
|
flatten
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
mergeAttrs
|
mergeAttrs
|
||||||
nameValuePair
|
nameValuePair
|
||||||
partition
|
partition
|
||||||
|
removeSuffix
|
||||||
substring
|
substring
|
||||||
unique
|
unique
|
||||||
;
|
;
|
||||||
|
@ -123,5 +125,32 @@ in rec {
|
||||||
usedAddresses =
|
usedAddresses =
|
||||||
concatMap (n: self.nodes.${n}.config.extra.wireguard.${wgName}.addresses) associatedNodes
|
concatMap (n: self.nodes.${n}.config.extra.wireguard.${wgName}.addresses) associatedNodes
|
||||||
++ flatten (concatMap (n: attrValues self.nodes.${n}.config.extra.wireguard.${wgName}.server.externalPeers) associatedNodes);
|
++ flatten (concatMap (n: attrValues self.nodes.${n}.config.extra.wireguard.${wgName}.server.externalPeers) associatedNodes);
|
||||||
|
|
||||||
|
# Creates a script that when executed outputs a wg-quick compatible configuration
|
||||||
|
# file for use with external peers. This is a script so we can access secrets without
|
||||||
|
# storing them in the nix-store.
|
||||||
|
wgQuickConfigScript = system: serverNode: extPeer: let
|
||||||
|
pkgs = self.pkgs.${system};
|
||||||
|
snCfg = self.nodes.${serverNode}.config.extra.wireguard.${wgName};
|
||||||
|
peerName = externalPeerName extPeer;
|
||||||
|
in
|
||||||
|
pkgs.writeShellScript "create-wg-conf-${wgName}-${serverNode}-${extPeer}" ''
|
||||||
|
privKey=$(${pkgs.rage}/bin/rage -d ${rageDecryptArgs} ${escapeShellArg (peerPrivateKeyPath peerName)}) \
|
||||||
|
|| { echo "[1;31merror:[m Failed to decrypt!" >&2; exit 1; }
|
||||||
|
serverPsk=$(${pkgs.rage}/bin/rage -d ${rageDecryptArgs} ${escapeShellArg (peerPresharedKeyPath serverNode peerName)}) \
|
||||||
|
|| { echo "[1;31merror:[m Failed to decrypt!" >&2; exit 1; }
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
[Interface]
|
||||||
|
Address = ${concatStringsSep ", " snCfg.server.externalPeers.${extPeer}}
|
||||||
|
PrivateKey = $privKey
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = ${removeSuffix "\n" (builtins.readFile (peerPublicKeyPath serverNode))}
|
||||||
|
PresharedKey = $serverPsk
|
||||||
|
AllowedIPs = ${concatStringsSep ", " snCfg.addresses}
|
||||||
|
Endpoint = ${snCfg.server.host}:${toString snCfg.server.port}
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue