I’ve been having trouble resolving domains on my laptop after resuming from sleep, i.e. trying to load a website gets stuck forever since the system isn’t able to resolve “google.com” to “126.96.36.199”.
I use systemd-resolved on this system to do the work of resolving names. Checking the logs shows that it’s unable to start after waking:
systemd-resolved: Positive Trust Anchors: systemd-resolved: . IN DS 19036 8 2 49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5 systemd-resolved: . IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d systemd-resolved: Negative trust anchors: 10.in-addr.arpa 16.172.in-addr.arpa <snip> systemd-resolved: Using system hostname 'hot-sound'. systemd-resolved: Failed to listen on UDP socket 127.0.0.53:53: Cannot assign requested address systemd-resolved: Failed to start manager: Cannot assign requested address
A bit of further debugging shows it’s not possible to bind to anything on
127.0.0.0/8, at any port:
$ python -c 'import socket; server = socket.socket(socket.AF_INET, socket.SOCK_STREAM); server.bind(("127.0.0.1", 4000))' Traceback (most recent call last): File "<string>", line 1, in <module> OSError: [Errno 99] Cannot assign requested address
Interesting… Well, let’s take a look at the interfaces list:
$ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp3s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether f8:75:a4:2b:77:8d brd ff:ff:ff:ff:ff:ff
Well, that explains it! We don’t actually have a loopback address! How can this possibly happen? Turns out that the following systemd-networkd configuration from
/etc/systemd/networkd/*.network is at fault:
[Match] Name=* [Network] MulticastDNS=true DHCP=yes
The intent here is to enable mDNS & DHCP on all interfaces without having to configure each interface individually. However, it turns out that
lo will also match this glob!
The fix is to use
Name=wlp* enp*, which provides the perfect level of generality. And as a one-time fix,
sudo ip link set lo down && sudo ip link set lo up will get loopback working again without having to reboot.