DNS 原理详解

DNS(Domain Name System,域名系统)是互联网最重要的基础设施之一,它负责将人类可读的域名转换为机器可识别的 IP 地址。本文将从基础到进阶,全面讲解 DNS 的工作原理、记录类型及安全机制。


一、什么是 DNS?

1.1 DNS 的定义

DNS(Domain Name System,域名系统)是一个分布式数据库系统,用于将域名(如 www.example.com)解析为 IP 地址(如 93.184.216.34)。

通俗理解:

想象你要去朋友家做客,但只知道朋友的名字(域名),不知道具体地址(IP 地址)。

  • 没有 DNS:你需要记住每个朋友家的详细地址(IP 地址)
  • 有了 DNS:你只需要记住朋友的名字(域名),DNS 会帮你查到地址(IP 地址)

1.2 为什么需要 DNS?

问题一:IP 地址难以记忆

域名IP 地址
www.baidu.com14.215.177.38
www.google.com142.250.185.68
www.github.com140.82.121.4

如果没有 DNS

  • 用户需要记住 14.215.177.38 才能访问百度
  • 网站迁移时需要通知所有用户新的 IP 地址
  • 几乎不可能记住所有网站的 IP

问题二:IP 地址可能变化

  • 服务器迁移
  • 负载均衡(多个 IP 对应一个域名)
  • CDN 调度(根据地理位置返回不同 IP)

DNS 的作用

  • 域名保持不变,IP 地址可以动态变化
  • 用户始终使用域名访问,无需关心底层 IP

问题三:分布式管理

互联网上有数十亿个域名,不可能由单一服务器管理。

DNS 的解决方案

  • 分层、分布式的数据库架构
  • 各级域名服务器分工协作
  • 缓存机制提高查询效率

1.3 DNS 的核心特性

特性说明
分布式全球分布的域名服务器共同维护
层次化树状结构,从根域名到顶级域名再到子域名
缓存机制各级服务器缓存查询结果,减少查询次数
高可用冗余设计,单点故障不影响整体服务
动态更新支持域名记录的增删改查

二、DNS 的域名结构

2.1 域名的层次结构

DNS 采用树状层次结构,从右到左层级递增:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────────────────────┐
│ DNS 域名层次结构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ . │
│ (根域名) │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ .com .org .cn │
│ (顶级域名) (顶级域名) (顶级域名) │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ example wikipedia baidu │
│ (二级域名) (二级域名) (二级域名) │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ www www www │
│ (三级域名/主机名) (三级域名/主机名) (三级域名/主机名) │
│ │
│ 完整域名:www.example.com. │
│ (注意末尾的点,表示根域名) │
│ │
└─────────────────────────────────────────────────────────────────┘

2.2 域名组成部分

1
2
3
4
5
6
www.example.com.
│ │ │ │
│ │ │ └── 根域名(通常省略)
│ │ └──── 顶级域名(TLD)
│ └──────────── 二级域名
└───────────────── 主机名/子域名
部分说明示例
根域名最顶层,用点 . 表示.
顶级域名(TLD)根域名的子域名.com.org.cn.net
二级域名顶级域名的子域名examplebaidugoogle
子域名/主机名二级域名的子域名wwwmailblogapi

2.3 顶级域名分类

类型说明示例
通用顶级域名(gTLD)通用用途.com.org.net.info
国家代码顶级域名(ccTLD)国家/地区专用.cn(中国)、.us(美国)、.jp(日本)
新通用顶级域名(new gTLD)2012 年后新增.app.blog.shop.xyz
基础设施域名ARPA 专用.arpa

2.4 子域名的使用

1
2
3
4
5
6
7
8
example.com                    # 主域名
├── www.example.com # Web 服务器
├── mail.example.com # 邮件服务器
├── blog.example.com # 博客
├── api.example.com # API 接口
├── admin.example.com # 管理后台
├── cdn.example.com # CDN 加速
└── static.example.com # 静态资源

