![无 A 记录时的 DNS 解析](https://linux22.com/image/1547571/%E6%97%A0%20A%20%E8%AE%B0%E5%BD%95%E6%97%B6%E7%9A%84%20DNS%20%E8%A7%A3%E6%9E%90.png)
有一些域名在 DNS 中注册时仅带有 SOA 记录,但没有任何 A 记录(或任何其他记录):
> dig wien.eu
; <<>> DiG 9.9.7-P3 <<>> wien.eu
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51354
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;wien.eu. IN A
;; AUTHORITY SECTION:
wien.eu. 1922 IN SOA dns1.magwien.gv.at. hostmaster.magwien.gv.at. 2013082700 10800 3600 604800 86400
;; Query time: 134 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Sat Dec 02 19:45:19 CET 2017
;; MSG SIZE rcvd: 101
看起来像 A 记录的东西其实只是一条注释(以分号开头)。即使它不是注释,它也是格式错误的(即不是 A 记录),因为它不包含任何 IP 地址。
大多数通常解析域名的命令(例如ping、telnet如果除了 SOA 条目(以及大量注释和空行)之外没有其他内容,则使用 DNS 进行搜索将会失败。
此外,许多网络浏览器无法打开此类 SOA 专用域名上的网站,例如http://wien.eu, 他们之中:
- 谷歌浏览器
- 歌剧
- Tor 浏览器
但是有些浏览器只要输入这样的域名就会打开一个网站:
- 苹果浏览器
- 火狐
我无法测试 Internet Explorer,因为我使用的是 Mac OS,而它在那里不可用。
对于给定的示例,它们会重定向到另一个 URL(顺便说一下,这看起来像是一种解析给定 URL 的有意义的方式,这让我相信这是所需的行为)。
我想知道,Safari 和 Firefox 是如何实现这一奇迹的,而其他浏览器和工具却做不到。
顺便说一句:我想知道 DNS 是如何工作的,我认为这意味着像 wien.eu 这样的 SOA 专用域名无法解析为 IP 地址。但 Safari 和 Firefox 证明了相反的情况。
作为对答案的补充。
我测试中使用的 5 款浏览器均为最新版本,并且均在同一台计算机(搭载 Mac OS X 10.13 High Sierra 的 iMac)上运行。因此,它们均使用完全相同的操作系统,并且还使用完全相同的 DNS 服务器。
区域文件中没有 AAAA 记录(如您在引用的输出中看到的那样挖多于)。
如果你不相信:试试看。使用任何你想检查 DNS 设置的工具维也纳并尝试在属于上述两个组的两个不同的浏览器中打开它。
答案1
我不相信其他浏览器能够解析该域名(除非有 CNAME 或 AAAA 记录可以帮助 DNS 确定下一步去哪里,并且任何浏览器都应该能够同样识别)。
对所见行为的一些可能的解释 -
- 缓存结果被用作后备,但并非在所有浏览器中都可用。
选择具有不同区域文件信息的不同名称服务器(可能是拆分 DNS 或 DNS 缓存)
在某些计算机上托管文件条目,但在其他计算机上不托管,或者可以修改 DNS 后备条目的搜索域。
如果使用缓存代理 - 可能是 ISP 级透明代理。
有点猜测,但如果有 AAAA 记录,则浏览器和/或操作系统可能会限制处理 IPV6 资源。
重要的是,Web 浏览器不会自行进行 DNS 解析,而是进行 IS 调用,并让 IS 处理。据我所知,所有浏览器都是如此。
针对此服务器更新了特定答案,并提供了更多信息
我之前的回答中的一个可能的解释“选择具有不同区域文件信息的不同名称服务器(可能是拆分 DNS 或 DNS 缓存)”是正确的。
对同一权威名称服务器进行两次相同的查询产生了不同的结果,如下所示:
davidgo@davidgo-Precision-T1500:~$ dig @dns1.wien.at wien.at
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @dns1.wien.at wien.at
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47939
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;wien.at. IN A
;; ANSWER SECTION:
wien.at. 300 IN A 217.149.229.10
;; AUTHORITY SECTION:
wien.at. 86400 IN NS ns11.govix.at.
wien.at. 86400 IN NS ns5.univie.ac.at.
wien.at. 86400 IN NS dns1.magwien.gv.at.
wien.at. 86400 IN NS dns1.wien.at.
;; ADDITIONAL SECTION:
dns1.magwien.gv.at. 86400 IN A 217.149.228.128
dns1.wien.at. 86400 IN A 217.149.229.128
;; Query time: 278 msec
;; SERVER: 217.149.229.128#53(217.149.229.128)
;; WHEN: Sun Dec 03 11:27:55 NZDT 2017
;; MSG SIZE rcvd: 186
davidgo@davidgo-Precision-T1500:~$ dig @dns1.wien.at wien.eu -t any
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @dns1.wien.at wien.eu -t any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56418
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;wien.eu. IN ANY
;; ANSWER SECTION:
wien.eu. 86400 IN SOA dns1.magwien.gv.at. hostmaster.magwien.gv.at. 2013082700 10800 3600 604800 86400
wien.eu. 86400 IN NS dns1.magwien.gv.at.
wien.eu. 86400 IN NS dns1.wien.at.
;; ADDITIONAL SECTION:
dns1.magwien.gv.at. 86400 IN A 217.149.228.128
dns1.wien.at. 86400 IN A 217.149.229.128
;; Query time: 277 msec
;; SERVER: 217.149.229.128#53(217.149.229.128)
;; WHEN: Sun Dec 03 11:28:15 NZDT 2017
;; MSG SIZE rcvd: 171
这肯定意味着名称服务器的设置存在问题,但可能存在很多问题,包括隐藏的主名称服务器问题、实际名称服务器问题、DNS 集群的某些成员问题或以上情况的组合。值得注意的是,返回的名称服务器记录也不同。
我还相信操作系统中正在进行一些名称服务器缓存,因为返回结果的查询实际上很少返回到浏览器。
还值得注意的是,您的 dig 查询不是针对权威名称服务器进行的 - 并且许多/大多数 ISP 使用单个 IP 地址后面的负载平衡名称服务器池 - 由于区域缓存,每个名称服务器可能具有不同的信息。如果您多次针对(例如)8.8.8.8 - Google 的“主要”名称服务器进行查询,并观察 TTL 是否根据您获得的后端名称服务器而剧烈波动,这一点显而易见。(TTL 是域名和 SOA 记录中的“IN”之间的数字,但它存在于所有记录中。如果只有一台服务器,那么该数字会随着时间的流逝而减少,直到达到 0 时跳转并进行新的查找。
答案2
通过捕获 IP 流量,我找到了我自己问题的答案。
简而言之
当 Firefox 没有获得 的 IP 地址时wien.eu
,它会请求 (无需用户或任何其他人的命令)www.wien.eu
(它将前缀添加www.
到原始域名)。由于该其他域有一个有效的 A 记录,它得到了一个答案(即 IP 地址),HTTP GET
向此站点发送 ,得到301 redirect
,然后加载重定向的资源。
显然其他浏览器不会使用这个 www 技巧。
详细
我用了卡利Linux作为操作系统,然后我启动了 Firefox。我使用 Wireshark 来捕获流量。以下是我的详细发现:
Firefox 请求A
和AAAA
DNS 记录 ,wien.eu
并且wien.eu.localdomain
总是得到答案No such name
。它询问其默认网关,这显然也是一个 DNS 服务器。
Firefox sends (time = 0.000):
1: Standard DNS-Query: wien.eu: type A, class IN
2: Standard DNS-Query: wien.eu: type AAAA, class IN
Firefox receives (time = 0.030):
3: (Response to 1): Standard DNS-Response: No such name A wien.eu
4: (Response to 2): Standard DNS-Response: No such name AAAA wien.eu
Firefox sends (time = 0.030):
5: Standard DNS-Query: wien.eu.localdomain: type A, class IN
6: Standard DNS-Query: wien.eu.localdomain: type AAAA, class IN
Firefox receives (time = 0.031):
7: (Response to 5): Standard DNS-Response: No such name A wien.eu.localdomain
8: (Response to 6): Standard DNS-Response: No such name AAAA wien.eu.localdomain
然后 Firefox 重复完全相同的四个查询并收到完全相同的响应(消息 #9 到 #16,时间 = 0.047、0.053、0.054、0.054)
再次(消息 #17 至 #24,时间 = 0.057 至 0.083)
再次(消息 #25 至 #32,时间 = 0.083 至 0.095)
在第五轮中,Firefox 将前缀添加www.
到域名,现在它得到了有用的答案:
Firefox sends (time = 0.113):
33: Standard DNS-Query: www.wien.eu: type A, class IN
34: Standard DNS-Query: www.wien.eu: type AAAA, class IN
Firefox receives (time = 0.140):
35: (Response to 33): Standard DNS-Response:
Answers:
www.wien.eu: type CNAME, class IN, cname redirector.magwien.gv.at
redirector.magwien.gv.at: type A class IN, addr 217.149.229.45
Authorative nameservers
magwien.gv.at: type NS, class IN, ns ns11.govix.at.
magwien.gv.at: type NS, class IN, ns dns1.magwien.gv.at.
magwien.gv.at: type NS, class IN, ns ns5.univie.ac.at.
magwien.gv.at: type NS, class IN, ns dns1.wien.at.
Additional records
ns11.govix.at: type A, class IN, addr 192.76.243.11
ns11.govix.at: type AAAA, class IN, addr 2001:67c:133c::11
dns1.wien.at: type A, class IN, addr 217.149.229.128
dns1.magwien.gv.at: type A, class IN, addr 217.149.228.128
ns5.univie.ac.at: type A, class IN, addr 193.171.255.77
ns5.univie.ac.at: type AAAA, class IN, addr 2001:628:453:4305::53
36: (Response to 34): Standard DNS-Response:
Answers:
www.wien.eu: type CNAME, class IN, cname redirector.magwien.gv.at
Authorative nameservers
magwien.gv.at: type SOA, class IN, mname dns1.magwien.gv.at.
由于 Firefox 现在有了一个 IP 地址,它会与该地址建立 TCP 连接(TCP 握手,消息 #37-39)。然后,在消息 #40 中,它会向以下目标发送 HTTP GET 请求:
GET / HTTP1.1
Host: www.wien.eu
(and some additional HTTP headers)
服务器确认该请求(消息 #41),然后在消息 #42 中发送以下答复:
301 Moved Permanently
Location: https://www.wien.gv.at/
其余部分很清楚:
- Firefox 发送 TCP 确认(消息 #43)
- Firefox 请求 DNS 解析
www.wien.gv.at
(A 和 AAAA,消息 #44 和 #45) - Firefox 收到答复(消息 #46 和 #47)
- 然后 Firefox 启动复杂的 HTTPS 对话框来加载然后显示的 html 页面。