我使用的是 Raspberry Pi 3 和 Ubuntu 18.04。我公司有一台 DNS 服务器和几个带有“.local”的域名。我知道从技术上讲这是不正确的,应该是“.lan”,因为 .local 是为多播 DNS 保留的。但事实就是如此,无法轻易更改。因此,在我的 Windows 机器上,我可以毫无困难地 ping 和浏览这些域名。但是在我的 Ubuntu 上却不行。
我无法使用 IP,因为某些域位于同一台机器上,并且 IIS 网络服务器会对内容进行排序。
我搜索过并且它经常出现:
- https://smallbusiness.chron.com/resolving-local-ubuntu-38861.html
- 为什么我的本地服务器都无法解析?
- ubuntu 服务器无法解析 LAN 主机名
但是更改 /etc/nsswitch.conf 对我来说不起作用。我试过了
- 主机:文件 mdns4_minimal [NOTFOUND=return] dns myhostname # 默认
- 主机:文件 DNS
- 主机:文件 mdns4_minimal [NOTFOUND=continue] dns myhostname
- 主机:文件 mdns4 [NOTFOUND=return] dns myhostname
- 主机:文件 mdns4 [NOTFOUND=继续] dns myhostname
- 主机:文件 dns mdsn4_minimal myhostname
- 主机:dns
- 其他一些
这些都不起作用。我也尝试过在更改后重新启动。我尝试告诉 avahi,/etc/avahi/avahi-daemon.conf 中的 domain-name=alocal,在服务重启后不起作用,在重新启动后也不起作用。在这次不起作用之后,我尝试完全禁用 avahi-daemon 服务。
sudo systemctl disable avahi-daemon
重新启动后,我再次尝试了 /etc/nsswitch.conf 中的几个排列,但没有任何效果。
使用我当前在主机(文件 DNS)中的设置,我收到以下响应:
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
但是,当我指示 dig 直接查询服务器时,我得到了正确的答案:
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
此版本的 Ubuntu 使用 netplan 和网络管理器。正确的 DNS IP 肯定在列表中。(实际上它是主 DNS。)此外,dnsIp 与 serverIP 相同,但这不应该是问题。
当然,Ping 或通过浏览器连接等方法不起作用。没有使用 dns 查询。
我不知道该怎么办。当然我们不能切换到不同的域名。我将服务器名称放入 /etc/hosts 中,但这只是暂时的解决方案。
答案1
接受的答案没有解决我的问题。这与 avahi 无关 - 我没有安装 avahi 服务。我的系统设置为从 DHCP 获取其 IP 和 DNS 服务器设置。但是,DHCP 提供的 DNS 没有被检查是否使用 .local 进行查询
真正的问题是 Ubuntu 18.04 的 resolv.conf 符号链接到一个存根文件,该文件指向 localhost 进行名称解析。Localhost DNS 名称解析意味着系统拒绝检查提供的 DNS 服务器中的 .local 名称,并(错误地)认为此类名称无效。这是 /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
存根文件的内容是(删除了注释):
cat /run/systemd/resolve/stub-resolv.conf
.. removed comments..
nameserver 127.0.0.53
search reddog.microsoft.com
“真实”的解析配置有“正确的”DNS设置(来自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
为了让系统使用您首选的 DNS 解析器而不是本地主机,您可以将符号链接更改为指向 /run/systemd/resolve/resolve.conf 而不是 /run/systemd/resolve/stub-resolv.conf :
sudo rm -f /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
此后,.local 解析立即开始工作。无需重新启动或重启任何服务。
答案2
我在 Linux Mint 19 (Tara) 上遇到了一个非常相似的问题(即使不是完全相同)。我通过结合 3 条不同的信息成功解决了这个问题。它们似乎都与 systemd-resolved 的最新更改有关。
首先,是的,我需要配置/etc/nsswitch.conf正如您所期望的那样。只要 dns 位于 mdns 之前,您就应该没问题。我最后简单地说:
hosts: files dns myhostname
參考文獻:https://unix.stackexchange.com/a/457172/271210
在升级到此版本的 Mint 之前,这是我唯一需要做的事情。现在,我还做了以下另外两项更改以使其正常运行...
之后,我配置了我的搜索域,以便 systemd-resolved 能够按我的意愿工作。所以我编辑了文件/etc/systemd/resolved.conf, 这域设置下[解决]部分。在我的例子中,它最终看起来像这样:
[Resolve]
#DNS=
#FallbackDNS=
Domains=trilliant.local
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
參考文獻:https://askubuntu.com/a/1031271/872881
我还将 avahi 配置更改为其他内容(如果我没记错的话是“mdns”,但这并不重要)。但据我所知,这不应该是必需的。只是为了完整性而添加。
但在我调用以下命令之前,一切都不起作用:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
參考文獻:https://askubuntu.com/a/938703/872881
调用此函数后,一切都开始完美地运行,正如预期的那样!
所以可能我并不需要改变/etc/systemd/resolved.conf文件,但我保留了这个更改,因为它很有意义,并且允许我只输入机器的名称(而无需完整的 FQDN),以便 DNS 解析正常工作。
答案3
对于我来说,Ubuntu 18.04 的工作方式是:
编辑 avahi 配置:
sudo vim /etc/avahi/avahi-daemon.conf
并将 .local 更改为 .alocal :
[server]
domain-name=.alocal
然后,打开resolved.conf:
sudo vim /etc/systemd/resolved.conf
取消注释并编辑域:
[Resolve]
...
Domains=yourdomain.local
...
最后重新启动服务:
sudo service systemd-resolved restart
sudo service avahi-daemon restart
答案4
对我有用的是将本地 DNS 添加为名称服务器/etc/resolvconf/resolv.conf.d/head
(如所述这里)。
安装 resolvconf 包。
sudo apt install resolvconf
编辑
/etc/resolvconf/resolv.conf.d/head
并添加以下内容:nameserver 8.8.4.4 nameserver 8.8.8.8
重新启动 resolvconf 服务。
sudo service resolvconf restart
该修复应是永久性的。