跳到主要内容

DNS 域名系统

DNS(Domain Name System,域名系统)是互联网的核心服务,负责将人类可读的域名转换为机器可识别的 IP 地址。没有 DNS,我们需要记住每个网站的 IP 地址才能访问。

DNS 概述

DNS 是一个分布式的层次化数据库系统,存储了域名和 IP 地址的映射关系。它将域名解析的工作分散到全球各地的 DNS 服务器上,实现了高效、可靠的域名解析服务。

DNS 的作用

域名解析:将域名(如 www.example.com)转换为 IP 地址(如 93.184.216.34)。

反向解析:将 IP 地址转换为域名,用于安全验证和日志分析。

负载均衡:一个域名可以对应多个 IP 地址,DNS 可以轮询返回不同的 IP,实现简单的负载均衡。

服务发现:通过 SRV 记录,DNS 可以帮助客户端发现服务的位置和端口。

DNS 的特点

分布式:DNS 数据分布在全球数百万台服务器上,没有单点故障。

层次化:域名空间采用树状结构,每个层级由不同的组织管理。

缓存:DNS 查询结果会被缓存,减少查询次数,提高响应速度。

协议:DNS 主要使用 UDP 协议(端口 53),响应超过 512 字节时使用 TCP。

DNS 域名空间

域名结构

DNS 域名空间是一个倒置的树状结构:

                    . (根域)
/|\
/ | \
com net org ... (顶级域)
/\ | |
/ \ dns w3
example google
/ \
www mail

根域:用点号(.)表示,是域名空间的起点。全球有 13 个根服务器(A-M),由不同组织运营。

顶级域(TLD)

类型示例用途
通用顶级域(gTLD).com, .net, .org通用目的
国家代码顶级域(ccTLD).cn, .us, .jp国家/地区
新通用顶级域(new gTLD).app, .dev, .blog特定领域
基础设施顶级域.arpa基础设施用途

二级域:在顶级域下注册的域名,如 example.com。

子域:二级域下的域名,如 www.example.com、mail.example.com。

域名格式

域名由多个标签组成,从右到左依次是顶级域、二级域、子域:

www.example.com.
| | | |
| | | +-- 根域(通常省略)
| | +------ 顶级域
| +-------------- 二级域
+------------------- 子域(主机名)

命名规则

  • 每个标签最长 63 个字符
  • 整个域名最长 253 个字符
  • 只能包含字母、数字和连字符
  • 不区分大小写

DNS 记录类型

DNS 数据库中的每条记录称为资源记录(RR),不同类型的记录有不同的用途。

常见记录类型

A 记录(Address):将域名映射到 IPv4 地址。

www.example.com.  IN  A  93.184.216.34

AAAA 记录:将域名映射到 IPv6 地址。

www.example.com.  IN  AAAA  2606:2800:220:1:248:1893:25c8:1946

CNAME 记录(Canonical Name):域名别名,指向另一个域名。

blog.example.com.  IN  CNAME  www.example.com.

注意:CNAME 记录不能与其他记录共存(除 DNSSEC 记录)。

MX 记录(Mail Exchange):邮件服务器,包含优先级。

example.com.  IN  MX  10  mail.example.com.
example.com. IN MX 20 mail2.example.com.

优先级数字越小,优先级越高。

NS 记录(Name Server):指定域名的权威 DNS 服务器。

example.com.  IN  NS  ns1.example.com.
example.com. IN NS ns2.example.com.

TXT 记录:存储文本信息,常用于域名验证、SPF、DKIM 等。

example.com.  IN  TXT  "v=spf1 include:_spf.google.com ~all"

SOA 记录(Start of Authority):定义域名的权威信息。

example.com.  IN  SOA  ns1.example.com. admin.example.com. (
2024010101 ; 序列号
3600 ; 刷新间隔
1800 ; 重试间隔
604800 ; 过期时间
86400 ; 最小 TTL
)

SRV 记录(Service):定义服务的位置和端口。

_sip._tcp.example.com.  IN  SRV  10  60  5060  sipserver.example.com.

格式:优先级 权重 端口 目标

PTR 记录(Pointer):反向解析,将 IP 地址映射到域名。

34.216.184.93.in-addr.arpa.  IN  PTR  www.example.com.

DNSSEC 记录

DNSSEC(DNS Security Extensions)为 DNS 提供安全验证:

  • DNSKEY:公钥
  • RRSIG:记录签名
  • DS:授权签名者
  • NSEC/NSEC3:认证不存在

DNS 查询过程

递归查询 vs 迭代查询

递归查询:客户端向 DNS 服务器查询,服务器负责返回最终结果或错误。客户端只需发送一次请求。

迭代查询:DNS 服务器向其他服务器查询时,如果不知道答案,返回下一个应该查询的服务器地址,由请求方继续查询。

完整查询流程

以查询 www.example.com 为例:

1. 客户端检查本地缓存
|
+-- 命中 --> 返回结果

2. 向本地 DNS 服务器发送递归查询
|
+-- 本地 DNS 检查缓存
|
+-- 命中 --> 返回结果

3. 本地 DNS 向根服务器发送迭代查询
|
+-- 根服务器返回 .com 的 TLD 服务器地址

4. 本地 DNS 向 TLD 服务器查询
|
+-- TLD 服务器返回 example.com 的权威服务器地址

5. 本地 DNS 向权威服务器查询
|
+-- 权威服务器返回 www.example.com 的 IP 地址

6. 本地 DNS 缓存结果并返回给客户端

DNS 报文格式

DNS 报文由 5 部分组成:

+---------------------+
| 首部 | 12 字节
+---------------------+
| 问题部分 | 查询的问题
+---------------------+
| 回答部分 | 回答的资源记录
+---------------------+
| 授权部分 | 权威服务器的 NS 记录
+---------------------+
| 附加部分 | 附加信息
+---------------------+