三、DNS 服务器类型

3.1 DNS 服务器架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
┌─────────────────────────────────────────────────────────────────┐
│ DNS 服务器架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ 根域名服务器 │ ◀── 全球 13 组,管理顶级域名 │
│ │ (Root DNS) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ 顶级域名服务器 │ ◀── 管理各顶级域名(.com、.cn 等) │
│ │ (TLD DNS) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ 权威域名服务器 │ ◀── 管理具体域名(example.com) │
│ │(Authoritative)│ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ 递归域名服务器 │ ◀── 为用户递归查询,缓存结果 │
│ │ (Recursive) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ 用户主机 │ ◀── 发起 DNS 查询 │
│ │ (Stub) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

3.2 根域名服务器(Root Name Server)

职责:

  • 管理所有顶级域名(TLD)的信息
  • 返回顶级域名服务器的地址

特点:

  • 全球只有 13 组(A-M),但每组有多个镜像
  • 使用任播(Anycast)技术,全球分布数百个节点
  • 不直接回答具体域名的查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
根域名服务器列表:
├── a.root-servers.net (198.41.0.4)
├── b.root-servers.net (199.9.14.201)
├── c.root-servers.net (192.33.4.12)
├── d.root-servers.net (199.7.91.13)
├── e.root-servers.net (192.203.230.10)
├── f.root-servers.net (192.5.5.241)
├── g.root-servers.net (192.112.36.4)
├── h.root-servers.net (198.97.190.53)
├── i.root-servers.net (192.36.148.17)
├── j.root-servers.net (192.58.128.30)
├── k.root-servers.net (193.0.14.129)
├── l.root-servers.net (199.7.83.42)
└── m.root-servers.net (202.12.27.33)

3.3 顶级域名服务器(TLD Name Server)

职责:

  • 管理特定顶级域名下的所有二级域名
  • 返回权威域名服务器的地址

分类:

  • 通用 TLD:Verisign 管理 .com.net,PIR 管理 .org
  • 国家 TLD:CNNIC 管理 .cn,JPRS 管理 .jp
1
2
3
4
5
6
7
8
9
10
11
.com 顶级域名服务器示例:
├── a.gtld-servers.net
├── b.gtld-servers.net
├── c.gtld-servers.net
└── ...

.cn 顶级域名服务器示例:
├── a.dns.cn
├── b.dns.cn
├── c.dns.cn
└── d.dns.cn

3.4 权威域名服务器(Authoritative Name Server)

职责:

  • 存储特定域名的 DNS 记录
  • 提供域名到 IP 的最终映射

类型:

  • 主 DNS 服务器(Master):存储区域文件的原始副本
  • 从 DNS 服务器(Slave):从主服务器同步数据,提供冗余
1
2
3
4
example.com 的权威域名服务器:
├── ns1.example.com (主)
├── ns2.example.com (从)
└── ns3.example.com (从)

3.5 递归域名服务器(Recursive/Resolver Name Server)

职责:

  • 代表用户进行完整的 DNS 查询
  • 缓存查询结果,提高响应速度

常见递归 DNS:
| 服务商 | DNS 地址 | 特点 |
|——–|———|——|
| 本地 ISP | 自动分配 | 默认使用,速度一般 |
| 阿里云 DNS | 223.5.5.5 / 223.6.6.6 | 国内速度快 |
| 腾讯云 DNS | 119.29.29.29 | 国内速度快 |
| 114 DNS | 114.114.114.114 | 老牌公共 DNS |
| Google DNS | 8.8.8.8 / 8.8.4.4 | 全球可用 |
| Cloudflare | 1.1.1.1 | 隐私保护好 |
| OpenDNS | 208.67.222.222 | 有安全过滤 |


四、DNS 解析流程

