为什么 NS 记录不包含 IP 地址?

Paw*_*mhm 21 domain-name-system

NS 记录的目的是告诉客户端哪个名称服务器肯定知道域名的实际 IP 地址。因此,例如,以下查询告诉您,如果您想获得有关facebook.com您必须询问的权威答案a.ns.facebook.com

> dig ns facebook.com                                                                                                                                       19:58:27

; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> ns facebook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32063
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;facebook.com.          IN  NS

;; ANSWER SECTION:
facebook.com.       65000   IN  NS  a.ns.facebook.com.
facebook.com.       65000   IN  NS  b.ns.facebook.com.

;; Query time: 13 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Mar 20 19:58:40 CET 2016
;; MSG SIZE  rcvd: 65
Run Code Online (Sandbox Code Playgroud)

这看起来很酷而且很有用,但我想知道为什么该ANSWER部分包含权威来源的主机名而不是 IP?客户端获取权威来源的实际 IP 地址而不是主机名不是更容易吗?

我的意思是,如果它获得主机名,它将不得不进行另一个查询以将此主机名解析为 IP,然后向这个新 IP 询问facebook.com它正在寻找的初始域。这不是效率低下吗?

我很想知道一些 RFC 中解释这个问题的一些段落的答案。

And*_*w B 41

Jason 提供了解决您描述的问题的 DNS 机制,但我们仍然没有研究为什么要这样做。

假设我拥有example.com,并且我已将我的一些网站内容承包给一家名为Contoso的内容交付公司。他们的平台要求我们委托sub.example.com给他们的名称服务器,以便他们可以控制返回的响应。

; SOA and MX omitted from this example
$ORIGIN example.com.

@           IN      NS            ns1
@           IN      NS            ns2

; delegate sub.example.com to Contoso's nameservers
sub         IN      NS            ns1.cdn.contoso.com.
sub         IN      NS            ns2.cdn.contoso.com.

; this is ours, not Contoso's
www         IN      A             198.51.100.1
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,我们没有指定 Contoso 名称服务器的 IP 地址。我们的服务器所知道的只是告诉互联网“我们不管理sub.example.com,而是问 Contoso”。这非常重要,因为:

  • 我们不拥有 Contoso.com。
  • 我们不能指望 Contoso 与所有客户协调名称服务器 IP 的更改。如果我们的服务器提供这些 IP,这正是必须发生的事情。

到现在为止还挺好。一年过去了,我们不知道 Contoso 正在更改其 CDN 名称服务器的 IP 地址。因为 DNS 以它的方式工作,所以他们所要做的就是更新A他们返回的记录ns1.cdnns2.cdn.contoso.com.

这给我们带来了一个重要的点:Jason 描述的胶水记录的存在是为了处理 DNS 中的“鸡与蛋”场景,例如google.com告诉全世界他们的域名服务器是ns1.google.comns2.google.com。你永远不应该创建指向你不拥有的基础设施的粘合记录,除非它们存在来解决这样的问题:

@           IN      NS            ns1
@           IN      NS            ns2

; delegate sub.example.com to ns1 and ns2.sub.example.com
sub         IN      NS            ns1.sub
sub         IN      NS            ns2.sub

; provide the IP addresses of ns1 and ns2 so that nameservers
; on the internet can find them.
;
; these IP addresses are owned by Contoso, not us, and they must
; coordinate changes to these IPs with us
ns1.sub     IN       A            203.0.113.10
ns1.sub     IN       A            203.1.113.10
Run Code Online (Sandbox Code Playgroud)

这避免了先有鸡还是先有蛋的情况,但也使得 Contoso 必须与我们协调这些名称服务器的每次 IP 更改。这是非常容易发生风险和不可取的。


Jas*_*tin 20

问题的解决方案是 DNS 粘合记录,在什么是粘合记录?.

RFC 1035 第 3.3.11 节规定

“...请注意,该类可能不指示应该用于与主机通信的协议族,尽管它通常是一个强烈的提示。”

返回 IP 地址等同于说明可以联系主机的方法,这与 RFC 背道而驰。

  • 协议族是指IPv4、IPv6 (5认同)
  • 我认为 RFC 在“可能不会”的意义上使用“可能不会”,而不是在禁止的意义上使用。(它早于 RFC2119,它标准化了这种语言以减少歧义。) (3认同)