The resolv.conf
file
The manual says:
The resolver is a set of routines in the C library that provide access to the Internet Domain Name System (DNS). The resolver config file contains information that is read by the resolver routines the first time they are invoked by a process.
If this file does not exist, only the name server on the local machine will be queried, and the search list contains the local domain name determined from the hostname.
systemd-resolved
On Ubuntu 20.04, systemd-resolved
is a local DNS server included with systemd
that acts as a stub resolver and it should automatically edit /etc/resolv.conf
with the correct config.
On older versions you might need to manually symlink it with the following:
$ sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
By default, systemd-resolved
configures a local DNS server listening at 127.0.0.53
on port 53
and you can run lsof -i @127.0.0.53:53
to verify. Make sure you do not have any other service like dnsmasq
listening to the same address and port.
Note that 127.0.0.53
is the loopback interface but you can have another DNS server listening on port 53 at another IP address on the loopback interface, like 127.0.0.1
or 127.0.0.2
.
If it does not work, try the following:
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
This file contains DNS servers from DHCP leases but be aware that you will not benefit from the stub resolver caching feature.
dnsmasq
with NetworkManager
The dnsmasq
lightweight caching DNS server accepts DNS queries and either answers them from a small, local, cache or forwards them to a real, recursive, DNS server.
This is very good to have a little DNS service to test local websites for a web development machine.
First, verify that NetworkManager
manages your current interface (wlp0s20f3
in my case):
$ nmcli dev
$ nmcli dev set wlp0s20f3 managed yes
Now you can enable the NetworkManager
built-in dnsmasq
resolver:
$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq
You can now benefit from the flexibility of NetworkManager
along dnsmasq
, whose config is located in /etc/NetworkManager/dnsmasq.d
:
$ cat /etc/NetworkManager/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1
Do not forget to disable the system-wide dnsmasq
service if present and apply your changes:
$ sudo systemctl stop dnsmasq.service && sudo systemctl disable dnsmasq.service
$ sudo systemctl restart NetworkManager.service
If for some reasons you prefer to have dnsmasq
running separately, you must first prevent NetworkManager
from overriding /etc/resolv.conf
:
$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=none
Now you must tell dnsmasq
to get its upstream servers from somewhere other that /etc/resolv.conf
:
$ cat /etc/dnsmasq.conf
listen-address=127.0.0.53
resolv-file=/run/NetworkManager/resolv.conf
This file is generated by NetworkManager
and also contains DNS servers from DHCP leases. Now configure dnsmasq
for resolving:
$ cat /etc/resolv.conf
# Use local dnsmasq resolver
nameserver 127.0.0.53
Configure your own local DNS settings:
$ cat /etc/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1
Apply your new config:
$ sudo systemctl stop systemd-resolved.service && sudo systemctl disable systemd-resolved.service
$ sudo systemctl restart dnsmasq.service
dnsmasq
with systemd-networkd
Unfortunately it is not as easy as with NetworkManager
and this is due to the fact that systemd-networkd
does not expose a file with DNS nameservers obtained from DHCP servers as this is managed by systemd-resolved
instead.
This is also the case if you use the quite deprecated ifupdown
package.
Open the man
for dhclient-script
:
$ man 8 dhclient-script
The HOOKS section says:
When it starts, the client script first defines a shell function, make_resolv_conf
, which is later used to create the /etc/resolv.conf
file. To override the default behaviour, redefine this function in the enter hook script.
So if you still want to use dnsmasq
along systemd-networkd
you will need to redefine make_resolv_conf
to create a resolv-file
for dnsmasq
so that it can get its upstream servers from your DHCP settings.
The resolvconf
package provides a wrapper interface around the different daemons involved in populating /etc/resolv.conf
and you can use it to configure the make_resolv_conf
behavior.
The same problem also happens if you need to obtain the IPv6 upstream servers from RDNSS in Router Advertisement messages (see Neighbor Discovery Protocol) as this is also managed by systemd-resolved
.
Try the following command from the ndisc6
package:
$ rdisc6 wlp0s20f3
You should see various information coming from your router, including your IPv6 address prefix and DNS servers. If you do not see anything, your router may not support it.
The rdisc6
program implements the ICMPv6 Router Discovery in userland, using NETLINK_ROUTE
sockets for which RDNSS support was added in Linux kernel 2.6.24. If you want to support older versions, you have no choices but to interact with the device driver at OSI Layer 2, using SOCK_RAW
sockets.
sudo systemctl edit systemd-resolved
it seemssudo systemctl restart systemd-resolved
needs to be run in order for the new settings to be applied. Thanks! – bmaupin Apr 23 '19 at 15:13sudo systemctl revert systemd-resolved
– bmaupin Aug 03 '21 at 12:55