Disabling systemd-resolved and letting NetworkManager control /etc/resolv.conf on Fedora 40

Resolved regularly fails to resolve things properly for no apparent reason, and was kind of a pain to troubleshoot when I first tried to do so.

Here is how to disable it and allow NetworkManager to manage the /etc/resolv.conf file instead. Shockingly, things stop randomly breaking once this is done.

First, allow NetworkManager to configure the system’s DNS resolvers by editing the /etc/NetworkManager/NetworkManager.conf file.

# nvim /etc/NetworkManager/NetworkManager.conf
# add the "dns=default" line under [main] like so:

[main]
#plugins=keyfile,ifcfg-rh
dns=default

:x

Alternatively, with sed(1):

sed -i -e '/^dns=/d' \
  -e '/\[main\]/a dns=default' \
  /etc/NetworkManager/NetworkManager.conf

Next, stop and mask the resolved service. Note that this WILL break DNS resolution until you remove resolv.conf and restart NetworkManager. Masking the service will disable it.

systemctl stop systemd-resolved; systemctl mask systemd-resolved

Finally, remove your resolved-generated /etc/resolv.conf

rm /etc/resolv.conf

And restart NetworkManager to apply the config change made earlier (tell it to manage resolvers).

systemctl restart NetworkManager

All in one:

# disable resolved
sudo systemctl stop systemd-resolved
sudo systemctl mask systemd-resolved

# remove anything ^dns= then
# insert the "dns=default" line in [main] section
sudo sed -i -e '/^dns=/d' \
    -e '/\[main\]/a dns=default' \
    /etc/NetworkManager/NetworkManager.conf
    
# clean out resolv config so NM will edit it
sudo rm /etc/resolv.conf
# restart NM to make it reread config
sudo systemctl restart NetworkManager