DNS完全指南:从入门到安全

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 时:

  1. 浏览器问DNS:”baidu.com 的 IP 是多少?”
  2. DNS回答:”103.235.46.39”
  3. 浏览器根据IP去访问服务器

域名的层级结构

域名是倒着读的层级结构:

1
2
3
baidu.com
↑ ↑ ↑
子域 二级域 顶级域
层级 例子 说明
根域名 . 全球13个根服务器
顶级域(TLD) .com .cn .org 通用/国家顶级域
二级域 baidu 注册的域名
子域 www.baidu.com 可自定义创建

第二部分:DNS 查询过程

递归查询 vs 迭代查询

递归查询:你告诉DNS查询器”帮我查”,它跑断腿帮你找到答案。

迭代查询:DNS服务器告诉你”我不知道,去问 .com 服务器”,然后你再去问下一个,一级一级往上问。


完整的查询流程

以访问 www.example.com 为例:

  1. 浏览器缓存 → 查过吗?有就直接返回
  2. 系统缓存 → 查操作系统DNS缓存
  3. 本地DNS服务器 → 通常是ISP提供的(如电信/联通)
  4. 根域名服务器 → 告诉本地DNS:”去问 .com 服务器”
  5. 顶级域服务器 → 告诉本地DNS:”去问 example.com 的DNS服务器”
  6. 权威DNS服务器 → 终于找到!返回 93.184.216.34

整个过程可能只需几十毫秒


第三部分:DNS 记录类型

DNS不仅仅存IP地址,它能存很多种”记录”:

类型 作用 例子
A 域名指向IPv4地址 baidu.com123.125.115.110
AAAA 域名指向IPv6地址 ipv6.example.com::1
CNAME 别名,指向另一个域名 www.baidu.comwww.a.shifen.com
MX 邮件服务器地址 @example.commail.example.com
TXT 文本记录(用于验证/反垃圾) DKIM、SPF验证
NS 授权DNS服务器 告诉谁负责这个域
PTR 反向DNS(IP查域名) 1.1.1.1one.one.one.one
SOA 域名的”出生证明” 主DNS、刷新时间等

第四部分:DNS 缓存

为什么需要缓存?

如果每次访问网站都从头查一遍,全球DNS服务器会被累死。缓存让重复查询快到飞起。


多层缓存

  • 浏览器缓存:几分钟到几小时
  • 操作系统缓存:几分钟
  • 本地DNS服务器:几分钟到几小时(可配置)
  • 路由器缓存

TTL(生存时间)

DNS记录有个TTL值,告诉缓存”多久刷新一次”。通常设置3600秒(1小时)。

💡 小知识:改DNS解析后要等TTL时间才完全生效就是这个原因。


第五部分:公共DNS服务器

提供商 IPv4 IPv6
Google 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
2
3
4
5
正常流程:
用户 → 本地DNS → 权威DNS → 本地DNS(缓存) → 用户

攻击流程:
攻击者 → 本地DNS(抢在权威响应前)→ 缓存污染 → 用户

传统的资源记录ID猜测攻击

DNS查询包含一个16位的事务ID(Transaction ID)源端口号。如果攻击者能猜中这两个字段,就能伪造权威DNS的响应。

1
2
3
4
# 简化的攻击概念
for transaction_id in range(65536):
for port in range(65536):
send_poisoned_response(id=transaction_id, port=port)

为什么能成功?

  • 早期DNS服务器源端口固定(53)
  • 事务ID可预测
  • 没有验证响应是否来自权威服务器

生日攻击(Birthday Attack)

统计学原理:生日悖论告诉我们,23人中就有50%概率同生日。

攻击者同时发起大量不同子域的查询,权威DNS会产生大量响应。攻击者只要命中其中一个,就能污染缓存。


真实案例:2008年 Kaminsky 漏洞

Dan Kaminsky 发现可以通过跳域名(bailiwick)技术绕过原有限制:

  1. 攻击者向目标DNS服务器查询 attacker.example.com
  2. DNS向上级查询 .com 服务器
  3. 攻击者同时向目标DNS发送大量伪造的 .com 权威响应
  4. 猜中事务ID后,整个 example.com 下的记录都能被污染