4.1 完整解析流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
┌─────────────────────────────────────────────────────────────────┐
│ DNS 完整解析流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 用户在浏览器输入 www.example.com │
│ │ │
│ ▼ │
│ 2. 浏览器检查本地缓存 │
│ ├── 命中 → 直接返回 IP │
│ └── 未命中 → 继续下一步 │
│ │ │
│ ▼ │
│ 3. 操作系统检查 hosts 文件 │
│ ├── 命中 → 直接返回 IP │
│ └── 未命中 → 继续下一步 │
│ │ │
│ ▼ │
│ 4. 操作系统检查本地 DNS 缓存 │
│ ├── 命中 → 直接返回 IP │
│ └── 未命中 → 向递归 DNS 发起查询 │
│ │ │
│ ▼ │
│ 5. 递归 DNS 服务器查询 │
│ ├── 检查自身缓存 │
│ ├── 命中 → 返回结果 │
│ └── 未命中 → 开始递归查询 │
│ │ │
│ ▼ │
│ 6. 递归 DNS 向根域名服务器查询 │
│ └── 根服务器返回 .com TLD 服务器地址 │
│ │ │
│ ▼ │
│ 7. 递归 DNS 向 .com TLD 服务器查询 │
│ └── TLD 服务器返回 example.com 权威服务器地址 │
│ │ │
│ ▼ │
│ 8. 递归 DNS 向权威服务器查询 │
│ └── 权威服务器返回 www.example.com 的 IP 地址 │
│ │ │
│ ▼ │
│ 9. 递归 DNS 缓存结果并返回给操作系统 │
│ │ │
│ ▼ │
│ 10. 操作系统缓存结果并返回给浏览器 │
│ │ │
│ ▼ │
│ 11. 浏览器向 IP 地址发起 HTTP 请求 │
│ │
└─────────────────────────────────────────────────────────────────┘

4.2 递归查询 vs 迭代查询

递归查询(Recursive Query)

特点: DNS 服务器代替客户端完成全部查询工作。

1
2
3
4
5
6
7
8
客户端 ──递归查询──▶ 递归 DNS 服务器

├── 向根服务器查询
├── 向 TLD 服务器查询
├── 向权威服务器查询


返回最终结果

优点: 客户端简单,只需一次查询
缺点: 递归 DNS 服务器负载高


迭代查询(Iterative Query)

特点: DNS 服务器只返回下一级服务器的地址,由客户端继续查询。

1
2
3
4
5
6
7
8
9
10
11
客户端 ──迭代查询──▶ 根服务器
│ │
│ └── 返回 TLD 服务器地址

├── 迭代查询──▶ TLD 服务器
│ │
│ └── 返回权威服务器地址

└── 迭代查询──▶ 权威服务器

└── 返回最终 IP

优点: 分布式查询,负载均衡
缺点: 客户端需要多次查询

实际应用:

  • 客户端 → 递归 DNS:递归查询
  • 递归 DNS → 各级服务器:迭代查询

4.3 DNS 查询类型

查询类型说明示例
A 记录查询查询 IPv4 地址www.example.com93.184.216.34
AAAA 记录查询查询 IPv6 地址www.example.com2606:2800:220:1:248:1893:25c8:1946
CNAME 查询查询别名blog.example.comexample.github.io
MX 查询查询邮件服务器example.commail.example.com
NS 查询查询域名服务器example.comns1.example.com
TXT 查询查询文本记录用于验证域名所有权

五、DNS 记录类型详解

5.1 常用 DNS 记录类型

记录类型用途示例
AIPv4 地址www IN A 192.0.2.1
AAAAIPv6 地址www IN AAAA 2001:db8::1
CNAME别名记录blog IN CNAME example.github.io
MX邮件交换IN MX 10 mail.example.com
NS域名服务器IN NS ns1.example.com
TXT文本记录IN TXT "v=spf1 include:_spf.google.com ~all"
SOA起始授权包含区域的管理信息
PTR反向解析1.2.0.192.in-addr.arpa IN PTR www.example.com
SRV服务定位_sip._tcp IN SRV 10 5 5060 sipserver.example.com
CAA证书颁发授权IN CAA 0 issue "letsencrypt.org"

