avahi:ping 无法解析主机名,但 nslookup 可以

Aar*_*lla 42 linux dns ping

ping告诉我它无法解析 URL 中的某些主机名(“ping:unknown host domain.company.local”)但是当我在命令行上使用hostnslookup在同一台计算机上时,解析工作正常(即它快速可靠)。

什么可能导致这种情况?

更多测试:Firefox,wgetping有同样的问题。Ping IP 地址有效。

操作系统:Linux(Ubuntu 13.04)

编辑我的/etc/resolv.conf阅读:

nameserver 127.0.1.1
search domain.company.local
Run Code Online (Sandbox Code Playgroud)

netstat 报告:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      -               
Run Code Online (Sandbox Code Playgroud)

所以这个端口上正在运行一些东西(nslookup也报告它127.0.1.1用作 DNS 服务器)。

没有/etc/*inetd.conf,所以我不确定哪个应用程序为这个端口提供服务。

似乎dnsmasq是这样使用的:

/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces
   --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1
   --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec
   --enable-dbus=org.freedesktop.NetworkManager.dnsmasq
   --conf-dir=/etc/NetworkManager/dnsmasq.d
Run Code Online (Sandbox Code Playgroud)

所有配置文件和文件夹都是空的。因为nslookup说它使用127.0.1.1#53我的猜测是dnsmasq即使没有配置也能工作。但是它如何知道要查询哪个父 DNS?

EDIT2dnsmasq按照harrymc 的建议禁用并没有帮助。所以我跑了strace ping这给了我这个奇怪的输出(只是有趣的部分):

open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
read(4, "127.0.0.1\tlocalhost\n#127.0.1.1\ta"..., 4096) = 613
...
open("/lib/libnss_mdns4_minimal.so.2", O_RDONLY|O_CLOEXEC) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\f\0\0\0\0\0\0"..., 832) = 832
...
mmap(NULL, 2105560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7f7829b00000
...
socket(PF_FILE, SOCK_STREAM, 0)         = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
connect(4, {sa_family=AF_FILE, path="/var/run/avahi-daemon/socket"}, 110) = 0
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fstat(4, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f782a4f8000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(4, "RESOLVE-HOSTNAME-IPV4 domain.com"..., 44) = 44
read(4, "-15 Timeout reached\n", 4096)  = 20
Run Code Online (Sandbox Code Playgroud)

所以ping看起来/etc/hosts是有道理的。然后它加载和mmap()s/lib/libnss_mdns4_minimal.so.2这也有意义。

但是它会和avahi说话!?

这让我看到了这个论坛帖子:ping does not make a dns request

我的/etc/nsswitch.conf也包含这一行:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
Run Code Online (Sandbox Code Playgroud)

如果我ping是一个工作地址,我会看到该进程也会加载,/lib/libnss_mdns4_minimal.so.2但是,它会通过端口 53 进行 DNS 查询。

所以我的猜测是现在/lib/libnss_mdns4_minimal.so.2不知何故注意到 IP 地址以 结尾.local而不是 ,.com然后[NOTFOUND=return]触发 。

我该如何解决?

Aar*_*lla 34

正如这篇博文中详细描述,您需要编辑/etc/avahi/avahi-daemon.conf

[server]
domain-name=.alocal
Run Code Online (Sandbox Code Playgroud)

这将守护进程绑定到域.alocal而不是默认的.local

并使用以下命令重新启动守护程序:

sudo service avahi-daemon restart
Run Code Online (Sandbox Code Playgroud)

博客文章中的注意事项:

您可能需要刷新 DNS、mDNS 和解析器缓存,以及重新启动 Web 浏览器以清除其内部缓存。

在那之后,pingnslookup开始同意。

感谢harrymc让我走上正轨。

  • 这真太了不起了。非常感谢。在找到这篇文章之前,与这个斗争了几个小时。 (2认同)

小智 11

修改 /etc/nsswitch.conf 并替换:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
Run Code Online (Sandbox Code Playgroud)

经过:

hosts:          files dns
Run Code Online (Sandbox Code Playgroud)

为我工作。

  • 这是以 [AVAHI 服务](http://www.avahi.org/) 为代价的 (2认同)

Mik*_*awg 8

简单的事情:编辑 /etc/default/avahi-daemon

更改行:

AVAHI_DAEMON_DETECT_LOCAL=1
Run Code Online (Sandbox Code Playgroud)

AVAHI_DAEMON_DETECT_LOCAL=0
Run Code Online (Sandbox Code Playgroud)

重新启动avahi-daemon,或杀死它。

我不喜欢 Avahi,也不使用它的任何功能。如果要真正禁用avahi,修改/etc/init/avahi-daemon.conf,类似如下:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus
Run Code Online (Sandbox Code Playgroud)

  • 我不在乎你是否不应该在这里发表“感谢”评论,我只是想表达我的感谢以及你为我节省了多少时间和精力。非常感谢!我正在使用公司 VPN 从商场做一些紧急工作,尽管我想尝试一切,但无法使我们的某些站点正常工作。我自己无法解决这个问题,这是肯定的...... (2认同)

小智 7

似乎无法在 ubuntu 中访问 .local 地址。

解决方案是编辑/etc/nsswitch.conf和更改此行:

hosts:          files mdns4_minimal [NOTFOUND=return] dns
Run Code Online (Sandbox Code Playgroud)

这样 :

hosts:          files dns
Run Code Online (Sandbox Code Playgroud)