DNS 服务器应如何传递具有多个响应的上游响应?

DNS 服务器应如何传递具有多个响应的上游响应?

我正在探索我发现的怪癖的技术细节。

我有一个权威的 DNS 服务器,执行全局服务负载平衡。它根据其负载平衡算法按优先顺序响应多个 IP 地址。因此,例如,如果所有服务都正常,但 xyz3 的负载最少,则响应可能如下所示:

x.y.z.3
x.y.z.1
x.y.z.2

然而,我发现如果用户使用 Google 的 DNS (8.8.8.8),他们会得到与上述完全相同的响应。然而,OpenDNS 似乎进一步循环这些响应。

换句话说,使用 8.8.8.8 作为 DNS 服务器的用户将始终收到此响应:

x.y.z.3
x.y.z.1
x.y.z.2

但使用 OpenDNS 的用户可以按任何顺序看到它们。

我可以通过仅返回 xyz3 来立即解决此问题,但我想知道:

  1. 还有其他方法可以解决这个问题吗?
  2. 这种行为是否在 RFC 或标准中有所涉及?
  3. OpenDNS 行为是否符合预期并且正确?

答案1

您的直接问题有点难以回答,因为它们建立在与 DNS 的工作方式部分不一致的假设之上。

对于给定的名称、类别和类型的组合,存在的资源记录形成资源记录集(通常称为请求资源集)。
正如该术语所暗示的那样(特别是它是一个),记录的枚举顺序对于系统来说没有任何意义。

我认为,第一个指出这种缺乏秩序的地方是RFC1033

域系统不保证保留资源记录的顺序。按特定顺序列出 RR(例如多个地址记录)并不保证它们将按该顺序使用。

有了这些知识,就已经很清楚,对订购抱有期望意味着依赖于一开始就没有保证的行为。

A接下来,具有多个地址记录 ( / )的记录集的常见用例AAAA是 DNS 中负载平衡的粗略方法。
为了使该功能更好地发挥作用,许多缓存解析器将在每次响应时重新排序记录(无论是循环还是随机排序),以帮助只选择第一个地址的简单客户端应用程序不会在 TTL 长短内都命中同一个地址。
也就是说,标准允许实施这种行为(顺序并不重要),而不是真正要求这样做。

总而言之,您只需考虑记录的顺序没有实际意义,并且可以预期客户端会使用记录集中存在的所有地址。

如果只有负载最小的主机才能获得流量,那么您必须只返回其地址,或者如果客户端软件支持SRV(这排除了 Web 浏览器),则可能利用这一点并调整SRV优先级和/或权重字段以反映您当前的偏好。
但是,请记住,缓存仍将存在,因此,客户端“自行”将负载分散到可用主机上仍然是最好的选择。

相关内容