5.2 A 记录(Address Record)

用途: 将域名映射到 IPv4 地址。

1
2
3
4
域名: www.example.com
类型: A
值: 192.0.2.1
TTL: 3600

一个域名可以有多个 A 记录(负载均衡):

1
2
3
www.example.com.    IN    A    192.0.2.1
www.example.com. IN A 192.0.2.2
www.example.com. IN A 192.0.2.3

DNS 轮询(Round Robin)会依次返回这三个 IP。


5.3 AAAA 记录(IPv6 Address Record)

用途: 将域名映射到 IPv6 地址。

1
2
3
4
域名: www.example.com
类型: AAAA
值: 2001:db8:85a3::8a2e:370:7334
TTL: 3600

IPv6 地址格式:

  • 128 位地址,用 8 组 16 进制数表示
  • 每组用冒号分隔
  • 连续的 0 可以省略(:: 只能出现一次)

5.4 CNAME 记录(Canonical Name Record)

用途: 创建域名的别名。

1
2
3
4
域名: blog.example.com
类型: CNAME
值: example.github.io
TTL: 3600

查询过程:

1
2
3
4
5
6
7
8
9
10
用户查询 blog.example.com


返回 CNAME: example.github.io


继续查询 example.github.io


返回 A 记录: 185.199.108.153

注意事项:

  • CNAME 记录不能与其他记录共存(如 MX、TXT)
  • 根域名(example.com)不能有 CNAME 记录
  • 多级 CNAME 会增加查询时间

5.5 MX 记录(Mail Exchange Record)

用途: 指定邮件服务器。

1
2
3
4
5
域名: example.com
类型: MX
优先级: 10
值: mail.example.com
TTL: 3600

优先级说明:

  • 数值越小,优先级越高
  • 优先使用优先级高的服务器
  • 高优先级服务器不可用时,使用低优先级服务器
1
2
3
example.com.    IN    MX    10 mail1.example.com
example.com. IN MX 20 mail2.example.com
example.com. IN MX 30 mail3.example.com

5.6 NS 记录(Name Server Record)

用途: 指定域名的权威 DNS 服务器。

1
2
3
4
域名: example.com
类型: NS
值: ns1.example.com
TTL: 86400

通常配置多个 NS 记录:

1
2
3
example.com.    IN    NS    ns1.example.com
example.com. IN NS ns2.example.com
example.com. IN NS ns3.example.com

5.7 TXT 记录(Text Record)

用途: 存储任意文本信息,常用于验证和配置。

常见用途:

1
2
3
4
5
6
7
8
9
10
11
# SPF 记录(防止邮件伪造)
example.com. IN TXT "v=spf1 include:_spf.google.com ~all"

# DKIM 记录(邮件签名验证)
selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG..."

# 域名所有权验证
default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG..."

# Google 网站验证
example.com. IN TXT "google-site-verification=abc123..."

5.8 SOA 记录(Start of Authority)

用途: 定义 DNS 区域的管理信息。

1
2
3
4
5
6
example.com.    IN    SOA    ns1.example.com. admin.example.com. (
2024010101 ; Serial(序列号)
3600 ; Refresh(刷新间隔)
1800 ; Retry(重试间隔)
604800 ; Expire(过期时间)
86400 ) ; Minimum TTL(最小 TTL)

字段说明:
| 字段 | 说明 |
|——|——|
| Primary NS | 主域名服务器 |
| Admin Email | 管理员邮箱(. 代替 @)|
| Serial | 区域文件版本号,变更时递增 |
| Refresh | 从服务器多久检查一次更新 |
| Retry | 刷新失败后多久重试 |
| Expire | 从服务器多久后停止服务 |
| Minimum TTL | 记录的默认 TTL |


