vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / dnsproxy.nix
blob80b66743ce9d6255a440ba53e5a554d46f0194a6
1 { config, lib, pkgs, ... }:
3 let
4   inherit (lib)
5     escapeShellArgs
6     getExe
7     lists
8     literalExpression
9     maintainers
10     mkEnableOption
11     mkIf
12     mkOption
13     mkPackageOption
14     types;
16   cfg = config.services.dnsproxy;
18   yaml = pkgs.formats.yaml { };
19   configFile = yaml.generate "config.yaml" cfg.settings;
21   finalFlags = (lists.optional (cfg.settings != { }) "--config-path=${configFile}") ++ cfg.flags;
25   options.services.dnsproxy = {
27     enable = mkEnableOption "dnsproxy";
29     package = mkPackageOption pkgs "dnsproxy" { };
31     settings = mkOption {
32       type = yaml.type;
33       default = { };
34       example = literalExpression ''
35         {
36           bootstrap = [
37             "8.8.8.8:53"
38           ];
39           listen-addrs = [
40             "0.0.0.0"
41           ];
42           listen-ports = [
43             53
44           ];
45           upstream = [
46             "1.1.1.1:53"
47           ];
48         }
49       '';
50       description = ''
51         Contents of the `config.yaml` config file.
52         The `--config-path` argument will only be passed if this set is not empty.
54         See <https://github.com/AdguardTeam/dnsproxy/blob/master/config.yaml.dist>.
55       '';
56     };
58     flags = mkOption {
59       type = types.listOf types.str;
60       default = [ ];
61       example = [ "--upstream=1.1.1.1:53" ];
62       description = ''
63         A list of extra command-line flags to pass to dnsproxy. For details on the
64         available options, see <https://github.com/AdguardTeam/dnsproxy#usage>.
65         Keep in mind that options passed through command-line flags override
66         config options.
67       '';
68     };
70   };
72   config = mkIf cfg.enable {
73     systemd.services.dnsproxy = {
74       description = "Simple DNS proxy with DoH, DoT, DoQ and DNSCrypt support";
75       after = [ "network.target" "nss-lookup.target" ];
76       wantedBy = [ "multi-user.target" ];
77       serviceConfig = {
78         ExecStart = "${getExe cfg.package} ${escapeShellArgs finalFlags}";
79         Restart = "always";
80         RestartSec = 10;
81         DynamicUser = true;
83         AmbientCapabilities = "CAP_NET_BIND_SERVICE";
84         LockPersonality = true;
85         MemoryDenyWriteExecute = true;
86         NoNewPrivileges = true;
87         ProtectClock = true;
88         ProtectHome = true;
89         ProtectHostname = true;
90         ProtectKernelLogs = true;
91         RemoveIPC = true;
92         RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
93         RestrictNamespaces = true;
94         RestrictRealtime = true;
95         RestrictSUIDSGID = true;
96         SystemCallArchitectures = "native";
97         SystemCallErrorNumber = "EPERM";
98         SystemCallFilter = [ "@system-service" "~@privileged @resources" ];
99       };
100     };
101   };
103   meta.maintainers = with maintainers; [ diogotcorreia ];