我在使用 docker 网络(特别是自定义 DNS 代理设置)时遇到了一些问题,我发现我的 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
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 172.17.0.1
nameserver 10.0.0.10
nameserver 127.0.0.53
因此,3d 方自定义 DNS 代理基本上将第三个 IP 更改为如下所示:
#nameserver 127.0.0.53
nameserver [proxy-dns-entry-ip]
我在这个 DNS 下对主机名的所有请求都被打破10.0.0.10
了nslookup
:
$ nslookup container1.hostname
;; Got recursion not available from 172.17.0.1, trying next server
Server: 10.0.0.10
Address: 10.0.0.10#53
** server can't find container1.hostname: NXDOMAIN
$ nslookup container1.hostname [proxy-dns-entry-ip]
Server: 192.168.144.3
Address: 192.168.144.3#53
Non-authoritative answer:
Name: container1.hostname
Address: 192.168.128.3
Name: container1.hostname
Address: 192.168.128.3
我已经编辑了文件,只是注释掉了前两个 IP 地址,并且新的 DNS 工作正常,当这个代理被禁用并且唯一的条目是127.0.0.53
时,主机网络也工作正常(比如,我可以 ping google并使用我的浏览器),码头工人和容器也在工作。
我对网络很陌生(尤其是 Linux)。有人可以向我解释这 3 个地址发生了什么以及它们如何与 ubuntu 的 DNS 服务器耦合(我的意思是我在 GUI 网络设置中定义的那些)?
我将不按顺序回答您的问题,因为它们都略有不同,而且还因为一个问题的答案将帮助您理解另一个问题的答案,等等。
回答 #2:DNS 服务器如何在您的系统中工作,以及部分回答 #3 关于 resolv.conf 的作用
当您的系统中使用了多个 DNS 服务器时,它们会按顺序进行查询。所以如果我的 resolv.conf 有:
...那么任何在您的系统上请求 DNS 记录的东西都将首先尝试 1.2.3.4。如果 1.2.3.4 响应,那么它就结束了(包括 SERVFAIL 错误响应和 NXDOMAIN 响应,两者都是“有效回复”)。但是,如果它在响应中超时,并且没有返回响应,那么它会尝试下一个服务器 - 5.6.7.8。如果 5.6.7.8 响应,那么它会停在那里。如果没有响应,则继续尝试 10.10.1.0。这种情况一直持续到按顺序列出的服务器之一给出响应或它们都超时。这是 DNS 的设计,“第一个实际回复的是我们处理的”
这是因为它的查找顺序依次为 Primary、Secondary、Tertiary、Quaternary 等。第一个响应停止查找链。
您列表中的最后一个和此处的示例列表中的 127.0.0.53 进入您的 SystemD ResolveD 存根,这是#3 的答案所在。
对#3 的回答:这与您的 GUI 设置有何不同?
简而言之,
resolv.conf
用于确定您的 DNS 服务器优先级设置。通常在 18.04 中,它只会指向127.0.0.53
哪个是您的systemd-resolved
处理程序。反过来,您的
systemd-resolved
处理程序将由您的网络管理器 GUI 设置提供,您的 DNS 服务器用于其递归查询。这是我的 GUI 设置提供给systemd-resolved
我的 wifi 连接的设置示例:当您的系统收到一个 DNS 查询并将其交给 127.0.0.53 时,会发生什么情况,它将检查其本地 DNS 缓存以查看是否有已知记录。然后,如果失败,它会查询系统中指定的 DNS 服务器。在这种情况下,假设 my
resolve.conf
是一个基本系统,如下所示:... 将导致查找
google.com
到本地systemd-resolved
实例,如果它没有缓存的 DNS 条目,它将使用来自内部的 DNS 请求转到 10.10.1.0resolved
。但是,在您的系统中,根据答案 #2,行为会有所不同,因为您的 resolv.conf 中有多个其他修订版会破坏此过程。
对#1 的回答:这些地址是什么?
某人或某事更改了您的 resolv.conf 系统以添加这些附加地址。
那是你或 Docker 做的。10.0.0.10 可以是另一个 Docker 实例或另一个 Docker 侦听器,通过 dnsmasq 或您环境中的此类或其他网络添加。
不幸的是,我们无法深入了解 10.0.0.10,因为它可能是任何东西。我们可以 ID 172.17.0.1 因为你说它是 Docker,而 127.0.0.53 因为那是 SystemD ResolveD。
正如我在上面对#2 和#3 的回答中所说的,127.0.0.53 是
systemd-resolved
您的 GUI DNS 设置。对 #4 的回答:如何使更改永久化?
除非您删除符号链接,否则文件将由
resolvconf
. 除非您resolvconf
以其他方式配置,否则它将是一个符号链接。进行永久更改的唯一方法是破坏符号链接,然后简单地拥有一个静态文件。因此,要使用 Docker DNS 和系统 DNS,您将拥有一个静态文件,/etc/resolv.conf
其中包含以下内容:这将是一个永久的配置设置,直到您更改它或将 resolv.conf 设置回符号链接。
然而不幸的是,除了删除符号链接并用静态文件替换之外,“没有办法”告诉
resolvconf
在此处保留一组永久命令。还有其他更复杂的方法,例如拥有一个单独配置的 DNS 服务器系统,但这超出了“正常”的范围,并且绝对是您可能不想开始研究的“一种 hacky 解决方法”。