六、DNS 缓存机制

6.1 缓存层级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌─────────────────────────────────────────────────────────────────┐
│ DNS 缓存层级 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Level 1: 浏览器缓存 │
│ ├── 缓存时间:几分钟到几小时 │
│ └── Chrome: chrome://net-internals/#dns │
│ │
│ Level 2: 操作系统缓存 │
│ ├── Windows: ipconfig /displaydns │
│ ├── macOS: dscacheutil -q host │
│ └── Linux: systemd-resolve --statistics │
│ │
│ Level 3: 本地 hosts 文件 │
│ ├── Windows: C:\Windows\System32\drivers\etc\hosts │
│ ├── macOS/Linux: /etc/hosts │
│ └── 优先级最高,用于本地测试 │
│ │
│ Level 4: 递归 DNS 服务器缓存 │
│ ├── ISP DNS、公共 DNS 都有缓存 │
│ └── 缓存时间由 TTL 决定 │
│ │
└─────────────────────────────────────────────────────────────────┘

6.2 TTL(Time To Live)

TTL 决定 DNS 记录在缓存中的存活时间。

1
2
3
www.example.com.    3600    IN    A    192.0.2.1

└── TTL: 3600 秒(1 小时)

TTL 设置建议:

场景TTL 建议说明
稳定的服务86400(24 小时)减少查询次数
即将变更300(5 分钟)快速生效
负载均衡300-600快速切换
CDN 场景600灵活调度

6.3 清除 DNS 缓存

Windows:

1
2
3
4
5
# 查看 DNS 缓存
ipconfig /displaydns

# 清除 DNS 缓存
ipconfig /flushdns

macOS:

1
2
3
4
5
6
7
8
# macOS Ventura 及以后
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

# macOS Monterey
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

# macOS Big Sur 及以前
sudo killall -HUP mDNSResponder

Linux:

1
2
3
4
5
# systemd-resolved
sudo systemd-resolve --flush-caches

# nscd
sudo systemctl restart nscd

浏览器:

1
Chrome: chrome://net-internals/#dns → Clear host cache

七、DNS 安全机制

7.1 DNS 面临的安全威胁

威胁类型说明危害
DNS 劫持篡改 DNS 响应,返回错误 IP流量劫持、钓鱼攻击
DNS 缓存投毒向 DNS 缓存注入虚假记录用户访问恶意网站
DNS 隧道利用 DNS 协议传输数据绕过防火墙、数据泄露
DNS 放大攻击利用 DNS 响应大于请求的特性DDoS 攻击
DNS 劫持(本地)篡改 hosts 文件或本地 DNS本地流量劫持

7.2 DNSSEC(DNS Security Extensions)

作用: 为 DNS 提供数据来源验证和完整性保护。

原理:

  • 使用数字签名验证 DNS 响应
  • 防止 DNS 劫持和缓存投毒
  • 基于公钥加密技术
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────────────┐
│ DNSSEC 验证流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 域名所有者生成密钥对(公钥 + 私钥) │
│ │
│ 2. 使用私钥对 DNS 记录签名 │
│ └── 生成 RRSIG 记录 │
│ │
│ 3. 将公钥发布到 DNS(DNSKEY 记录) │
│ │
│ 4. 上级域名对公钥签名(DS 记录) │
│ └── 形成信任链 │
│ │
│ 5. 用户查询时验证签名 │
│ ├── 获取 DNS 记录 │
│ ├── 获取 RRSIG 签名 │
│ ├── 获取 DNSKEY 公钥 │
│ └── 验证签名是否有效 │
│ │
└─────────────────────────────────────────────────────────────────┘

DNSSEC 记录类型:
| 记录类型 | 说明 |
|———|——|
| DNSKEY | 存储公钥 |
| RRSIG | 数字签名 |
| DS | 委托签名者(上级对下级公钥的哈希)|
| NSEC/NSEC3 | 用于证明记录不存在 |


