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

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

[更新和更新 II:请参阅问题末尾基于其中一个答案的尴尬和适当的解决方案]

当我的文件包含 127.0.0.1 IP 地址时,我的 DNS 查找速度非常慢resolv.conf,实际上,许多名称根本无法解析,因为它(肯定)超时了。

我发现了以下一个问题,其答案看似有效:

DNS 查找速度极慢

但我可以看到 dnsmasq 工具正在为 192.168.122.2 至 192.168.122.254 范围内的 IP 运行。这看起来像 VirtualBox 和 qemu 使用的 IP,所以我可以想象,如果我关闭 dnsmasq,从虚拟系统访问互联网将会失败!

是否还有其他原因导致速度慢和/或超时?(请注意,当问题发生时,问题在特定系统(例如所有 stackoverflow 网站(包括 askubuntu)上的用户图片)上更为突出。)

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

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,您将在文件中获取命名空间 127.0.0.1 resolv.conf。别无选择。(RESOLVCONF=no似乎什么也没做,不过我可能会在重启后得到惊喜,我很快就会这样做!)

附注:如果我将/etc/resolvconf/resolv.conf.d/tail软链接指向/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.netlo.named文件。lo.named复制到resolv.conf,但没有eth1.net。我不知道这些文件是如何创建然后复制到的,resolv.conf但这就是所使用的动态resolvconf...

无论如何,错误中提到了两种解决方案:

(1)删除/etc/resolv.conf软链接,用一个包含你想要的内容的纯文件替换它。这可能对你有用,但我认为保留默认的动态文件是最好的。

(2) 更改 bind9 设置,以便 BIND 可以响应这些本地 DNS 请求。有趣的是,现在名称将缓存在您的计算机上。所以这并非全是坏事。话虽如此,我并不太想向nameserver所有域名开放我的域名……但这样做有效,我不必破坏动态 r esolv.conf

为了以防万一,这里有一个绑定的示例设置,以使该功能能够正常工作:

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

更新二:

好的!重启删除了/run/resolvconf/interface目录中的 lo.named 文件。这肯定是因为 bind 知道在 时创建它RESOLVCONF=yes,但在 时不会删除它RESOLVCONF=no。但是,重启可以解决这个问题,因为该/run目录是一个 RAM 磁盘。

如果没有该文件,那么/etc/resolv.conf设置的设置将与我期望的完全一致,即如前所述nameservers在我的eth1定义中找到的列表/etc/network/interface

所以......这是一个大麻烦,因为有很多因素,而且在某些情况下需要重新启动!

答案1

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:dns-从 中的文件中删除所有选项/etc/resolvconf/resolv.conf.d/。resolv.conf 包含nameserver之后的选项nameserver 127.0.0.1表明存在此类冗余。如果 /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 或类似软件包。请清除该软件包。此外,请清除 network-manager,因为您不再使用它。

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

答案2

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

所有其他具有较低优先级的 DNS 服务器都将被忽略resolvconf

DNS 服务器的优先级由定义 DNS 服务器的网络接口定义。

参见/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

答案3

如果您使用静态 IP 声明填充 /etc/network/interfaces,那么您还负责声明 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,以便系统根据需要重写它。

相关内容