首部格式

 0               16                              31
+----------------+--------------------------------+
| ID | QR | OPCODE | AA | TC | RD | RA|
+----------------+--------------------------------+
| QDCOUNT | ANCOUNT |
+----------------+--------------------------------+
| NSCOUNT | ARCOUNT |
+----------------+--------------------------------+
  • ID:标识符,用于匹配请求和响应
  • QR:查询/响应标志
  • OPCODE:操作码(0=标准查询)
  • AA:权威回答标志
  • TC:截断标志(响应超过 512 字节)
  • RD:期望递归
  • RA:支持递归

DNS 缓存

缓存的作用

DNS 缓存减少查询次数,提高响应速度。缓存存在于多个层级:

  • 浏览器缓存:浏览器维护的 DNS 缓存
  • 操作系统缓存:操作系统维护的 DNS 缓存
  • 本地 DNS 服务器缓存:ISP 或企业 DNS 服务器的缓存

TTL(Time To Live)

每条 DNS 记录都有 TTL,表示缓存的有效时间:

www.example.com.  3600  IN  A  93.184.216.34
^^^^
TTL(秒)

TTL 设置建议

  • 稳定的记录:较长的 TTL(如 86400 秒)
  • 可能变更的记录:较短的 TTL(如 300-3600 秒)
  • 变更前:提前降低 TTL,变更后恢复

缓存清除

# Windows
ipconfig /flushdns

# macOS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# Linux (systemd-resolved)
sudo systemd-resolve --flush-caches

# Linux (nscd)
sudo nscd -i hosts

DNS 工具

dig

dig(Domain Information Groper)是强大的 DNS 查询工具:

# 基本查询
dig www.example.com

# 指定记录类型
dig example.com MX
dig example.com ANY

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

# 反向查询
dig -x 93.184.216.34

# 显示详细过程
dig +trace www.example.com

# 只显示简短结果
dig +short www.example.com

nslookup

nslookup 是传统的 DNS 查询工具:

# 基本查询
nslookup www.example.com

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

# 指定记录类型
nslookup -type=MX example.com

# 交互模式
nslookup
> server 8.8.8.8
> set type=MX
> example.com

host

host 是简单的 DNS 查询工具:

# 基本查询
host www.example.com

# 指定记录类型
host -t MX example.com

# 反向查询
host 93.184.216.34

DNS 测试

# 测试 DNS 解析时间
dig www.example.com | grep "Query time"

# 测试 DNS 服务器响应
dig @8.8.8.8 www.example.com

# 检查 DNSSEC
dig +dnssec www.example.com

# 检查 DNS over HTTPS
curl -H 'accept: application/dns-json' 'https://dns.google/resolve?name=example.com'

DNS 安全

DNS 劫持

攻击者篡改 DNS 响应,将用户引导到恶意网站。

防护措施

  • 使用 DNSSEC 验证响应
  • 使用可信的 DNS 服务器
  • 使用 HTTPS(证书验证)

DNS 放大攻击

攻击者利用 DNS 服务器进行 DDoS 攻击,伪造源 IP 发送查询,响应发送给受害者。

防护措施

  • 配置 DNS 服务器限制递归查询
  • 使用速率限制
  • 部署 Anycast

DNS 隧道

通过 DNS 协议传输数据,绕过防火墙。

检测方法

  • 监控异常长的 DNS 查询
  • 检测异常的子域名
  • 分析 DNS 流量模式

DNS over HTTPS (DoH)

DoH 将 DNS 查询封装在 HTTPS 中,防止中间人监听:

# 使用 curl 测试 DoH
curl -H 'accept: application/dns-json' \
'https://dns.google/resolve?name=example.com&type=A'

DNS over TLS (DoT)

DoT 使用 TLS 加密 DNS 查询,端口 853:

# 使用 kdig 测试 DoT
kdig @dns.google example.com +tls

DNS 配置

/etc/resolv.conf

Linux 系统的 DNS 配置文件:

# DNS 服务器
nameserver 8.8.8.8
nameserver 8.8.4.4

# 搜索域
search example.com

# 选项
options timeout:2 attempts:3

systemd-resolved

现代 Linux 使用 systemd-resolved 管理 DNS:

# 查看 DNS 配置
resolvectl status

# 设置 DNS 服务器
resolvectl dns eth0 8.8.8.8 8.8.4.4

# 启用 DoT
# /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8
DNSOverTLS=opportunistic

BIND 配置

BIND 是最常用的 DNS 服务器软件:

# /etc/named.conf
zone "example.com" IN {
type master;
file "example.com.zone";
allow-update { none; };
};

# example.com.zone
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2024010101 ; 序列号
3600 ; 刷新
1800 ; 重试
604800 ; 过期
86400 ; 最小 TTL
)
@ IN NS ns1.example.com.
@ IN A 192.168.1.100
www IN A 192.168.1.100
mail IN A 192.168.1.101
@ IN MX 10 mail.example.com.

小结

DNS 是互联网的核心服务:

  1. 域名空间:层次化的树状结构
  2. 记录类型:A、AAAA、CNAME、MX、NS、TXT 等
  3. 查询过程:递归查询和迭代查询
  4. 缓存机制:多级缓存提高效率
  5. 安全:DNSSEC、DoH、DoT 保护 DNS 安全

理解 DNS 原理对于网络运维和故障排查至关重要。

练习

  1. 描述 DNS 域名解析的完整过程
  2. 说明常见 DNS 记录类型的用途
  3. 解释 DNS 缓存的工作原理
  4. 使用 dig 命令查询域名的各种记录