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

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

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

这可能是什么原因造成的?

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

操作系统:Linux(Ubuntu 13.04)

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

nameserver 127.0.1.1
search domain.company.local

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      -               

因此某些东西正在此端口上运行(nslookup还报告它用作127.0.1.1DNS 服务器)。

没有/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

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

编辑2按照 harrymc 的建议禁用dnsmasq并没有帮助。所以我运行了,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

因此,ping查找/etc/hosts有意义的内容。然后加载并mmap()s /lib/libnss_mdns4_minimal.so.2,这也是有意义的。

但随后它会与 avahi 对话!?

这让我看到了这个论坛帖子:ping 不会发出 dns 请求

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

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

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

我该如何解决?

答案1

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

[server]
domain-name=.alocal

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

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

sudo service avahi-daemon restart

博客文章中的注释:

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

之后,pingnslookup开始同意了。

谢谢哈里麦克让我走上正确的道路。

答案2

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

经过:

hosts:          files dns

对我有用。

答案3

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

更改此行:

AVAHI_DAEMON_DETECT_LOCAL=1

AVAHI_DAEMON_DETECT_LOCAL=0

重新启动avahi-daemon,或者终止它。

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

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus

答案4

如果您没有通过计算机与其他设备或虚拟机进行连接共享,则可以在网络管理器中关闭 dnsmasq。

编辑/etc/NetworkManager/NetworkManager.conf并注释掉此行(在前面加上#):

dns=dnsmasq

然后做 :

sudo restart network-manager

这将关闭本地解析器。

来源:Ubuntu 12.04 中的 DNS

相关内容