diff options
| author | Alejandro Soto <alejandro@34project.org> | 2025-04-26 14:08:37 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2025-04-26 16:59:02 -0600 |
| commit | bd48c60838871dcf17899aa1f341914880104b6e (patch) | |
| tree | b7944abbe10dd74c0773ae103a58a0cace5e286a | |
| parent | 1039d1d47a53be0c814a03608e94a9d0e8f4405b (diff) | |
sys/ns: enable acme-dns for DNS-01 challenges
| -rw-r--r-- | sys/ns/ns.nix | 12 | ||||
| -rw-r--r-- | sys/ns/nsd.nix | 59 | ||||
| -rw-r--r-- | sys/ns/ptr/static-prefix-v6/serial.nix | 4 |
3 files changed, 63 insertions, 12 deletions
diff --git a/sys/ns/ns.nix b/sys/ns/ns.nix index a1b1605..1e74502 100644 --- a/sys/ns/ns.nix +++ b/sys/ns/ns.nix @@ -21,6 +21,11 @@ in options.localNS = { enable = mkEnableOption "local NS settings"; + acme = mkOption { + default = { }; + type = attrsOf str; + }; + ptrNet = { v4 = mkOption { type = nullOr str; @@ -90,6 +95,13 @@ in soa = mkIf ptrDomain { authorityZone = mkDefault "${domain}."; }; + + cname = mapAttrsToList + (name: id: { + name = "_acme-challenge" + optionalString (name != "@") ".${name}"; + target = "${id}.acme-challenge.${domain}."; + }) + cfg.acme; }; })); }; diff --git a/sys/ns/nsd.nix b/sys/ns/nsd.nix index 74fa7dd..1dfa16b 100644 --- a/sys/ns/nsd.nix +++ b/sys/ns/nsd.nix @@ -1,15 +1,29 @@ { config, lib, ... }: with lib; let + inherit (config.networking) domain; + cfg = config.local.ns.server; + + acmeChallengeDomain = "acme-challenge.${domain}"; in { - options.local.ns.server = { + options. local. ns. server = { enable = mkEnableOption "nsd authoritative server"; tsigName = mkOption { type = types.str; default = "NOKEY"; }; + + acme = { + apiListen.v6 = mkOption { + type = types.str; + }; + + dnsListen.v6 = mkOption { + type = types.str; + }; + }; }; config = mkIf cfg.enable { @@ -29,19 +43,44 @@ in allowedUDPPorts = [ port ]; }; - services.nsd = { - enable = true; + services = { + acme-dns = { + enable = true; + settings = { + api = { + ip = "[${cfg.acme.apiListen.v6}]"; + port = 80; + }; - ipFreebind = true; + general = { + domain = acmeChallengeDomain; + nsname = acmeChallengeDomain; + nsadmin = "hostmaster.${domain}"; - bind8Stats = true; - statistics = 3600; + listen = "[${cfg.acme.dnsListen.v6}]:53"; - tcpCount = 128; - tcpTimeout = 30; - tcpQueryCount = 128; + records = [ + "${acmeChallengeDomain}. NS ${acmeChallengeDomain}." + "${acmeChallengeDomain}. AAAA ${cfg.acme.dnsListen.v6}" + ]; + }; + }; + }; + + nsd = { + enable = true; + + ipFreebind = true; - zones = mapAttrs' (name: zone: nameValuePair "${name}." zone.nsdConfig) config.local.ns.zones; + bind8Stats = true; + statistics = 3600; + + tcpCount = 128; + tcpTimeout = 30; + tcpQueryCount = 128; + + zones = mapAttrs' (name: zone: nameValuePair "${name}." zone.nsdConfig) config.local.ns.zones; + }; }; }; } diff --git a/sys/ns/ptr/static-prefix-v6/serial.nix b/sys/ns/ptr/static-prefix-v6/serial.nix index c09a24a..454b3dd 100644 --- a/sys/ns/ptr/static-prefix-v6/serial.nix +++ b/sys/ns/ptr/static-prefix-v6/serial.nix @@ -1,7 +1,7 @@ { config = { - soa.serial = 2025042402; - nullSerialHash = "sha256-92c2046d390891a99618c5cf92efee1cda3549799ef26f1f0ca234e0a105aec8"; + soa.serial = 2025042600; + nullSerialHash = "sha256-a5ce7781b014aa816998410db440dd40278d8b566d1de76e06776a83c9839b35"; }; } |
