为什么 DNS 解析第一次尝试时不起作用?

为什么 DNS 解析第一次尝试时不起作用?

自从升级到 16.04 以来,第一次尝试任何网站的 DNS 解析都会失败(返回“Host Not Found”)。然后我可以立即尝试第二次,并且一切正常。

一点背景知识:

  • 我的网络上有一台运行旧版本 Ubuntu 的服务器和一台 Windows PC。这两台计算机均未受到影响(使用与问题计算机相同的 DNS 服务器)。
  • 在网上搜索了一番后,我听从了某人的建议,
    删除并清除了 resolvconf。这解决了问题……直到我
    重新启动。然后 DNS 解析根本不起作用(我修复了这个问题,但现在又回到了原点)。

就我有限的理解而言,似乎发生的情况是,当对新网站的查询到达本地 DNS 缓存(resolvconf?)时,该网站不在缓存中,因此回复为空。然后,当相同的查询再次出现时,某个进程在此期间解析了该地址并更新了缓存,因此缓存会使用该地址进行回复。

我想要的是,如果请求的地址不在缓存中,它会在回复之前去查找它第一的时间。有人能告诉我如何实现这一点吗?

以下是 dig 的输出(第一次):

~$ dig www.foo.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.foo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 6505
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.foo.com.              IN      A

;; Query time: 23 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Thu Jun 02 13:44:49 JST 2016
;; MSG SIZE  rcvd: 34

几秒钟后,这是 dig 的输出(第二次):

~$ dig www.foo.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.foo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53490
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.foo.com.              IN      A

;; ANSWER SECTION:
www.foo.com.       14310   IN      CNAME   foo.com.
foo.com.           210     IN      A       192.0.79.33
foo.com.           210     IN      A       192.0.79.32

;; Query time: 0 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Thu Jun 02 13:46:19 JST 2016
;; MSG SIZE  rcvd: 92

答案1

我遇到了同样的问题。我现在使用的解决方法是:

  • 打开网络管理器配置文件:

    sudo nano /etc/NetworkManager/NetworkManager.conf 
    
  • 修改以下行:

    #dns=dnsmasq
    
  • 保存并重启管理器:

    sudo service NetworkManager restart
    

答案2

我遇到了同样的问题。我现在使用的解决方法是将辅助 DNS 服务器添加到我的 /etc/resolv.conf:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
nameserver 192.168.1.1
search lan

另外,我安装了 dnsmasq,它可以缓存所有 dns 查询。因此,所有请求首先转到 dnsmasq (127.0.0.1),如果域未缓存,则请求转到 192.168.1.1(我的路由器也运行 dns 服务器,当然您可以使用 8.8.8.8 之类的地址)

我知道这个解决方法并不理想 - 但目前为止它是有效的。顺便说一下,我也在使用全新安装的 Ubuntu 16.04

相关内容