networkmanager: Expand dns description, integrate with other services (#41898)

Rather than special-casing the dns options in networkmanager.nix, use
the module system to let unbound and systemd-resolved contribute to
the newtorkmanager config.
This commit is contained in:
Benjamin Staffin 2018-06-29 13:41:46 -04:00 committed by GitHub
parent 25342cd6bd
commit dca7e24a11
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 19 deletions

View file

@ -9,18 +9,11 @@ let
# /var/lib/misc is for dnsmasq.leases.
stateDirs = "/var/lib/NetworkManager /var/lib/dhclient /var/lib/misc";
dns =
if cfg.dns == "none" then "none"
else if cfg.dns == "dnsmasq" then "dnsmasq"
else if config.services.resolved.enable then "systemd-resolved"
else if config.services.unbound.enable then "unbound"
else "default";
configFile = writeText "NetworkManager.conf" ''
[main]
plugins=keyfile
dhcp=${cfg.dhcp}
dns=${dns}
dns=${cfg.dns}
[keyfile]
${optionalString (cfg.unmanaged != [])
@ -217,19 +210,73 @@ in {
};
dns = mkOption {
type = types.enum [ "auto" "dnsmasq" "none" ];
default = "auto";
type = types.enum [ "default" "dnsmasq" "unbound" "systemd-resolved" "none" ];
default = "default";
description = ''
Set the DNS (<literal>resolv.conf</literal>) processing mode.
</para>
<para>
Options:
- auto: Check for systemd-resolved, unbound, or use default.
- dnsmasq:
Enable NetworkManager's dnsmasq integration. NetworkManager will run
dnsmasq as a local caching nameserver, using a "split DNS"
configuration if you are connected to a VPN, and then update
resolv.conf to point to the local nameserver.
- none:
Disable NetworkManager's DNS integration completely.
It will not touch your /etc/resolv.conf.
<variablelist>
<varlistentry>
<term><literal>"default"</literal></term>
<listitem><para>
NetworkManager will update <literal>/etc/resolv.conf</literal> to
reflect the nameservers provided by currently active connections.
</para></listitem>
</varlistentry>
<varlistentry>
<term><literal>"dnsmasq"</literal></term>
<listitem>
<para>
Enable NetworkManager's dnsmasq integration. NetworkManager will
run dnsmasq as a local caching nameserver, using a "split DNS"
configuration if you are connected to a VPN, and then update
<literal>resolv.conf</literal> to point to the local nameserver.
</para>
<para>
It is possible to pass custom options to the dnsmasq instance by
adding them to files in the
<literal>/etc/NetworkManager/dnsmasq.d/</literal> directory.
</para>
<para>
When multiple upstream servers are available, dnsmasq will
initially contact them in parallel and then use the fastest to
respond, probing again other servers after some time. This
behavior can be modified passing the
<literal>all-servers</literal> or <literal>strict-order</literal>
options to dnsmasq (see the manual page for more details).
</para>
<para>
Note that this option causes NetworkManager to launch and manage
its own instance of the dnsmasq daemon, which is
<emphasis>not</emphasis> the same as setting
<literal>services.dnsmasq.enable = true;</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>"unbound"</literal></term>
<listitem><para>
NetworkManager will talk to unbound and dnssec-triggerd,
providing a "split DNS" configuration with DNSSEC support.
<literal>/etc/resolv.conf</literal> will be managed by
dnssec-trigger daemon.
</para></listitem>
</varlistentry>
<varlistentry>
<term><literal>"systemd-resolved"</literal></term>
<listitem><para>
NetworkManager will push the DNS configuration to systemd-resolved.
</para></listitem>
</varlistentry>
<varlistentry>
<term><literal>"none"</literal></term>
<listitem><para>
NetworkManager will not modify resolv.conf.
</para></listitem>
</varlistentry>
</variablelist>
'';
};

View file

@ -131,6 +131,9 @@ in
};
};
# If networkmanager is enabled, ask it to interface with unbound.
networking.networkmanager.dns = "unbound";
};
}

View file

@ -147,6 +147,8 @@ in
${config.services.resolved.extraConfig}
'';
# If networkmanager is enabled, ask it to interface with resolved.
networking.networkmanager.dns = "systemd-resolved";
};
}