基础常识
DNS,全称是 Domain Name System,是互联网的基础设施之一,应用层,但它依赖 UDP/TCP 和 IP 层传输,他是用来干什么的呢
比如你手上有个ip是198.19.236.124,还算好记,因为这才32位,那如果是用IPv6呢,那可是128位,比如fd00:17e5:1743:ef21:a861:edec:12e2:2cbc,那你就很难能记得住了对吧
你要是反驳我,我也没话说,但是我们为什么不能使用一个很好记的名称,比如我站的https://lookatthesky.cn/,只要输入lookatthesky.cn就可以访问到这了,很好记对吧
而DNS就负责这个,比如你在浏览器里访问https://lookatthesky.cn/,你的系统DNS就会进行查询,然后返回A记录比如198.19.236.124,AAAA记录比如fd00:17e5:1743:ef21:a861:edec:12e2:2cbc,你就能成功来到我们网站了
DNS 他是怎么工作的
DNS 采用树状分层架构,我先假设你打开浏览器,输入 https://lookatthesky.cn/,想访问我们站点,机器会先进行本地查询,查看有没有lookatthesky.cn的记录

浏览器会先查询本机有无DNS缓存,如有,则直接访问,如无,则去查询hosts(本地DNS解析),如果hosts和缓存都没有解析结果,会进入下一步

询问本地DNS服务器,比如你家路由器DHCP自动下发的DNS,或运营商自动下发的DNS,也可能是你自己在DNS里填的DNS服务器,如果这里也没有,会进入下一步

本地DNS服务器会询问ROOT服务器,也就是我们常说的根 DNS,他会返回我TLD的DNS服务器地址

根 DNS,他会返回我TLD的DNS服务器地址,我站的TLD也就是.cn,那返回给本地DNS服务器的结果就是.cn的根DNS服务器地址

然后在进行下一步,本地DNS服务器拿着.cn的根DNS服务器地址询问我lookatthesky.cn的权威DNS服务器(也就是我进行域名解析的服务器地址)

如果一切顺利,.cn的根DNS服务器会拿着lookatthesky.cn的权威DNS服务器的地址返回给本地DNS服务器

终于,本地DNS服务器拿着lookatthesky.cn的权威DNS服务器的地址去查询lookatthesky.cn的NS记录

成功返回了lookatthesky.cn的NS记录!A:198.19.236.124,AAAA:fd00:17e5:1743:ef21:a861:edec:12e2:2cbc

本地DNS服务器会记录下这两条记录放进缓存,然后将这两个解析记录返回给用户

