首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使系统解析停止尝试使用脱机DNS服务器?

如何使系统解析停止尝试使用脱机DNS服务器?
EN

Unix & Linux用户
提问于 2018-09-02 02:57:21
回答 2查看 12.5K关注 0票数 9

我已经将我的DHCP服务器配置为提供两个名称服务器来进行冗余,这样如果一个离线,另一个就可以使用。

我已经用systemd-resolved配置了我的个人电脑,根据resolvectl status,它已经收集了所有的DNS服务器(IPv4和IPv6两个地址),并且正在使用一个作为当前的服务器。

但是,如果DNS服务器脱机,systemd-resolved不会切换到下一个服务器,而是继续尝试连接到脱机服务器,从而导致所有未缓存的名称解析失败。

如果我运行systemctl restart systemd-resolved,那么它将切换到另一台服务器并继续工作,但它会在一段时间后随机切换回脱机服务器,并且名称解析将再次失败。

我如何告诉systemd-resolved停止使用离线DNS服务器,并迅速切换到它所知道的其他服务器之一?

日志只有在它切换到使用脱机服务器时才会显示这一点:

代码语言:javascript
复制
systemd-resolved[1985]: Using degraded feature set (UDP) for DNS server fdxx::x.
systemd-resolved[1985]: Using degraded feature set (TCP) for DNS server fdxx::x.

当这种情况发生时,所讨论的服务器是完全脱机的,并且不响应pings。

EN

回答 2

Unix & Linux用户

发布于 2018-09-02 08:07:43

DNS专业人员早就知道,如果您希望在任何网络中具有DNS服务弹性,则不应将此决定留给客户端实现。

这是一个太重要的决定,留给客户端的解析器实现。

虽然从理论上讲,客户端应该在第一次失败时返回到第二次DNS,但由于多种原因,这种情况往往不会发生。在我的职业生涯中,我在整个网络中看到了巨大的失败,人们在实现一些事情时都指望客户端操作系统解析器足够聪明。

您通常所做的实际上是根名称服务器正在做的事情,即创建DNS集群来接管DNS服务器的虚拟IP地址。最常用的技术是DNS选播。您还可以尝试更简单的体系结构,比如使用“保持生存”。

然而,不管你做什么,我都强调不要把这个决定留给客户。

请参阅IPv4 Anycast与Linux和Quagga

传统的安全措施是为给定的站点建立多个DNS服务器。网络上的每个DNS客户端都配置了每个服务器的IP地址。所有这些服务器以灾难性的方式失败的可能性相当小,所以您有一个安全范围。另一方面,许多存根解析器只需要两个DNS服务器,因此在DNS拓扑中几乎不可能有任何有意义的地域分散。DNS存根解析器通常只使用两个配置的DNS服务器中的第一个服务器。因此,最终只有一台服务器承担整个查询负载,另一台处于闲置状态,等待失败。不是最优的,但是嘿,这就是redundancy...right的价格?不一定非得这样。DNS冗余和故障转移是anycast的典型用例。Anycast的概念是获取一个IP地址,并在多个服务器之间共享它,每个服务器都不知道其他服务器。DNS根名称服务器广泛使用anycast。

PS。过去,我在两个ISP和一个大学中使用iBGP和OSPF实现了anycast DNS,大大提高了DNS服务的正常运行时间。

票数 9
EN

Unix & Linux用户

发布于 2018-09-02 03:49:14

通过DHCP使用多个名称服务器是为了弹性,而不是冗余。似乎您正在尝试使用多个名称服务器,也就是说每个客户端将跟踪名称服务器是否没有响应,并停止使用它。如果您真的想要这种类型的行为/设计,那么您需要通过DNS服务器本身来利用它,DNS客户端通常无法做到这一点。这里经常看到的方法是使您的DNS服务器HA (高度可用),针对它正在解决的上游DNS服务器。

为了说明为什么这不能工作,请看一下/etc/resolv.conf文件是如何工作的。向DHCP中添加多个名称服务器将为每个客户端在其/etc/resolv.conf文件中提供2个条目。此文件只能为处理多个名称服务器提供以下机制:

man resolv.conf

解析器应该查询的名称服务器的名称服务器IP地址IP地址,或者是IPv4地址(以点符号表示),或者是冒号(可能是点)符号中的IPv6地址,如RFC 2373所示。最多可列出MAXNS (目前为3台,请参见)名称服务器,每关键字一台。如果有多台服务器,解析器库将按所列顺序查询它们。如果没有名称服务器条目,默认情况是在本地计算机上使用名称服务器。(所使用的算法是尝试名称服务器,如果查询超时,请尝试下一步,直到退出名称服务器,然后重复尝试所有名称服务器,直到进行最大数量的重试。)

这句话说:

如果有多台服务器,解析器库将按所列顺序查询它们。

解析器不做任何事情来管理这个列表,它将盲目地继续使用列表,每次从第一个条目开始,再从第二个条目开始。唯一可以控制它的事情是更改timeoutretriesrotate

timeout:n设置解析器等待来自远程名称服务器的响应的时间量,然后通过不同的名称服务器重新尝试查询。以秒为单位,缺省值为RES_TIMEOUT (当前为5,参见)。此选项的值被默认限制为30。尝试:n设置解析器在放弃并向调用应用程序返回错误之前将查询发送到其名称服务器的次数。缺省值是RES_DFLRETRY (当前为2,参见)。此选项的值被默认限制为5. RES_ROTATE sets in _res.options,这将导致从列出的名称服务器中循环选择名称服务器。这样做的效果是将查询负载分散到所有列出的服务器中,而不是让所有客户端每次都先尝试第一个列出的服务器。

参考资料

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/466336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档