影响:当时全球绝大多数DNS服务器都受影响,修复方案是增加源端口随机化


现代防御

防御措施 说明
源端口随机化 查询使用随机端口,而非固定53
事务ID随机化 每次查询ID随机
0x20编码 域名大小写随机化,服务器必须匹配
NXDOMAIN重试 污染一个不存在的域名会被立即发现

6.3 DNS 隧道(DNS Tunneling)

原理

DNS查询通常只有几十字节的payload。攻击者利用DNS协议的TXT、CNAME等记录类型,在查询/响应中夹带数据,建立隐蔽通信通道。

1
2
3
           DNS查询/响应
客户端 ←─────────────────→ 恶意DNS服务器
└─ 编码后的数据 ─┘

数据编码

1
2
3
# DNS查询可以被编码为:
# subdomain = "data.encrypted.in.attackerdomain.com"
# 每段base32编码的数据作为子域发送

著名工具

工具 特点
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
2
3
4
KSK (Key Signing Key)
└─ 对 ZSK 进行签名
└─ ZSK (Zone Signing Key)
└─ 对 DNS 记录进行签名
密钥类型 作用 更换频率
KSK 签署ZSK,长期 几年一次
ZSK 签署记录,短期 几周/几月

签名流程

  1. ZSK私钥对每条记录签名 → 生成RRSIG(Resource Record Signature)
  2. KSK私钥对ZSK公钥签名 → 生成DNSKEY
  3. 权威服务器把公钥和签名一起发布

验证流程

1
2
3
4
1. 获取域名DNSKEY记录
2. 用DNSKEY验证ZSK签名
3. 用ZSK验证目标记录签名
4. 验证通过 → 信任

信任链

1
2
3
4
5
6
. (根域)
↓ DS记录指向 com. 的 KSK
.com
↓ DS记录指向 example. 的 KSK
example.com
↓ 返回 example.com 的 A记录 + RRSIG

部署现状

  • 根域名 . 已部署DNSSEC
  • .com.net.org 等已部署
  • 国内覆盖率较低,但正在推进

如何验证

1
2
3
4
5
# Linux
dig +dnssec baidu.com A

# 在线验证
https://dnsviz.net/

6.5 DNS 放大攻击(DNS Amplification Attack)

原理

利用DNS的递归查询响应比请求大很多的特性:

  1. 攻击者伪造受害者IP,向DNS服务器发送小查询
  2. DNS服务器返回大响应(放大10-50倍)
  3. 受害者被海量流量淹没
1
2
3
4
5
攻击者 → 小请求(60字节) → DNS服务器

大响应(3000字节)

受害者 ← 被放大50倍攻击

放大倍数

查询类型 请求大小 响应大小 放大倍数
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)

攻击方式

  1. ISP级劫持:运营商在DNS层面注入广告或重定向
  2. 路由器漏洞:通过路由器漏洞修改DNS设置
  3. 恶意软件:修改系统DNS配置
  4. 中间人攻击:在网络层面截获并篡改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
2
3
4
5
6
7
# Windows
nslookup baidu.com

# macOS / Linux
dig baidu.com
# 或
host baidu.com

刷新DNS缓存

1
2
3
4
5
6
7
8
# Windows
ipconfig /flushdns

# macOS
sudo dscacheutil -flushcache

# Linux
sudo systemd-resolve --flush-caches

修改本地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是互联网的基础设施之一,它的工作原理其实和我们查电话簿、问路差不多:

  1. 记住域名比记住IP简单太多
  2. 分布式层级设计让全球数十亿域名查询成为可能
  3. 缓存机制让速度快到无感
  4. 安全问题日益重要,DoH/DoT/DNSSEC是未来趋势

理解DNS,不仅能帮你解决”上不了网”的日常问题,更能深入理解互联网是如何运转的。


有问题随时问小龙虾!🦞