用户获得解析之后,再拿着IP去访问lookatthesky.cn的服务器,就成功访问到我们网站了
用户只需要动动手指输入网站就行了,而我们DNS服务器考虑的就要多了
DNS查询工具
既然你已经知道了原理,那你为什么不来试试呢,
你需要打开CMD(Windows按键+R)输入
nslookup lookatthesky.cn
或者BASH(Linux)输入
dig lookatthesky.cn
看看你获得了什么输出呢
DNS记录
解释几种主流的域名解析类型对应的功能和所返回的结果的意义
- A:Address:把域名解析为 IPv4 地址(例如:lookatthesky.cn ⟶ 198.19.236.124)
- AAAA:IPv6 Address:把域名解析为 IPv6 地址(例如:lookatthesky.cn ⟶ fd00:17e5:1743:ef21:a861:edec:12e2:2cbc)
- CNAME:Canonical Name:别名 - 一个域名指向另一个域名的IP地址
- MX:Mail Exchange:指定收邮件的服务器地址和优先级 - 主要用于邮箱服务
- NS:Name Server:指定某个域的权威 DNS 服务器(比如把二级域名委托给其他人使用)
- SOA:Start of Authority:指定区域的起始记录,记录该域的主权、刷新时间、序列号等元信息,很重要
- TXT:Text:任意文本记录,常用于验证域名所有权、SPF、DKIM、DMARC,证书签发等
- PTR:Pointer:反向 DNS 查询(IP → 域名),用于邮件服务器身份验证、IP归属权、编号等
解释几种增强功能的解析类型对应的功能和所返回的结果的意义
- SRV:Service Locator:指定某个服务的目标主机和端口,常用来省略端口号
- CAA:Certificate Authority Authorization:限制哪些 CA 能为该域签发证书(防止被恶意 CA 签证,或者你的用户偷偷来个大的)
- SVCB:Service Binding:可以指定一个服务的端口、加密协议、传输层协议等
- URI:Uniform Resource Identifier:于指定一个 URI,通常用于指向某个服务的接口或资源,类似于指向一个资源的位置。
- DNSKEY:存储 DNS 区域的公钥,用于验证该区域内其他记录的签名
- DS:Delegation Signer:存储一个 DNS 区域的公钥摘要,通常由父域授权,证明子域的 DNSKEY 公钥是可信的。
- NSEC/NSEC3:证明某个域名不存在,避免域名枚举攻击
为什么IPv4是A记录,IPv6是AAAA呢,因为IPv4是32位,而IPv6是128位,IPv6地址的确是IPv4地址的4倍长,这个命名选择是相当直观的
域名解析
其实很好理解,就是你注册了一个域名,注册商会给你分配一个权威DNS服务器,一般最低分配两个ns服务器,也就是上文写的权威DNS,我这边简写为NS1和NS2,这两个NS服务器将会留存你的域名解析记录(如上文所写的aaaa和a记录和其他记录)

所以当用户提交解析记录的时候(一般注册商会给你一个简易的DNS面板),会将这条记录同步到分配的权威DNS服务器

我们和上文的内容结合,就会得到这样的结果,也就是网站维护者将DNS记录提交给权威DNS,权威DNS就能让用户知道你的网站该如何访问了

拓展:Glue 记录:防止鸡生蛋蛋生鸡的问题
有时候,权威 DNS 本身就是目标域名的子域,比如我lookatthesky.cn曾经有一段时间使用light-ns.lookatthesky.cn和hope-ns.lookatthesky.cn作为权威DNS,那问题来了,既然我上面都提到了,我想知道light-ns.lookatthesky.cn的DNS地址我就得去请求lookatthesky.cn的权威DNS,但权威DNS又是light-ns.lookatthesky.cn,这就很麻烦了对吧

如果真这么做,就会进入无限的循环了,你永远也无法真正访问到我的网站,所以人们想了一种方案可以避免这个问题。

为了解决这个问题,注册商会在顶级域(TLD)服务器那注册 Glue 记录,直接告诉它 light-ns.lookatthesky.cn 和 hope-ns.lookatthesky.cn 的 IP 是多少,这样就能打破循环,让递归查询能继续下去。
TTL 是 Time To Live 的缩写,意思是"存活时间"或在这里理解为"缓存时间"。它决定了一条 DNS 记录在递归 DNS 服务器中可以被缓存多久。举个简单的例子:lookatthesky.cn 的 A 和 AAAA的 记录有 TTL 值是 3600 (单位是秒),也就是 1 小时,这意味这理论上这个解析会在公共DNS缓存一小时,等过期或者新用户访问再去请求新解析。
DNS 安全
你从上面的内容已经学习到了,DNS是多么重要,没有DNS你甚至没法很方便的访问互联网,或者只能背IP上网,所以安全性也是非常重要的
我会在下面介绍两种DNS攻击的机制和两种防御机制
1.DNS 投毒(DNS Cache Poisoning / Spoofing)
我们知道,UDP 是一种无连接,不保证可靠传输和面向报文的协议,如果你在向DNS查询一个本地DNS不知道的域名,比如idk-ste.lookatthesky.cn,本地DNS就需要去进行我上方所说的递归查询

