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 是互联网的核心服务:
- 域名空间:层次化的树状结构
- 记录类型:A、AAAA、CNAME、MX、NS、TXT 等
- 查询过程:递归查询和迭代查询
- 缓存机制:多级缓存提高效率
- 安全:DNSSEC、DoH、DoT 保护 DNS 安全
理解 DNS 原理对于网络运维和故障排查至关重要。
练习
- 描述 DNS 域名解析的完整过程
- 说明常见 DNS 记录类型的用途
- 解释 DNS 缓存的工作原理
- 使用 dig 命令查询域名的各种记录