Ubuntu 18.04 .local domain dns lookup not working
Solution 1
I faced a very similar issue (if not exactly the same) on Linux Mint 19 (Tara). I've managed to solve it by combining 3 different pieces of information. It seems to all be related to recent changes with systemd-resolved.
First, yes I've needed to configure /etc/nsswitch.conf as you did and would expect. As long as dns comes before mdns you should be good. I ended with simply:
hosts: files dns myhostname
ref: https://unix.stackexchange.com/a/457172/271210
Prior to upgrading to this version of Mint, this is the only thing I needed to do. Now I also ended up making the below two other changes to get it working...
After that I've configured my search domain so systemd-resolved would work as I wanted. So I've edited the file /etc/systemd/resolved.conf, the Domains setting under the [resolve] section. In my case it ended up looking like:
[Resolve]
#DNS=
#FallbackDNS=
Domains=trilliant.local
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
ref: https://askubuntu.com/a/1031271/872881
I've also changed the avahi configuration to something else ("mdns" if I remember correctly, but it doesn't matter). It shouldn't be required however from my understanding. Just adding for completeness.
But none of it worked until I've called the following:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
ref: https://askubuntu.com/a/938703/872881
After calling this, everything started working perfectly and as expected!
So it's possible I didn't really need to change the /etc/systemd/resolved.conf file but I kept this change since it made sense and allows me to only type a machine's name, without the complete FQDN, for DNS resolution to work.
Solution 2
The accepted answer did not resolve my issue. It was nothing to do with avahi - I did not have avahi service installed. I have my system set to get its IP AND its DNS server settings from DHCP. However, the DHCP supplied DNS was not being checked for queries using .local
The real issue is that Ubuntu 18.04 has its resolv.conf sym-linked to a stub file that points to the localhost for name resolution. Localhost DNS name resolution means that the system refuses to check the supplied DNS server for .local names, believing (incorrectly) that such names are invalid. This is the default setup of /etc/resolv.conf:
ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Jan 22 13:26 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
content of the stub file is (comments removed):
cat /run/systemd/resolve/stub-resolv.conf
.. removed comments..
nameserver 127.0.0.53
search reddog.microsoft.com
the 'real' resolve conf has the 'correct' DNS setting (from DHCP):
cat /run/systemd/resolve/resolv.conf
..removed comments..
nameserver 10.168.200.250 # This is my server that can resolve .local
nameserver 208.67.220.220 # these are optional, fallback DNS servers
nameserver 208.67.222.222
# Too many DNS servers configured, the following entries may be ignored.
nameserver 8.8.8.8
search reddog.microsoft.com
In order to make the system use your preferred DNS resolver instead of localhost, you change the symlink to point to /run/systemd/resolve/resolv.conf instead of /run/systemd/resolve/stub-resolv.conf :
sudo rm -f /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Immediately after this, resolution of .local started working. No need to reboot or restart any service.
Solution 3
For me working way for Ubuntu 18.04 is:
Edit avahi conf:
sudo vim /etc/avahi/avahi-daemon.conf
and change .local to .alocal :
[server]
domain-name=.alocal
then, open resolved.conf:
sudo vim /etc/systemd/resolved.conf
and uncomment and edit Domains:
[Resolve]
...
Domains=yourdomain.local
...
and finally restart services:
sudo service systemd-resolved restart
sudo service avahi-daemon restart
Solution 4
What worked for me was adding the local DNS as a nameserver to /etc/resolvconf/resolv.conf.d/head
(as described here).
-
Install the resolvconf package.
sudo apt install resolvconf
-
Edit
/etc/resolvconf/resolv.conf.d/head
and add the following:nameserver 8.8.4.4 nameserver 8.8.8.8
-
Restart the resolvconf service.
sudo service resolvconf restart
The fix should be permanent.
Solution 5
For 20.04:
- I updating dns to use a local dns server (gnome 'wired settings' config)
- I adding local domain in:
/etc/systemd/resolved.conf
&Domains=domain.local
- Then restarted the service:
service systemd-resolved restart
Thanks for this thread helping me get this working.
Related videos on Youtube
FalcoGer
I work as a programmer to develop data gathering software using KNX and raspberry pi in C# as well as Asp.NET Webforms based web applications in VB.NET to view the data and other web-applications for my company. At home I also work with C++ and bash shell scripts and the occasional CMD script, python, etc.
Updated on September 18, 2022Comments
-
FalcoGer over 1 year
I'm using a Raspberry Pi 3 with Ubuntu 18.04. At my company we have a DNS server and a couple of domains with ".local". I know technically this isn't correct and it should be ".lan" instead, because .local is reserved for multicast dns. But that's the way it is and it can't easily be changed. So on my windows machine I can ping and browse to those domain names without trouble. On my Ubuntu however I can not.
I can not use IPs because some domains are on the same machine and the IIS webserver sorts things out what goes where.
I have searched and it comes up quite often:
- https://smallbusiness.chron.com/resolving-local-ubuntu-38861.html
- Why do none of my local servers resolve?
- ubuntu server not resolving LAN hostnames
However changing /etc/nsswitch.conf doesn't do the trick for me. I tried
- hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname # default
- hosts: files dns
- hosts: files mdns4_minimal [NOTFOUND=continue] dns myhostname
- hosts: files mdns4 [NOTFOUND=return] dns myhostname
- hosts: files mdns4 [NOTFOUND=continue] dns myhostname
- hosts: files dns mdsn4_minimal myhostname
- hosts: dns
- a few others
None of which worked. I tried rebooting after a change too. I tried to tell avahi that the domain-name=alocal in /etc/avahi/avahi-daemon.conf, didn't work after service restart, didn't work after reboot. After this not working, I tried disabling the avahi-daemon service entirely.
sudo systemctl disable avahi-daemon
After a reboot I tried a couple of permutations in /etc/nsswitch.conf again, with no effect.
with my current settings in hosts (files dns) I get this response:
dig login.name.local # not the actual name ; <<>> Dig 9.11.3-1ubuntu1.1-Ubuntu <<>> login.name.local ;; global options: +cmd ;; Got answer: ;; WARNING .local is reserved for Multicast DNS ;; You are currently testing what happens when an mDNS query is leaked to DNS ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33538 ;; flags: qr rd ra; QUERY: 1, ANSWER:0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;login.name.local. 0 IN A ;; Query time: 2msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Thu Aug 23 10:51:50 CEST 2018 ;; MSG SIZE rcvd: 56
However when I instruct dig to query the server directly I get the correct answer:
dig @dnsIP login.name.local ; <<>> Dig 9.11.3-1ubuntu1.1-Ubuntu <<>> login.name.local ; (1 server found) ;; global options: +cmd ;; Got answer: ;; WARNING .local is reserved for Multicast DNS ;; You are currently testing what happens when an mDNS query is leaked to DNS ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57866 ;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;login.name.local. 0 IN A ;; ANSWER SECTION: login.name.local. 3600 IN A serverIP ;; Query time: 2msec ;; SERVER: dnsIP#53(dnsIP) ;; WHEN: Thu Aug 23 10:51:50 CEST 2018 ;; MSG SIZE rcvd: 56
This version of Ubuntu uses netplan with the network manager. The correct DNS IP is definitely in the list. (in fact it's the primary DNS.) Also the dnsIp is the same as serverIP, but that shouldn't be an issue.
Ping or connecting via browser and such don't work of course. None use the dns query.
I'm at a loss at what to do. Certainly we can't switch to a different domain name. I put the servername into /etc/hosts but that's just a temporary solution.
-
user3529828 over 5 yearschanging the resolv.conf as jeremfg suggested worked for me after chasing my tail around this for several hours. Tnx.
-
tokosh over 5 yearsIn my case I only needed to change
Domains
in/etc/systemd/resolved.conf
(and restart the service). -
FalcoGer over 5 yearsThis didn't do it for me. still nothing
-
José L. Patiño about 5 yearsI uninstalled Avahi and then followed your steps. That made it for me. Thank you Sir. (Using Ubuntu 18.04 Desktop).
-
razvanone about 5 yearsSame version of Ubuntu. Using openvpn. This solution works well with VPN on many machines in my team.
-
codaamok about 5 yearsThank you. This was the answer for me. Why doesn't it "just work" out of the box?
-
John Mee almost 5 yearsThe head file contains a warning not to edit the file, because it is generated by resolvconf?
-
Hosam.Yousof almost 5 yearswhat's the difference between your solution and the accepted answer? For both, one can skip the first 2/3 of the answer -- even that is the same :-)
-
Hosam.Yousof almost 5 yearsYou could have just put the last line in the beginning and I guess you would get more upvotes by doing so.
-
jeremfg almost 5 years@HongboZhu I would if I knew for a fact that's the only change required to get local domains working. I'm pretty sure you still have to prefer dns over mdns in the resolver configuration too. I assume your comment pertains to the domain configuration in the middle? If so, yes I suppose I could put this at the end as an optional change. But the other two pieces are required IMHO.
-
Melebius almost 5 years@JohnMee The
head
file is the source used to generate/run/resolvconf/resolv.conf
. However, I wouldn’t edit this file, too. -
Tomofumi almost 5 yearsOn my new 18.04.2 install, just change the "hosts" ordering at nsswitch.conf works already.
-
Slicedpan over 4 yearsThis is the only answer I've seen so far which replicates the behaviour in previous versions of Ubuntu (and other linuxes), i.e. the list of DNS servers is provided by DHCP and the address resolution is never cached locally.