在这个本地DNS还没有完成全流程的时候,如果正好有人拿着idk-ste.lookatthesky.cn的解析记录回来了,本地DNS就会接收

本地DNS虽然感觉怪怪的,但手上毕竟已经握着这个包了,那咋办,自然是递交给用户

用户就会拿着这个包去访问假的网站,实际上这个idk-ste.lookatthesky.cn并非真的idk-ste.lookatthesky.cn

但这种攻击少见,一般是针对你的攻击,但你如果真的遇到了,你是基本发现不了的
2.DNS 劫持(DNS Hijacking)
这个是最常见的,或者说也是比较容易的攻击,DNS 劫持是指网络中间节点(如运营商、攻击者)拦截或篡改 DNS 请求/响应,让用户访问错误的地址。

就比如你需要访问你要去的这台DNS服务器,你就必须得经过一台Router(RT),正常来说,是DNS返回请求回来

但如果这台Router被入侵,被错误配置,或者有意为之,他会代替DNS服务器帮你返回结果
这种攻击会让你跳转到钓鱼网站,或者在网页里注入广告页面,或者阻止你防止访问特定网站(比如返回0.0.0.0和127.0.0.1)
防御机制
1.DNS 加密技术:DoH 与 DoT
传统 DNS 是明文的,容易被监听/篡改。DNS over HTTPS(DoH) / DNS over TLS(DoT) 的目标就是加密 DNS 查询。

使用DoH和DoT之后,你的DNS请求就不会被轻易截胡,篡改等等
DNSSEC(DNS Security Extensions)
DNSSEC 是 DNS 的扩展协议,为 DNS 响应提供数字签名,防止数据被篡改或伪造,他不对数据加密,他只验证数据的正确性。

我们回到这张图,这是正常的对lookatthesky.cn的请求流程,但DNS SEC的作用就是本地DNS在请求Root的时候,Root会同时响应TLD的 DS 记录(Delegation Signer)和 RRSIG 签名,而因为本地DNS服务器/解析器,根域会被预配置为信任锚点(Trust Anchor),所以解析器用内置的根域 DNSKEY 校验 DS 的 RRSIG,确认记录可信,也就是 TLD 的 DS 记录就是根域签发的,比如我的域名是.cn,他就会返回.cn的 DS 记录和 RRSIG

然后进入下一步,因为Root响应的DS和RRSIG可信,我们也获得了.cn的TLD区域的DNSKEY,然后去查TLD的DNSKEY,TLD的DNS也会响应DNSKEY和记录RRSIG,解析器会用返回的 DNSKEY 验证 RRSIG, 并确认.cn的 DNSKEY 对应 DS 指纹,完全匹配

然后下一步,我们会请求到这个域名具体的DS和RRSIG,没错,这一步还是在.cn的TLD区域,也就是如图所示,.cn的TLD服务器会返回我lookatthesky.cn的DS记录和RRSIG

最后一步,我们会请求到这个域名权威DNS,理论上它会返回lookatthesky.cn的DNSKEY和RRSIG,然后继续请求,我这边是根域名,也就是返回lookatthesky.cn的@记录和@记录的RRSIG,至此本地DNS服务器/解析器终于完成了所有步骤

本地DNS服务器/解析器终于完成了所有步骤一层都验证成功即(根 → .cn → lookatthesky.cn → @)都对的上,我们默认这条记录绝对可信

至此,你已经理解了,DNSSEC这东西,你已经超越绝大多数人了,DNSSEC在境外的DNS服务器上是强验证的,但国内的公共DNS不见得会验证,所以如果出现了境内解析正常,境外不行,建议去查查DNSSEC过没过
---
你对DNS的理解已经更上了一层楼,会当凌绝顶,一览众山小!
---
联系我/捉虫/有什么要改进,可以在邮箱里和我交流,点右上角关于/联系
---
赞助我请访问以下网页
https://lookatthesky.cn/sponsor.html