为什么resolv.conf中的127.0.0.1会导致DNS解析出现问题?

[更新和更新II:根据其中一个答案,在问题的最后看到我的尴尬和正确的解决方案]

当我的resolv.conf文件包含127.0.0.1 IP地址时,我的DNS查询速度非常慢,实际上,很多名称都没有得到解决,因为它(肯定会)超时。

我在这里找到了一个看似有效答案的问题:

DNS查询速度极慢

除了我可以看到dnsmasq工具正在运行IP范围192.168.122.2到192.168.122.254。 这看起来像VirtualBox和qemu使用的IP,所以我想如果我关闭dnsmasq,从虚拟系统访问Internet将失败!

缓慢和/或超时会有另一个原因吗? (请注意,问题在特定系统中更为突出,例如所有stackoverflow网站上的用户图片,包括askubuntu,当问题发生时。)

此时我从resolv.conf文件中删除了IP,并在我浏览时绕过了问题,但我认为这不是最好的解决方案(当然,每次重启都会重新安装IP!)我d喜欢这个问题的更永久的解决方案,仍然允许我按预期运行虚拟系统。

PS我没有运行网络管理器。


/ etc / network / interfaces的内容

请注意,在eth1上添加第二个IP之前我遇到了问题(即eth1:0)。

# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth1 iface eth1 inet static address 162.226.130.121 netmask 255.255.255.248 network 162.226.130.120 broadcast 162.226.130.127 gateway 162.226.130.126 auto eth1:0 iface eth1:0 inet static name Local network address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.254 # bridge for virtual box auto br0 iface br0 inet static address 192.168.2.1 netmask 255.255.255.0 network 192.168.2.0 broadcast 192.168.2.255 bridge_ports eth3 bridge_stp off bridge_maxwait 0 bridge_fd 0 

启动后/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 search m2osw.com nameserver 192.168.122.1 nameserver 206.13.31.12 nameserver 206.13.28.12 

更新:

我自己也没有写答案,因为我在这里使用了另一个答案来解决我的问题,虽然这不是我想要做的,但这是目前最简单的解决方案。 下面的resolvconf作者引用的错误,可在此处找到:

https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/933723

清楚地说明如果你想使用bind9,你将在你的resolv.conf文件中获得命名空间127.0.0.1。 没有选择。 (RESOLVCONF = no似乎没有做任何事情,虽然重启后我可能会有一个惊喜,我很快就会做!)

作为旁注:如果我将/etc/resolvconf/resolv.conf.d/tail softlink指向/ dev / null(如下所述),那么我得到一个如下所示的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 

换句话说,我仍然得到127.0.0.1,这是此时的罪魁祸首。 但是我也完全失去了其他两个名称服务器,即使它们在我的eth1接口中已明确指定。 这就是说,查看/ run / resolvconf / interface /目录,我看到一个eth1.net和lo.named文件。 lo.named被复制到resolv.conf,但不是eth1.net。 我不知道如何创建这些文件然后将其复制到resolv.conf,但这是resolvconf使用的动态…

无论如何,bug中提到了两个解决方案:

(1)删除/etc/resolv.conf软链接并将其替换为您想要的纯文件。 这可能适合您,但我认为保留默认动态文件是最好的。

(2)更改bind9设置,以便BIND可以响应那些本地DNS请求。 有趣的是,现在名称将缓存在您的计算机上。 所以这并不全是坏事。 话虽这么说,我对打开所有域名的名称服务器并不太感兴趣…但是这样做有效,我不必破坏动态resolv.conf。

为了以防万一,有一个示例设置为绑定使其工作:

 options { [...] forwarders { // Google DNSes 8.8.8.8; 8.8.4.4; }; [...] }; 

更新II:

好的! 重新启动删除了/ run / resolvconf / interface目录中的lo.named文件。 这必须是因为如果RESOLVCONF = yes,bind知道创建它,但是如果RESOLVCONF = no,它不会删除它。 但是,重新启动会解决这个问题,因为/ run目录是一个RAM磁盘。

在没有该文件的情况下,/ etc / resolv.conf的设置正是我所期望的,这是我在/ etc / network / interface中找到的eth1定义中定义的名称服务器列表,如前所示。

所以…这是一个很大的混乱,因为有很多因素,在某些情况下需要重新启动!

1:将dns-nameservers dns-search选项添加到/ etc / network / interfaces。

 auto eth1 iface eth1 inet static address 162.226.130.121 netmask 255.255.255.0 gateway 162.226.130.126 dns-nameservers 8.8.8.8 162.226.130.126 dns-search m2osw.com 

2:从/etc/resolvconf/resolv.conf.d/文件中删除所有dns-选项。 在nameserver 127.0.0.1之后,resolv.conf包含nameserver选项,表明存在此类错误。 如果/etc/resolvconf/resolv.conf.d/tail是符号链接,请将其设置为/dev/null的符号链接。

3:降低eth1。

 sudo ifdown eth1 sudo ifup eth1 

4:查看/etc/resolv.conf。 nameserver 127.0.0.1仍然存在并且仍然延迟了对DNS查询的回复吗? 如果是,那么找出nameserver 127.0.0.1行的来源。 有些东西正在注册监听地址127.0.0.1,而没有在127.0.0.1启动本地名称服务器。 (i)一种可能性是bind9包。 如果您没有运行本地BIND名称服务器,则清除bind9包( sudo apt-get purge bind9 )。 如果您正在运行不提供常规Internet名称服务的BIND名称服务器,请编辑/ etc / default / bind9并设置RESOLVCONF=no ,然后重新启动名称服务器。 请参阅: https : //bugs.launchpad.net/ubuntu/+source/bind9/+bug/933723 (ii)另一种可能性是您在系统上有dnsmasq或类似包的残余。 清除那个包裹。 同时清除网络管理器,因为您没有使用它。

5:重新启动并查看是否有所改进,然后在此处报告。

使用具有环回地址的dns服务器(例如127.0.0.1)会导致问题:

resolvconf会忽略优先级较低的所有其他dns服务器。

dns服务器的优先级由定义dns-server的网络接口定义。

请参阅/etc/resolvconf/interface-orderman 5 interface-order

幸运的是,有一个环境变量可以改变这种行为:

 TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS 

man 8 resolvconf

如果放

 TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS=no 

/etc/default/resolvconf重新启动resolvconf服务,所有其他dns服务器将显示在/etc/resolv.conf

如果您使用静态IP声明来/ / etc / network /接口,那么您还负责声明DNS名称服务器地址。 我建议:

 auto eth1 iface eth1 inet static address 162.226.130.121 netmask 255.255.255.0 gateway 162.226.130.126 #Isn't the gateway actually xx.1?? dns-nameservers 8.8.8.8 162.226.130.126 #or any others you prefer. 

我想你可以单独留下resolv.conf,根据需要由系统重写。