我可以解析 *.local 域,对 IP 执行 ping 操作,但无法 ping 该域

我可以解析 *.local 域,对 IP 执行 ping 操作,但无法 ping 该域

我正在尝试获取 *。当地的域以将 DNS 服务器与 vagrant-dns 一起使用。为了让它工作,我设置了 dnsmasq 在它前面运行。

NetworkManager 已安装但设置为dns=none

解决.conf:

nameserver 127.0.0.1 #this points to dnsmasq

测试解决:

$ nslookup domain.local
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   domain.local
Address: 10.222.222.22

Dig 解决了同样的问题:

$ dig domain.local

; <<>> DiG 9.10.3-P4-Debian <<>> domain.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18052
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;domain.local.      IN  A

;; ANSWER SECTION:
domain.local.   86400   IN  A   10.222.222.22

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jan 29 19:18:52 CST 2017
;; MSG SIZE  rcvd: 49

这是正确的地址。我可以 ping 通 ip:

ping 10.222.222.22
PING 10.222.222.22 (10.222.222.22) 56(84) bytes of data.
64 bytes from 10.222.222.22: icmp_seq=1 ttl=64 time=0.185 ms

但我无法 ping 通该地址:

$ ping domain.local
ping: domain.local: Name or service not known

我还尝试从浏览器加载那里托管的页面,但出现 DNS 错误。奇怪的是,所有其他站点似乎都工作正常,尽管我无法判断它是否使用本地主机 DNS 服务器。

使用 debian 8 Jessie/测试

答案1

我找到了答案!因此,大多数人都会知道 /etc/hosts 文件将解析域,有点像 DNS 服务器。但是系统如何知道要查找该文件呢?它如何知道以什么顺序查看该文件或 DNS 服务器?

有一个文件:/etc/nsswitch.conf

我有这样一句话:

hosts:          files myhostname mdns4_minimal [NOTFOUND=return] dns

这意味着首先检查文件,例如 /etc/hosts。然后检查系统主机名。然后是 mdns4,我认为它是用于查找本地网络上其他机器的协议。

mdns4之后是我的阻碍。[NOTFOUND=return]。 mdns 查找以 . 结尾的名称.local。如果找不到,它不仅会传递到下一个也是最后一个搜索方法dns,它实际上会停止并告诉您的系统该域不存在。由于我在 dnsmasq 中设置的域是一个.local域,因此它永远不会到达那里。

所以有两种方法可以解决这个问题。第一个是删除[NOTFOUND=return]。这就是我选择的方式,而且效果很好。有一个小的延迟,因为我认为 mdns 会看到.local并在将其传递给 之前尝试查找它dns

这就是我的文件现在的样子:

hosts:          files myhostname mdns4_minimal dns

另一个选择是,因为我并不真正使用 mdns,所以我可以完全删除它,或者有一种方法告诉它使用不同的 tld,例如.alocal- 但我认为这也会有效地禁用它。

答案2

就我而言,我有多个名称服务器行/etc/resolv.conf,我想使用的行位于第一行。

我读了说明书,上面写着:

如果有多个服务器,解析器库将按列出的顺序查询它们。

但我发现它总是首先选择最后一个名称服务器。

所以,我颠倒了行/etc/resolv.conf

问题解决了。

答案3

根据 RFC,域名中不允许使用下划线。就我而言,这是一个问题。dignslookup使用他们自己的方式解析名称,并且对此表示同意。 Ping 使用系统库但失败。实际上,如果名称的一部分以下划线开头或结尾,则 ping 无法解析。

答案4

在一小部分用例中(例如我的:Fedora Core 31,较长的升级历史),问题在于将nss-mdnsavahi-daemon 套接字的路径硬编码为,/var/run/avahi-daemon/socket但我/usr/lib/systemd/system/avahi-daemon.socket指定了不同的套接字路径

ListenStream=/run/avahi-daemon/socket

而且,除非您已/var/run符号链接到/run(或/var/run/avahi-daemon符号链接到/run/avahi-daemon),否则它将无法连接。我在下面写回复时偶然发现了这一点红帽 bugzilla 错误和跑步

strace  -e open,openat,connect,read /usr/bin/getent hosts MY_PRINTER_NODE.local

在调试并尝试为开发人员/维护人员准备足够的有用信息时,我注意到它无法连接:

connect(3, {sa_family=AF_UNIX, sun_path="/var/run/avahi-daemon/socket"}, 110) = -1 ENOENT (No such file or directory)

出于好奇,我nsswitch.conf使用了以下行:

hosts:      files mdns4 [NOTFOUND=return] dns myhostname

我有一个/etc/mdns.allow文件

.local
.local.

我已经尝试了这里以及其他论坛和问题中提到的所有其他方法,但没有任何效果。我这样做之后:

ln -s /run/avahi-daemon /var/run/avahi-daemon

名称.local解析有效、ping有效、getent有效......所有这些都无需重新启动任何服务。

我想更改ListenStream路径/usr/lib/systemd/system/avahi-daemon.socket也可以,但这是安装时的默认设置。我还没有决定这是否是我必须做的长期解决方案,但希望这对其他一些可怜的灵魂有用。

相关内容