7.3 DoH(DNS over HTTPS)

作用: 通过 HTTPS 加密 DNS 查询,防止窃听和篡改。

原理:

1
2
3
4
5
6
7
传统 DNS:
用户 ──明文查询──▶ DNS 服务器
└── 容易被窃听、劫持

DoH:
用户 ──HTTPS 加密──▶ DoH 服务器
└── 查询内容被加密,安全可靠

配置示例(Chrome):

1
2
设置 → 隐私和安全 → 安全 → 使用安全 DNS
选择:Cloudflare (1.1.1.1) 或 Google (8.8.8.8)

DoH 服务商:
| 服务商 | DoH 地址 |
|——–|———|
| Cloudflare | https://cloudflare-dns.com/dns-query |
| Google | https://dns.google/dns-query |
| 阿里云 | https://dns.alidns.com/dns-query |
| DNSPod | https://doh.pub/dns-query |


7.4 DoT(DNS over TLS)

作用: 通过 TLS 加密 DNS 查询。

DoH vs DoT:
| 特性 | DoH | DoT |
|——|—–|—–|
| 传输层 | HTTPS(端口 443)| TLS(端口 853)|
| 隐蔽性 | 高(看起来像 HTTPS 流量)| 低(专用端口)|
| 部署难度 | 低 | 高 |
| 性能 | 稍慢(HTTP 开销)| 稍快 |


7.5 hosts 文件与安全

hosts 文件位置:

  • Windows: C:\Windows\System32\drivers\etc\hosts
  • macOS/Linux: /etc/hosts

用途:

1
2
3
4
5
6
7
8
# 本地开发测试
127.0.0.1 dev.example.com

# 屏蔽广告
0.0.0.0 ad.doubleclick.net

# 加速访问
140.82.121.4 github.com

安全风险:

  • 恶意软件可能篡改 hosts 文件
  • 定期检查 hosts 文件是否被篡改

八、DNS 实践配置

8.1 域名注册与 DNS 配置

步骤一:注册域名

在域名注册商(如阿里云、腾讯云、GoDaddy)注册域名。

步骤二:配置 DNS 服务器

1
2
3
4
5
6
在域名注册商后台设置 NS 记录:

example.com 的 DNS 服务器:
├── ns1.alidns.com
├── ns2.alidns.com
└── 或自定义 DNS 服务器

步骤三:添加 DNS 记录

1
2
3
4
5
6
7
8
9
10
11
12
13
# A 记录 - 网站
www A 192.0.2.1
@ A 192.0.2.1

# CNAME 记录 - 子域名
blog CNAME example.github.io
cdn CNAME example.cdn.com

# MX 记录 - 邮件
@ MX 10 mail.example.com

# TXT 记录 - 验证
@ TXT "v=spf1 include:_spf.google.com ~all"

8.2 常用 DNS 服务商配置

阿里云 DNS 配置

1
2
3
4
5
6
7
8
控制台:云解析 DNS → 域名解析

记录类型 主机记录 解析线路 记录值 TTL
A www 默认 192.0.2.1 600
A @ 默认 192.0.2.1 600
CNAME blog 默认 example.github.io 600
MX @ 默认 mail.example.com 600
TXT @ 默认 "v=spf1..." 600

智能解析(按运营商/地域):

1
2
3
4
5
记录类型    主机记录    解析线路        记录值
A www 电信 1.1.1.1
A www 联通 2.2.2.2
A www 移动 3.3.3.3
A www 海外 4.4.4.4

Cloudflare DNS 配置

特点:

  • 免费 CDN 和 DDoS 防护
  • 支持 DNSSEC
  • 支持 DoH/DoT
1
2
3
4
5
Type    Name    Content             TTL     Proxy status
A www 192.0.2.1 Auto Proxied (CDN 加速)
A api 192.0.2.2 Auto DNS only (仅 DNS)
CNAME blog example.github.io Auto Proxied
MX @ mail.example.com Auto DNS only

