我正在尝试获取 *。当地的域以将 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,域名中不允许使用下划线。就我而言,这是一个问题。dig
并nslookup
使用他们自己的方式解析名称,并且对此表示同意。 Ping 使用系统库但失败。实际上,如果名称的一部分以下划线开头或结尾,则 ping 无法解析。
答案4
在一小部分用例中(例如我的:Fedora Core 31,较长的升级历史),问题在于将nss-mdns
avahi-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
也可以,但这是安装时的默认设置。我还没有决定这是否是我必须做的长期解决方案,但希望这对其他一些可怜的灵魂有用。