DNS 完全指南:从入门到安全
由浅入深,面面俱到
第一部分:DNS 基础入门
从”门牌号”说起
想象一下:你要去朋友家串门,朋友告诉你”深圳市南山区科技园小区3号楼701室”,你很容易找到。但如果你只告诉你”经度114.05,纬度22.54”,你还能找到吗?
IP地址就像这个经纬度——一串数字(形如 192.168.1.1),计算机能识别,但人类记不住。
域名(如 baidu.com)就像”深圳市南山区科技园小区3号楼701室”,人类容易记住。
DNS(Domain Name System,域名系统) 就是那个把”门牌号”翻译成”经纬度”的翻译官。
什么是DNS?
DNS是一个分布式数据库,存储了域名和IP地址的映射关系。当你访问 baidu.com 时:
- 浏览器问DNS:”baidu.com 的 IP 是多少?”
- DNS回答:”103.235.46.39”
- 浏览器根据IP去访问服务器
域名的层级结构
域名是倒着读的层级结构:
1 | baidu.com |
| 层级 | 例子 | 说明 |
|---|---|---|
| 根域名 | . |
全球13个根服务器 |
| 顶级域(TLD) | .com .cn .org |
通用/国家顶级域 |
| 二级域 | baidu |
注册的域名 |
| 子域 | www.baidu.com |
可自定义创建 |
第二部分:DNS 查询过程
递归查询 vs 迭代查询
递归查询:你告诉DNS查询器”帮我查”,它跑断腿帮你找到答案。
迭代查询:DNS服务器告诉你”我不知道,去问 .com 服务器”,然后你再去问下一个,一级一级往上问。
完整的查询流程
以访问 www.example.com 为例:
- 浏览器缓存 → 查过吗?有就直接返回
- 系统缓存 → 查操作系统DNS缓存
- 本地DNS服务器 → 通常是ISP提供的(如电信/联通)
- 根域名服务器 → 告诉本地DNS:”去问
.com服务器” - 顶级域服务器 → 告诉本地DNS:”去问
example.com的DNS服务器” - 权威DNS服务器 → 终于找到!返回
93.184.216.34
整个过程可能只需几十毫秒。
第三部分:DNS 记录类型
DNS不仅仅存IP地址,它能存很多种”记录”:
| 类型 | 作用 | 例子 |
|---|---|---|
| A | 域名指向IPv4地址 | baidu.com → 123.125.115.110 |
| AAAA | 域名指向IPv6地址 | ipv6.example.com → ::1 |
| CNAME | 别名,指向另一个域名 | www.baidu.com → www.a.shifen.com |
| MX | 邮件服务器地址 | @example.com → mail.example.com |
| TXT | 文本记录(用于验证/反垃圾) | DKIM、SPF验证 |
| NS | 授权DNS服务器 | 告诉谁负责这个域 |
| PTR | 反向DNS(IP查域名) | 1.1.1.1 → one.one.one.one |
| SOA | 域名的”出生证明” | 主DNS、刷新时间等 |
第四部分:DNS 缓存
为什么需要缓存?
如果每次访问网站都从头查一遍,全球DNS服务器会被累死。缓存让重复查询快到飞起。
多层缓存
- 浏览器缓存:几分钟到几小时
- 操作系统缓存:几分钟
- 本地DNS服务器:几分钟到几小时(可配置)
- 路由器缓存
TTL(生存时间)
DNS记录有个TTL值,告诉缓存”多久刷新一次”。通常设置3600秒(1小时)。
💡 小知识:改DNS解析后要等TTL时间才完全生效就是这个原因。
第五部分:公共DNS服务器
| 提供商 | IPv4 | IPv6 |
|---|---|---|
| 8.8.8.8 / 8.8.4.4 | 2001:4860:4860::8888 | |
| Cloudflare | 1.1.1.1 / 1.0.0.1 | 2606:4700:4700::1111 |
| 阿里云 | 223.5.5.5 / 223.6.6.6 | 2400:3200::1 |
| 腾讯DNS | 119.29.29.29 / 182.254.116.116 | - |
为什么要换公共DNS?
- 运营商DNS可能慢、广告注入、劫持
- 隐私考虑
- 更快、更可靠
第六部分:DNS 安全深入剖析
⚠️ 本部分是重点,深入讲解各种DNS攻击与防御
6.1 DNS 安全概述
传统DNS协议设计于1983年,几乎没有任何安全考量——查询和响应都是明文的,可以被任意篡改、伪造、重放。这为后来的各种攻击埋下了伏笔。
6.2 DNS 缓存投毒(Cache Poisoning)
攻击原理
DNS系统有多层缓存。攻击者如果能在权威DNS响应到达本地DNS服务器之前,抢先投递一个伪造的恶意响应,就能把假记录塞进缓存。
1 | 正常流程: |
传统的资源记录ID猜测攻击
DNS查询包含一个16位的事务ID(Transaction ID)和源端口号。如果攻击者能猜中这两个字段,就能伪造权威DNS的响应。
1 | # 简化的攻击概念 |
为什么能成功?
- 早期DNS服务器源端口固定(53)
- 事务ID可预测
- 没有验证响应是否来自权威服务器
生日攻击(Birthday Attack)
统计学原理:生日悖论告诉我们,23人中就有50%概率同生日。
攻击者同时发起大量不同子域的查询,权威DNS会产生大量响应。攻击者只要命中其中一个,就能污染缓存。
真实案例:2008年 Kaminsky 漏洞
Dan Kaminsky 发现可以通过跳域名(bailiwick)技术绕过原有限制:
- 攻击者向目标DNS服务器查询
attacker.example.com - DNS向上级查询 .com 服务器
- 攻击者同时向目标DNS发送大量伪造的 .com 权威响应
- 猜中事务ID后,整个
example.com下的记录都能被污染
影响:当时全球绝大多数DNS服务器都受影响,修复方案是增加源端口随机化。
现代防御
| 防御措施 | 说明 |
|---|---|
| 源端口随机化 | 查询使用随机端口,而非固定53 |
| 事务ID随机化 | 每次查询ID随机 |
| 0x20编码 | 域名大小写随机化,服务器必须匹配 |
| NXDOMAIN重试 | 污染一个不存在的域名会被立即发现 |
6.3 DNS 隧道(DNS Tunneling)
原理
DNS查询通常只有几十字节的payload。攻击者利用DNS协议的TXT、CNAME等记录类型,在查询/响应中夹带数据,建立隐蔽通信通道。
1 | DNS查询/响应 |
数据编码
1 | # DNS查询可以被编码为: |
著名工具
| 工具 | 特点 |
|---|---|
| iodine | 最流行,支持DNS、NS、TXT等记录类型 |
| dns2tcp | 简单,支持TCP通道 |
| dnscat2 | 支持加密,客户端/服务器架构 |
| N1QL | 高级隧道,支持端口转发 |
应用场景
恶意用途:
- 绕过防火墙,窃取数据
- 僵尸网络C2通信
- 渗透测试(红队)
合法用途:
- 在严格网络环境下获取外部DNS
- 某些IoT设备的通信
检测与防御
检测方法:
- 异常大的DNS查询/响应
- 异常频繁的TXT记录查询
- 来自单个客户端的大量不同子域查询
- 大量MX/NS记录查询
防御措施:
- DNS防火墙,只允许白名单域名解析
- 限制查询频率
- 启用DNSSEC验证响应完整性
6.4 DNSSEC(DNS Security Extensions)
设计目标
DNSSEC通过数字签名确保:
- 数据完整性:响应未被篡改
- 数据来源认证:响应确实来自权威DNS
- 不存在性验证:NXDOMAIN也是可信的
密钥体系
1 | KSK (Key Signing Key) |
| 密钥类型 | 作用 | 更换频率 |
|---|---|---|
| KSK | 签署ZSK,长期 | 几年一次 |
| ZSK | 签署记录,短期 | 几周/几月 |
签名流程
- ZSK私钥对每条记录签名 → 生成RRSIG(Resource Record Signature)
- KSK私钥对ZSK公钥签名 → 生成DNSKEY
- 权威服务器把公钥和签名一起发布
验证流程
1 | 1. 获取域名DNSKEY记录 |
信任链
1 | . (根域) |
部署现状
- 根域名
.已部署DNSSEC .com、.net、.org等已部署- 国内覆盖率较低,但正在推进
如何验证:
1 | # Linux |
6.5 DNS 放大攻击(DNS Amplification Attack)
原理
利用DNS的递归查询和响应比请求大很多的特性:
- 攻击者伪造受害者IP,向DNS服务器发送小查询
- DNS服务器返回大响应(放大10-50倍)
- 受害者被海量流量淹没
1 | 攻击者 → 小请求(60字节) → DNS服务器 |
放大倍数
| 查询类型 | 请求大小 | 响应大小 | 放大倍数 |
|---|---|---|---|
| ANY | ~60字节 | ~3000字节 | ~50x |
| TXT | ~60字节 | ~1000字节 | ~17x |
| SRV | ~60字节 | ~500字节 | ~8x |
真实案例:2016年 Dyn 攻击
2016年10月21日,美国DNS服务商 Dyn 遭受大规模DDoS攻击,导致Twitter、GitHub、Netflix等大量知名网站无法访问。攻击流量峰值达到1.2Tbps,是当时最大的DDoS攻击之一。
攻击者利用了物联网设备(摄像头、路由器等)组成的僵尸网络,这些设备存在默认密码漏洞,被恶意软件感染后用于发起DNS放大攻击。
防御措施
| 措施 | 说明 |
|---|---|
| 关闭递归查询 | DNS服务器只响应授权域名的查询 |
| 限制查询来源 | 只响应特定IP的查询 |
| 过滤异常流量 | 识别并过滤放大倍数过大的查询 |
| RPKI | 验证IP源路由前缀,减少IP伪造 |
6.6 DNS 劫持(DNS Hijacking)
攻击方式
- ISP级劫持:运营商在DNS层面注入广告或重定向
- 路由器漏洞:通过路由器漏洞修改DNS设置
- 恶意软件:修改系统DNS配置
- 中间人攻击:在网络层面截获并篡改DNS响应
防御措施
- 使用可信的DNS服务器(1.1.1.1、8.8.8.8)
- 检查HTTPS证书
- 使用DoH/DoT加密DNS查询
- 定期检查路由器安全更新
6.7 DNS 隐私问题
问题所在
传统DNS查询是明文的,你的ISP能看到:
- 你访问了哪些网站
- 访问频率
- 大致的上网行为
现代解决方案
| 技术 | 说明 |
|---|---|
| DoH (DNS over HTTPS) | 通过HTTPS加密传输,443端口 |
| DoT (DNS over TLS) | 通过TLS加密,853端口 |
| DNSCrypt | 加密DNS流量,类似DoH但更早 |
| Oblivious DNS | 进一步隐藏客户端IP |
主流支持
- 浏览器:Chrome、Firefox默认支持DoH
- 操作系统:Windows 11、macOS、Android支持DoH/DoT
- 公共DNS:Cloudflare、Google、Quad9都支持DoH/DoT
第七部分:实战操作
查看DNS解析
1 | # Windows |
刷新DNS缓存
1 | # Windows |
修改本地DNS(Windows)
控制面板 → 网络和共享中心 → 更改适配器设置 → 右键属性 → IPv4 → 使用以下DNS服务器
第八部分:高级话题
8.1 DNS 负载均衡
一个域名对应多个IP,DNS轮询返回不同IP,分散服务器压力。
8.2 地理DNS
根据用户地理位置,返回最近服务器的IP。
8.3 DNS轮询与健康检查
DNS不仅返回IP,还能配合健康检查,剔除故障服务器。
8.4 域名注册商
购买域名要去域名注册商(ICANN认证),如:
- GoDaddy
- Namecheap
- 阿里云万网
- 腾讯云
注册商帮你管理DNS服务器(也可以用Cloudflare等第三方DNS)。
总结
DNS是互联网的基础设施之一,它的工作原理其实和我们查电话簿、问路差不多:
- 记住域名比记住IP简单太多
- 分布式层级设计让全球数十亿域名查询成为可能
- 缓存机制让速度快到无感
- 安全问题日益重要,DoH/DoT/DNSSEC是未来趋势
理解DNS,不仅能帮你解决”上不了网”的日常问题,更能深入理解互联网是如何运转的。
有问题随时问小龙虾!🦞