8.3 DNS 负载均衡配置

方法一:DNS 轮询(Round Robin)

1
2
3
www.example.com.    300    IN    A    192.0.2.1
www.example.com. 300 IN A 192.0.2.2
www.example.com. 300 IN A 192.0.2.3

特点:

  • 简单,无需额外设备
  • 无法检测服务器健康状态
  • 客户端可能缓存 IP,导致不均衡

方法二:智能 DNS(GSLB)

根据用户地理位置、网络状况返回最优 IP。

1
2
3
4
5
6
7
8
用户位置: 北京


DNS 服务器判断

├── 北京用户 → 返回北京机房 IP
├── 上海用户 → 返回上海机房 IP
└── 广州用户 → 返回广州机房 IP

方法三:健康检查

DNS 服务器定期检测服务器健康状态,自动剔除故障节点。

1
2
3
4
后端服务器:
├── 192.0.2.1 (健康) → 正常返回
├── 192.0.2.2 (故障) → 暂时不返回
└── 192.0.2.3 (健康) → 正常返回

九、DNS 工具与调试

9.1 常用 DNS 查询命令

dig(Domain Information Groper)

Linux/macOS 安装:

1
2
3
4
5
6
7
8
# macOS
brew install bind

# Ubuntu/Debian
sudo apt-get install dnsutils

# CentOS/RHEL
sudo yum install bind-utils

常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查询 A 记录
dig www.example.com

# 查询特定类型
dig www.example.com A
dig www.example.com AAAA
dig www.example.com MX
dig www.example.com NS
dig www.example.com TXT

# 指定 DNS 服务器
dig @8.8.8.8 www.example.com

# 详细输出
dig +trace www.example.com

# 简化输出
dig +short www.example.com

# 反向查询
dig -x 192.0.2.1

nslookup

Windows/Linux/macOS 都可用:

1
2
3
4
5
6
7
8
9
10
11
12
# 交互模式
nslookup
> www.example.com
> server 8.8.8.8
> set type=mx
> example.com
> exit

# 非交互模式
nslookup www.example.com
nslookup -type=mx example.com
nslookup -type=ns example.com

host

简单快捷:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查询 A 记录
host www.example.com

# 查询所有记录
host -a example.com

# 查询特定类型
host -t mx example.com
host -t ns example.com
host -t txt example.com

# 指定 DNS 服务器
host www.example.com 8.8.8.8

ping

测试域名连通性:

1
2
3
4
5
6
7
8
# 自动解析域名并 ping
ping www.example.com

# Windows 指定次数
ping -n 4 www.example.com

# Linux/macOS 指定次数
ping -c 4 www.example.com

9.2 在线 DNS 检测工具

工具网址功能
DNSCheckerdnschecker.org全球 DNS 传播检测
WhatsMyDNSwhatsmydns.netDNS 传播检测
IntoDNSintodns.comDNS 配置检查
MX Toolboxmxtoolbox.comMX、DNS、黑名单检测
Google Admin Toolboxtoolbox.googleapps.comDNS、MX、SPF 检测

9.3 DNS 故障排查

故障一:域名无法解析

排查步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 检查本地 DNS 缓存
ipconfig /displaydns # Windows
dscacheutil -q host # macOS

# 2. 清除 DNS 缓存
ipconfig /flushdns # Windows

# 3. 使用不同 DNS 服务器测试
dig @8.8.8.8 www.example.com
dig @223.5.5.5 www.example.com

# 4. 检查 NS 记录
dig +trace example.com NS

# 5. 检查权威 DNS
dig @ns1.example.com www.example.com

故障二:DNS 解析慢

优化方案:

  1. 更换更快的 DNS 服务器(如 223.5.5.5、8.8.8.8)
  2. 增加 DNS 记录的 TTL
  3. 使用 DNS 缓存
  4. 开启 DNS 预解析
