DNS 解析与 DIG 工具

Photo by Caleb Kastein on Unsplash

当我们输入域名请求服务器真实 IP 或者用 DIG 工具排查域名相关时, 具体的解析过程以及 DNS 服务器解析原理 ,我想通过本文做个简单的阐述。

DNS 解析过程

我们可以通过在线 DIG 工具可以查看域名解析的结果甚至追踪域名解析的过程。假如我想查询某个 baidu.com 对应的 IP 地址,可以这样发出查询。

然后可以从服务器得到这样的响应。其中 ANSWER SECTION 返回两个 IP 地址,这就是 baidu.com 对应的 IP 地址。

想要看具体的解析过程,我们可以使用 dig 命令的 trace 参数。

通过追踪我们可以清楚地看到域名解析的完整过程。我们首先向全球 13 个根服务器发出 DNS 请求,请求顶级域名 com. 的 DNS 服务器。之后向这些 DNS 服务器发起子域名 baidu.com. 的解析请求。最后得到两个 IP 地址 39.156.69.79 和 220.181.38.148。而最先返回的 220.181.38.148 作为最终域名解析结果。

DNS 记录

为了更好的理解 DNS 记录到底是什么,我查阅了 DNS 服务器搭建的方法。其实,在 DNS 服务器上,一个域名对应了多条相关的 DNS 配置记录。对于 bind 程序(一种 DNS 服务程序)来说,它在配置文件中用 file 关键字指定了某个域名对应哪些 DNS 记录,如下所示。

这每当我们向这个 DNS 服务器请求 example.com 的相关信息,服务器就会在域名所对应的记录文件(forward.example.com)中进行查询,它的内容如下所示。

第一段 SOA 记录表明 dns1.example.com 是一个权威记录,指定了 DNS 查询的一些基本信息、比如序列号、刷新时间、过期时间和 TTL 等。

第二段 NS 记录表明某个子域名被哪个 DNS 服务器解析。@ 即 example.com 会被 ns1.example.com. 这个 DNS 服务器进行解析。而其中 ns1 —— A 这个J记录又指定了它的真实 IP 为198.51.100.10。

第三段 MX 记录指定了右键协议发出的 DNS 请求时返回的域名。可以看做的邮件版本的 NS 记录。

第四段的 A 记录,记录了子域名 www 和 site 对应的真实 IP。

第五段 CNAME 记录了另一个子域名被解析到哪个已经定义好的域名上。

NS 记录

在服务商注册完域名之后,我们就要添加此域名对应的 DNS 记录。一般来说,我们只需添加 A 记录或者 CNAME 记录将域名解析到一个 IP 地址或者另一个域名即可。

但是这里隐藏了一条 NS 记录。这条 NS 记录默认指向的是域名服务商提供的 DNS 服务器。这意味着,域名的 DNS 请求最后都被这台 DNS 服务器所解析。因此假如我想用 Cloudflare 的 CDN 服务,那么就需要将 NS 记录手动修改 Cloudflare 的 DNS 服务器域名。

DNS 防劫持

为了防止域名被劫持,发起 DNS 请求的一方就有必要验证 DNS 返回记录的有效性。因为涉及到客户端认证,因此需要采用公钥认证的方式验证记录是否被篡改。当然,可以向 HTTPS 一样使用中间权威机构对 DNS 发送的公钥进行认证。但是当时并没有这样的标准,DNS 请求无法确保 DNS 响应的公钥是否被劫持,因此只能采取递归验证的方法验证公钥的有效性——即 DNSSEC 方案。

比如 baidu.com. 的域名服务器请求公钥 A 来验证记录的有效性。我们就必须向上级的 .com. 请求公钥 A 的数字签名。 .com. 的 DNS 服务器私钥公钥 A 进行加密,并返回一个公钥 B,用于认证公钥 A 数字签名的有效性。当然公钥 B 也有被篡改的可能,此时就需要向根域名服务器请求公钥 B 的数字签名和用于认证此数字签名的公钥 C,通过构建这样一个信任链来进行递归的认证操作。

而 DNSSEC 需要 DNS 服务器的支持。想要在自建 DNS 服务器上启用 DNSSEC 功能可以参看这篇文档

参考链接

DNS 原理入门

How To Create a DNS Server On CentOS 7

我所理解的 DNSSEC

DNSSEC 简介与签名的工作原理

发表评论

电子邮件地址不会被公开。 必填项已用*标注