dnsmasq 故障排除

dnsmasq 故障排除

我在新安装的 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,而不是完全绕过它。

我的问题是:

  1. 我的理解是 是dnsmasq在我的计算机上运行的轻量级 DNS 服务器。据推测,网络管理器 DNS 设置用于配置dnsmasq,但最终它dnsmasq全权负责处理 DNS 查找(在它认为必要时借助上游 DNS 服务器的帮助)。这样对吗?
  2. 我可以查看如何dnsmasq处理特定的 DNS 查找吗?即它是否从缓存中应答?它将它转发到哪个上游 DNS 服务器?
  3. 我可以指示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/*

相关内容