1
2
3
<!-- HTML DNS 预解析 -->
<link rel="dns-prefetch" href="//cdn.example.com">
<link rel="preconnect" href="https://api.example.com">

故障三:DNS 解析不一致

原因:

  • DNS 缓存未过期
  • 全球 DNS 传播需要时间(通常几分钟到 48 小时)

解决方案:

  1. 提前降低 TTL
  2. 等待 DNS 传播完成
  3. 使用 DNSChecker 检测全球解析情况

十、DNS 性能优化

10.1 减少 DNS 查询次数

方法一:DNS 预解析

1
2
3
4
<!-- 提前解析关键域名的 DNS -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//cdn.jsdelivr.net">
<link rel="dns-prefetch" href="//ajax.googleapis.com">

方法二:预连接

1
2
3
<!-- DNS 解析 + TCP 握手 + TLS 握手 -->
<link rel="preconnect" href="https://api.example.com">
<link rel="preconnect" href="https://cdn.example.com" crossorigin>

方法三:减少域名数量

1
2
3
4
5
6
7
8
9
10
11
12
不推荐:
├── js.example.com/app.js
├── css.example.com/style.css
├── img1.example.com/logo.png
└── img2.example.com/banner.png

推荐:
└── cdn.example.com/
├── app.js
├── style.css
├── logo.png
└── banner.png

10.2 优化 TTL 设置

记录类型稳定期 TTL变更前 TTL
A/AAAA86400(24h)300(5min)
CNAME86400(24h)300(5min)
MX86400(24h)3600(1h)
TXT3600(1h)300(5min)

10.3 使用 HTTPDNS

问题: 传统 DNS 可能被劫持、解析慢。

解决方案: HTTPDNS 通过 HTTP 协议解析域名。

1
2
3
4
5
6
7
8
9
10
11
12
// HTTPDNS 示例
async function resolveDomain(domain) {
const response = await fetch(`https://dns.alidns.com/resolve?name=${domain}&type=1`);
const data = await response.json();
return data.ips[0]; // 返回 IP 地址
}

// 使用 HTTPDNS 解析的 IP 直接请求
const ip = await resolveDomain('api.example.com');
const response = await fetch(`https://${ip}/data`, {
headers: { 'Host': 'api.example.com' } // 设置 Host 头
});

优势:

  • 绕过本地 DNS,防止劫持
  • 解析更快、更准确
  • 支持自定义调度策略

十一、总结

11.1 DNS 核心要点

要点内容
定义域名系统,将域名解析为 IP 地址
结构树状层次结构:根 → TLD → 二级域名 → 子域名
服务器类型根服务器、TLD 服务器、权威服务器、递归服务器
解析流程递归查询 + 迭代查询
记录类型A、AAAA、CNAME、MX、NS、TXT、SOA 等
缓存机制浏览器、操作系统、hosts、递归 DNS 多级缓存
安全机制DNSSEC、DoH、DoT

11.2 DNS 查询流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用户输入域名

├── 浏览器缓存 ──命中──┐
│ │
├── hosts 文件 ──命中─┤
│ ├── 直接返回 IP
├── OS 缓存 ─────命中─┤
│ │
└── 递归 DNS ───命中──┘

└── 未命中

├── 根服务器 → TLD 服务器 → 权威服务器

└── 返回 IP,各级缓存

11.3 学习建议

  1. 理解核心原理:域名结构、解析流程、缓存机制
  2. 掌握常用记录:A、CNAME、MX、TXT 的使用场景
  3. 熟悉查询工具:dig、nslookup、host 的使用
  4. 关注安全问题:DNS 劫持、DNSSEC、DoH/DoT
  5. 实践配置操作:域名注册、DNS 配置、故障排查

DNS 是互联网的”电话簿”,是 Web 开发、运维、安全的基础知识,深入理解 DNS 对于排查网络问题、优化网站性能至关重要!