我在新安装的 Ubuntu 16.04 上遇到了 DNS 问题:
kqs@mycomputer:~$ nslookup localserver
Server: 127.0.0.1
Address: 127.0.0.1#53
** server can't find localserver: NXDOMAIN
但如果我指定 DNS 服务器(或者有时我只是等待一会儿),它就可以工作:
kqs@mycomputer:~$ nslookup localserver 192.168.0.1
Server: 192.168.0.1
Address: 192.168.0.1#53
Name: localserver.localdomain
Address: 192.168.0.24
这是网络管理器中首先显示的相同 DNS 服务器:
kqs@mycomputer:~$ nmcli device show
IP4.ADDRESS[1]: 192.168.0.152/24
IP4.GATEWAY: 192.168.0.1
IP4.ROUTE[1]: dst = 169.254.0.0/16, nh = 0.0.0.0, mt = 1000
IP4.DNS[1]: 192.168.0.1
IP4.DNS[2]: 131.215.254.100
IP4.DNS[3]: 131.215.139.100
这似乎与“dnsmasq 有时能解决问题,有时不能“ 和 ”内网地址解析与dnsmasq“,但在该解决方案中,他们dnsmasq
通过注释掉该dns=dnsmasq
行来禁用它/etc/NetworkManager/NetworkManager.conf
。
不过,我更愿意排除故障dnsmasq
,而不是完全绕过它。
我的问题是:
- 我的理解是 是
dnsmasq
在我的计算机上运行的轻量级 DNS 服务器。据推测,网络管理器 DNS 设置用于配置dnsmasq
,但最终它dnsmasq
全权负责处理 DNS 查找(在它认为必要时借助上游 DNS 服务器的帮助)。这样对吗? - 我可以查看如何
dnsmasq
处理特定的 DNS 查找吗?即它是否从缓存中应答?它将它转发到哪个上游 DNS 服务器? - 我可以指示
dnsmasq
对本地域使用特定的 DNS 服务器吗?
答案1
1.dnsmasq
网络管理器
问问几天后的你自己:你的理解是正确的。
但是请注意,网络管理器dnsmasq
作为子进程(而不是单独的守护进程)启动一个实例,并保留其自己的一组 dnsmasq 配置设置。
2. 我可以查看如何dnsmasq
处理特定的 DNS 查找吗?
抱歉,我还是不知道。
3. 我可以指示dnsmasq
对本地域使用特定的 DNS 服务器吗?
是的,(--server
中的选项dnsmasq
手册页在这里) 允许您为特定域指定上游 DNS 服务器。
您可以将此选项传递给网络管理器的调用dnsmasq
。我通过在目录中创建一个文件来实现此目的,/etc/NetworkManager/dnsmasq.d/
文件内容如下:
server=//192.168.0.1
通常情况下,这一行应该是server=/domain/<ipaddr>
;在这种情况下,空域规范意味着“仅不合格的名称”,例如localserver
在您的示例中(而不是localserver.domain
)。
我如何解决你的眼前问题
上述更改仍然没有解决问题。我验证了它已加载(service NetworkManager status
显示日志条目dnsmasq[<pid>]: using nameserver 192.168.0.1#53 for unqualified names
),但它仍然NXDOMAIN
在查找时返回。所以我决定采用以下技巧:
我连接的本地机器都有静态 IP,因此我在一个文件中手动指定了这些 IP,/etc/NetworkManager/dnsmasq.d
内容如下:
address=/localserver/192.168.0.13
address=/localserve2/192.168.0.14
[...and so on...]
答案2
抱歉我来晚了,但你几乎已经回答了问题 2!在你链接的 dnsmasq 手册中有一个名为 的选项--log-queries
。所以很简单:
$ echo "log-queries" > /etc/NetworkManager/dnsmasq.d/log-queries
$ systemctl restart NetworkManager
然后你应该看到类似以下内容的日志:
$ journalctl -f
Jan 21 15:39:15 computor dnsmasq[12345]: query[A] github.com from 127.0.0.1
Jan 21 15:39:15 computor dnsmasq[12345]: forwarded github.com to 8.8.8.8
Jan 21 15:39:15 computor dnsmasq[12345]: forwarded github.com to 8.8.4.4
Jan 21 15:39:15 computor dnsmasq[12345]: reply github.com is 140.82.118.4
(我运行的是 Debian 而不是 Ubuntu,但我希望它会起作用。)
当我们回到你原来的问题时,我认为解决这个问题的合理方法是将这些主机定义添加到你的主机中,/etc/hosts
并强制 NetworkManager 的 dnsmasq 使用它们(请参阅这个问题或者这个答案)。我希望在那里找到本地服务器定义,而不是在 中到处挖掘/etc/NetworkManager/dnsmasq.d/*
。