| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cfg = config.services.unbound; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stateDir = "/var/lib/unbound"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-03 08:36:11 +00:00
										 |  |  |   access = concatMapStringsSep "\n  " (x: "access-control: ${x} allow") cfg.allowedAccess; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-03 08:36:11 +00:00
										 |  |  |   interfaces = concatMapStringsSep "\n  " (x: "interface: ${x}") cfg.interfaces; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-16 09:47:36 +02:00
										 |  |  |   isLocalAddress = x: substring 0 3 x == "::1" || substring 0 9 x == "127.0.0.1"; | 
					
						
							| 
									
										
										
										
											2016-08-30 19:20:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   forward = | 
					
						
							|  |  |  |     optionalString (any isLocalAddress cfg.forwardAddresses) ''
 | 
					
						
							|  |  |  |       do-not-query-localhost: no | 
					
						
							|  |  |  |     '' +
 | 
					
						
							|  |  |  |     optionalString (cfg.forwardAddresses != []) ''
 | 
					
						
							|  |  |  |       forward-zone: | 
					
						
							|  |  |  |         name: . | 
					
						
							|  |  |  |     '' +
 | 
					
						
							|  |  |  |     concatMapStringsSep "\n" (x: "    forward-addr: ${x}") cfg.forwardAddresses; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-15 03:35:25 +01:00
										 |  |  |   rootTrustAnchorFile = "${stateDir}/root.key"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   trustAnchor = optionalString cfg.enableRootTrustAnchor | 
					
						
							|  |  |  |     "auto-trust-anchor-file: ${rootTrustAnchorFile}"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |   confFile = pkgs.writeText "unbound.conf" ''
 | 
					
						
							|  |  |  |     server: | 
					
						
							|  |  |  |       directory: "${stateDir}" | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |       username: unbound | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |       chroot: "${stateDir}" | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |       pidfile: "" | 
					
						
							| 
									
										
										
										
											2011-11-03 18:49:54 +00:00
										 |  |  |       ${interfaces} | 
					
						
							|  |  |  |       ${access} | 
					
						
							| 
									
										
										
										
											2016-02-15 03:35:25 +01:00
										 |  |  |       ${trustAnchor} | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |     ${cfg.extraConfig} | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |     ${forward} | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  |     services.unbound = { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-30 19:28:30 +02:00
										 |  |  |       enable = mkEnableOption "Unbound domain name server"; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       allowedAccess = mkOption { | 
					
						
							| 
									
										
										
										
											2016-08-30 19:30:28 +02:00
										 |  |  |         default = [ "127.0.0.0/24" ]; | 
					
						
							| 
									
										
										
										
											2016-02-15 03:37:45 +01:00
										 |  |  |         type = types.listOf types.str; | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         description = "What networks are allowed to use unbound as a resolver."; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       interfaces = mkOption { | 
					
						
							| 
									
										
										
										
											2018-06-12 12:29:25 +00:00
										 |  |  |         default = [ "127.0.0.1" ] ++ optional config.networking.enableIPv6 "::1"; | 
					
						
							| 
									
										
										
										
											2016-02-15 03:37:45 +01:00
										 |  |  |         type = types.listOf types.str; | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         description = "What addresses the server should listen on."; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       forwardAddresses = mkOption { | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         default = [ ]; | 
					
						
							| 
									
										
										
										
											2016-02-15 03:37:45 +01:00
										 |  |  |         type = types.listOf types.str; | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         description = "What servers to forward queries to."; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-15 03:35:25 +01:00
										 |  |  |       enableRootTrustAnchor = mkOption { | 
					
						
							|  |  |  |         default = true; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = "Use and update root trust anchor for DNSSEC validation."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 18:49:54 +00:00
										 |  |  |       extraConfig = mkOption { | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         default = ""; | 
					
						
							| 
									
										
										
										
											2016-10-23 19:33:41 +02:00
										 |  |  |         type = types.lines; | 
					
						
							| 
									
										
										
										
											2016-09-01 18:47:40 +02:00
										 |  |  |         description = ''
 | 
					
						
							|  |  |  |           Extra unbound config. See | 
					
						
							|  |  |  |           <citerefentry><refentrytitle>unbound.conf</refentrytitle><manvolnum>8 | 
					
						
							|  |  |  |           </manvolnum></citerefentry>. | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2011-11-03 18:49:54 +00:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### implementation | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |   config = mkIf cfg.enable { | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |     environment.systemPackages = [ pkgs.unbound ]; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-01 18:48:13 +02:00
										 |  |  |     users.users.unbound = { | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |       description = "unbound daemon user"; | 
					
						
							| 
									
										
										
										
											2016-09-01 18:48:13 +02:00
										 |  |  |       isSystemUser = true; | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |     systemd.services.unbound = { | 
					
						
							| 
									
										
										
										
											2016-08-30 19:30:28 +02:00
										 |  |  |       description = "Unbound recursive Domain Name Server"; | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |       after = [ "network.target" ]; | 
					
						
							|  |  |  |       before = [ "nss-lookup.target" ]; | 
					
						
							| 
									
										
										
										
											2017-10-10 20:08:36 +00:00
										 |  |  |       wants = [ "nss-lookup.target" ]; | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |       preStart = ''
 | 
					
						
							|  |  |  |         mkdir -m 0755 -p ${stateDir}/dev/ | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         cp ${confFile} ${stateDir}/unbound.conf | 
					
						
							| 
									
										
										
										
											2016-05-21 13:12:48 +02:00
										 |  |  |         ${optionalString cfg.enableRootTrustAnchor ''
 | 
					
						
							| 
									
										
										
										
											2018-06-12 12:29:25 +00:00
										 |  |  |           ${pkgs.unbound}/bin/unbound-anchor -a ${rootTrustAnchorFile} || echo "Root anchor updated!" | 
					
						
							|  |  |  |           chown unbound ${stateDir} ${rootTrustAnchorFile} | 
					
						
							| 
									
										
										
										
											2016-05-21 13:12:48 +02:00
										 |  |  |         ''}
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:40:15 +01:00
										 |  |  |         touch ${stateDir}/dev/random | 
					
						
							| 
									
										
										
										
											2016-08-30 19:22:53 +02:00
										 |  |  |         ${pkgs.utillinux}/bin/mount --bind -n /dev/urandom ${stateDir}/dev/random | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							| 
									
										
										
										
											2016-03-06 12:50:41 +00:00
										 |  |  |         ExecStart = "${pkgs.unbound}/bin/unbound -d -c ${stateDir}/unbound.conf"; | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |         ExecStopPost="${pkgs.utillinux}/bin/umount ${stateDir}/dev/random"; | 
					
						
							| 
									
										
										
										
											2016-09-01 18:53:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ProtectSystem = true; | 
					
						
							|  |  |  |         ProtectHome = true; | 
					
						
							|  |  |  |         PrivateDevices = true; | 
					
						
							| 
									
										
										
										
											2018-06-12 12:29:25 +00:00
										 |  |  |         Restart = "always"; | 
					
						
							|  |  |  |         RestartSec = "5s"; | 
					
						
							| 
									
										
										
										
											2014-08-26 21:24:09 -04:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-04-20 11:16:36 -04:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-29 13:41:46 -04:00
										 |  |  |     # If networkmanager is enabled, ask it to interface with unbound. | 
					
						
							|  |  |  |     networking.networkmanager.dns = "unbound"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-02 20:59:12 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |