尝试用 dig +trace www.gov.cn 这条命令来了解 DNS 解析的完整过程。实验机器为 Ubuntu 18.04 。用 wireshark 抓包。本机地址 192.168.0.97
首先是把 /etc/resolv.conf 改成了自己本地路由器自带的 DNS 地址 192.168.0.1,否则各种 dns 请求都去到了 127.0.0.53 。
wireshark 显示本机先向 192.168.0.1 发送 DNS query,查询 root 的服务器。192.168.0.1 返回了 13 个根服务器的域名和地址。虽然根服务器的地址已经被包含在 192.168.0.1 的回复里,本机依然向 192.168.0.1 分别发送了 13 个根服务器域名的解析查询,并收到了回复。 问题一
随后本机在 13 个根服务器的地址中选取了 192.5.5.241 ( F 根服务器),发送了 www.gov.cn 的 query 。192.5.5.241 返回了 a.dns.cn, b.dns.cn .... g.dns.cn 以及 ns.cernet.net 。没有附加对应的地址。 问题二
于是本机又向 192.168.0.1 分别发送了多个 query,查询以上返回的 a.dns.cn 等域名对应的地址,并收到对应的回复。最后一个来自 192.168.0.1 的回复是:ns.cernet.net 的地址 是 103.137.60.44 。问题三
到这一步,算是找到了 .cn 的 DNS 服务器了。
然后本机向 103.137.60.44 发送 DNS query,查询 www.gov.cn 的地址。103.137.60.44 返回了另外三个 DNS 服务器,ns1.cdns.cn ,ns2.cdns.cn 和 ns3.cdns.cn 。没有附加对应的地址。 同问题二
于是本机向 192.168.0.1 分别发送三个 query,查询以上返回的 ns1.cdns.cn 等域名对应的地址,并收到对应的回复。最后一个来自 192.168.0.1 的回复是:ns2.cnds.cn 的地址 是 125.208.46.1 。 同问题三
到这一步,算是找到了 gov.cn 的 DNS 服务器了。
最后,本机向 125.208.46.1 发送 query,查询 www.gov.cn 的地址,并收到一个 CNAME 回复。
问题一:为什么 192.168.0.1 已经返回了根服务器的地址,本机依旧要重新查询呢
问题二:这里为什么只返回域名,不返回地址呢?
问题三:这里 192.168.0.1 好像处于上帝视角。问题二通过 192.168.0.1 解决,可能是因为路由器去查询了 ISP 提供的 DNS 服务器。但是在没有上帝视角的情况下,问题二该怎么解决呢?
问题有点长,感谢阅读。如果需要提供抓包文件,可以商量一下怎么发送过去。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.