为什么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 

我面临同样的问题。 我现在使用的解决方法是:

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

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

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

     sudo service NetworkManager restart 

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

 # 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