summary refs log tree commit diff
path: root/modules/foundation/wireguard.nix
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-08-27 13:14:42 +0200
committerMel <mel@rnrd.eu>2025-08-27 13:14:42 +0200
commit8a901c24b029719cc8d3ff355f95bceb1dc93b60 (patch)
tree0011d01f53a4e03dd571063608148cd899a26e8c /modules/foundation/wireguard.nix
parent8df556f5552ed05715514c5b61a7226b1f176591 (diff)
downloadnetwork-8a901c24b029719cc8d3ff355f95bceb1dc93b60.tar.zst
network-8a901c24b029719cc8d3ff355f95bceb1dc93b60.zip
Move WireGuard server peer definitions to configuration option
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'modules/foundation/wireguard.nix')
-rw-r--r--modules/foundation/wireguard.nix135
1 files changed, 74 insertions, 61 deletions
diff --git a/modules/foundation/wireguard.nix b/modules/foundation/wireguard.nix
index 110a2a4..366a353 100644
--- a/modules/foundation/wireguard.nix
+++ b/modules/foundation/wireguard.nix
@@ -12,6 +12,8 @@ let
     mkIf
     mkEnableOption
     mkOption
+    assertMsg
+    types
     ;
 
   cfg = config.foundation.wireguard;
@@ -23,43 +25,39 @@ let
   wireguardIPv6 = number: subnet: "fd0f:123::${number}/${subnet}";
 
   wireguardInterface = "wg0";
-
-  peerIPs = peerNumber: [
-    (wireguardIPv4 peerNumber "32")
-    (wireguardIPv6 peerNumber "128")
-  ];
-
-  peers = [
-    # mel
-    {
-      publicKey = "vnZoHXapCLLUhZ8A8R5W0iJ8LpWVLve29z41kkoT0BU=";
-      allowedIPs = peerIPs "2";
-    }
-
-    # andrei
-    {
-      publicKey = "qqU4uYImLfUohIwl4KBshPtTINFcs0JVALjbmwpfxRg=";
-      allowedIPs = peerIPs "3";
-    }
-
-    # sergo
-    {
-      publicKey = "qbZGMNIDZFCJC6SHtlyNIlIdGWHELceXClJCcagrj2Y=";
-      allowedIPs = peerIPs "4";
-    }
-  ];
 in
 {
-  options.foundation.wireguard = {
-    server = {
-      enable = mkEnableOption "wireguard vpn server";
-
-      externalInterface = mkOption {
-        type = lib.types.string;
-        default = "eth0";
+  options.foundation.wireguard =
+    let
+      peerSubmodule =
+        with types;
+        submodule {
+          options = {
+            ip = mkOption {
+              type = int;
+            };
+
+            key = mkOption {
+              type = str;
+            };
+          };
+        };
+    in
+    {
+      server = {
+        enable = mkEnableOption "wireguard vpn server";
+
+        externalInterface = mkOption {
+          type = types.str;
+          default = "eth0";
+        };
+
+        peers = mkOption {
+          type = types.attrsOf peerSubmodule;
+          default = { };
+        };
       };
     };
-  };
 
   config = mkIf cfg.server.enable {
     age.secrets.wireguard-private-key = {
@@ -85,33 +83,48 @@ in
       "net.ipv6.conf.default.forwarding" = 1;
     };
 
-    networking.wireguard.interfaces.${wireguardInterface} = let
-      inherit (cfg.server) externalInterface;
-    in
-    {
-      inherit peers;
-
-      # ip address of server + subnet of network
-      ips = [
-        (wireguardIPv4 "1" "24")
-        (wireguardIPv6 "1" "112")
-      ];
-      listenPort = wireguardPort;
-
-      # route wireguard traffic to the internet
-      # also requires clients to have dns set. (i think)
-      # to avoid, maybe? use wg-quick + dnsmasq?
-      postSetup = ''
-        ${iptables}/bin/iptables -t nat -A POSTROUTING -s ${wireguardIPv4 "0" "24"} -o ${externalInterface} -j MASQUERADE
-        ${iptables}/bin/ip6tables -t nat -A POSTROUTING -s ${wireguardIPv6 "0" "112"} -o ${externalInterface} -j MASQUERADE
-      '';
-
-      postShutdown = ''
-        ${iptables}/bin/iptables -t nat -D POSTROUTING -s ${wireguardIPv4 "0" "24"} -o ${externalInterface} -j MASQUERADE
-        ${iptables}/bin/ip6tables -t nat -D POSTROUTING -s ${wireguardIPv6 "0" "112"} -o ${externalInterface} -j MASQUERADE
-      '';
-
-      privateKeyFile = config.age.secrets.wireguard-private-key.path;
-    };
+    networking.wireguard.interfaces.${wireguardInterface} =
+      let
+        inherit (cfg.server) externalInterface;
+
+        peerIPs = peerNumber: [
+          (wireguardIPv4 peerNumber "32")
+          (wireguardIPv6 peerNumber "128")
+        ];
+
+        mkPeer =
+          p:
+          assert assertMsg (p.ip > 1) "ip has to be larger that 1";
+          {
+            allowedIPs = peerIPs (toString p.ip);
+            publicKey = p.key;
+          };
+        peers = map mkPeer (builtins.attrValues cfg.server.peers);
+      in
+      {
+        inherit peers;
+
+        # ip address of server + subnet of network
+        ips = [
+          (wireguardIPv4 "1" "24")
+          (wireguardIPv6 "1" "112")
+        ];
+        listenPort = wireguardPort;
+
+        # route wireguard traffic to the internet
+        # also requires clients to have dns set. (i think)
+        # to avoid, maybe? use wg-quick + dnsmasq?
+        postSetup = ''
+          ${iptables}/bin/iptables -t nat -A POSTROUTING -s ${wireguardIPv4 "0" "24"} -o ${externalInterface} -j MASQUERADE
+          ${iptables}/bin/ip6tables -t nat -A POSTROUTING -s ${wireguardIPv6 "0" "112"} -o ${externalInterface} -j MASQUERADE
+        '';
+
+        postShutdown = ''
+          ${iptables}/bin/iptables -t nat -D POSTROUTING -s ${wireguardIPv4 "0" "24"} -o ${externalInterface} -j MASQUERADE
+          ${iptables}/bin/ip6tables -t nat -D POSTROUTING -s ${wireguardIPv6 "0" "112"} -o ${externalInterface} -j MASQUERADE
+        '';
+
+        privateKeyFile = config.age.secrets.wireguard-private-key.path;
+      };
   };
 }