From f19d959ef1cfe9c4064f7e54d9aca7f3457767f4 Mon Sep 17 00:00:00 2001 From: Andrey Golovizin Date: Mon, 8 Jan 2018 15:49:13 +0100 Subject: [PATCH 1/4] nixos/kresd: fix systemd dependency cycle The unnecessary dependency of sockets.target on kresd.service causes a dependency cycle preventing kresd.service from starting at boot: sockets.target -> kresd.service -> basic.target -> sockets.target --- nixos/modules/services/networking/kresd.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/nixos/modules/services/networking/kresd.nix b/nixos/modules/services/networking/kresd.nix index 18e2ab9aebf..b0b3a8480d1 100644 --- a/nixos/modules/services/networking/kresd.nix +++ b/nixos/modules/services/networking/kresd.nix @@ -113,7 +113,6 @@ in after = [ "kresd-cachedir.service" ]; requires = [ "kresd.socket" "kresd-cachedir.service" ]; - wantedBy = [ "sockets.target" ]; }; }; } From f312e6d9930e9cd278f5823f6040f6e8e1214ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Tue, 9 Jan 2018 17:11:36 +0100 Subject: [PATCH 2/4] nixos/kresd: use systemd.tmpfiles Since 4e4161c21268d6 it works on nixos-rebuild. --- nixos/modules/services/networking/kresd.nix | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/nixos/modules/services/networking/kresd.nix b/nixos/modules/services/networking/kresd.nix index b0b3a8480d1..64f36cadc1d 100644 --- a/nixos/modules/services/networking/kresd.nix +++ b/nixos/modules/services/networking/kresd.nix @@ -86,16 +86,7 @@ in }; }; - # Create the cacheDir; tmpfiles don't work on nixos-rebuild switch. - systemd.services.kresd-cachedir = { - serviceConfig.Type = "oneshot"; - script = '' - if [ ! -d '${cfg.cacheDir}' ]; then - mkdir -p '${cfg.cacheDir}' - chown kresd:kresd '${cfg.cacheDir}' - fi - ''; - }; + systemd.tmpfiles.rules = [ "d '${cfg.cacheDir}' 0770 kresd kresd - -" ]; systemd.services.kresd = { description = "Knot-resolver daemon"; @@ -111,8 +102,7 @@ in -k '${cfg.cacheDir}/root.key' ''; - after = [ "kresd-cachedir.service" ]; - requires = [ "kresd.socket" "kresd-cachedir.service" ]; + requires = [ "kresd.socket" ]; }; }; } From 3ab85ed1aca250501bcd098f5c304e3ddde96e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Tue, 9 Jan 2018 17:13:39 +0100 Subject: [PATCH 3/4] nixos/kresd: use DNSSEC root trust anchor from nixpkgs in read-only way. If the cache directory is empty and you use the very same service for system's DNS, kresd is unable to bootstrap root trust anchors, as it would need a DNS lookup. Also, if we don't rely on bootstrap, the extra lua deps of kresd could be dropped by default, but let's not do that now, as the difference in closure size is only ~4 MB, and there may be other use cases than running the package as nixos service this way. --- nixos/modules/services/networking/kresd.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/modules/services/networking/kresd.nix b/nixos/modules/services/networking/kresd.nix index 64f36cadc1d..7e36c69cc4e 100644 --- a/nixos/modules/services/networking/kresd.nix +++ b/nixos/modules/services/networking/kresd.nix @@ -99,7 +99,7 @@ in script = '' exec '${package}/bin/kresd' --config '${configFile}' \ - -k '${cfg.cacheDir}/root.key' + -k '${pkgs.dns-root-data}/root.key' ''; requires = [ "kresd.socket" ]; From 4bc4c0883885f170d08ad47a8019bde7209d10f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Tue, 9 Jan 2018 17:19:13 +0100 Subject: [PATCH 4/4] nixos/kresd: service nitpicks --- nixos/modules/services/networking/kresd.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nixos/modules/services/networking/kresd.nix b/nixos/modules/services/networking/kresd.nix index 7e36c69cc4e..011a9b2f58e 100644 --- a/nixos/modules/services/networking/kresd.nix +++ b/nixos/modules/services/networking/kresd.nix @@ -72,6 +72,7 @@ in (iface: if elem ":" (stringToCharacters iface) then "[${iface}]:53" else "${iface}:53") cfg.interfaces; socketConfig.ListenDatagram = listenStreams; + socketConfig.FreeBind = true; }; systemd.sockets.kresd-control = rec { @@ -82,7 +83,7 @@ in socketConfig = { FileDescriptorName = "control"; Service = "kresd.service"; - SocketMode = "0660"; # only root user/group may connect + SocketMode = "0660"; # only root user/group may connect and control kresd }; }; @@ -95,6 +96,7 @@ in User = "kresd"; Type = "notify"; WorkingDirectory = cfg.cacheDir; + Restart = "on-failure"; }; script = ''