第 01 章:DNS 协议与 BIND 简介
本章概述
本章介绍 DNS(Domain Name System)协议的基本原理、BIND 的历史与定位,以及权威服务器和递归服务器的区别。通过本章,你将建立对 DNS 体系的整体认知,为后续章节的实操打下基础。
1.1 DNS 协议基础
1.1.1 什么是 DNS
DNS(Domain Name System,域名系统)是互联网的核心基础设施之一,负责将人类可读的域名(如 www.example.com)转换为机器可识别的 IP 地址(如 93.184.216.34)。它是互联网的"电话簿"。
1.1.2 DNS 的历史
| 年份 | 事件 |
|---|---|
| 1983 | Paul Mockapetris 发明 DNS(RFC 882/883) |
| 1987 | DNS 规范更新(RFC 1034/1035,至今仍为核心标准) |
| 1993 | BIND 4.x 发布,成为最广泛使用的 DNS 软件 |
| 1997 | BIND 8.x 发布,增强安全和性能 |
| 2000 | BIND 9.x 发布,完全重写,支持视图、DNSSEC 等 |
| 2021 | BIND 9.18 LTS 发布,支持 DoT/DoH |
| 2024 | BIND 9.20 发布,持续优化性能和安全性 |
1.1.3 DNS 查询流程
一次完整的 DNS 查询过程如下:
客户端 递归服务器 根服务器 TLD服务器 权威服务器
│ │ │ │ │
│ 1. 查询 example.com │ │ │ │
│─────────────────────>│ │ │ │
│ │ 2. 查询根 │ │ │
│ │─────────────────────>│ │ │
│ │ 3. 返回 .com NS │ │ │
│ │<─────────────────────│ │ │
│ │ 4. 查询 .com │ │ │
│ │─────────────────────────────> │ │
│ │ 5. 返回 example.com NS│ │ │
│ │<───────────────────────────── │ │
│ │ 6. 查询 example.com │ │ │
│ │──────────────────────────────────────────>│
│ │ 7. 返回 A 记录 │ │ │
│ │<──────────────────────────────────────────│
│ 8. 返回最终结果 │ │ │ │
│<─────────────────────│ │ │ │
1.1.4 DNS 记录类型概览
| 记录类型 | 全称 | 用途 |
|---|---|---|
| A | Address | 将域名映射到 IPv4 地址 |
| AAAA | IPv6 Address | 将域名映射到 IPv6 地址 |
| CNAME | Canonical Name | 域名别名 |
| MX | Mail Exchanger | 邮件服务器 |
| NS | Name Server | 域名服务器 |
| TXT | Text | 文本记录(SPF、DKIM 等) |
| SOA | Start of Authority | 区域授权信息 |
| SRV | Service | 服务发现 |
| PTR | Pointer | 反向解析 |
| CAA | Certification Authority Authorization | CA 授权 |
1.1.5 DNS 协议端口与传输层
| 协议 | 端口 | 说明 |
|---|---|---|
| DNS over UDP | 53 | 传统查询,响应小于 512 字节 |
| DNS over TCP | 53 | 区域传输、大响应(超过 512 字节时回退) |
| DNS over TLS (DoT) | 853 | 加密查询(RFC 7858) |
| DNS over HTTPS (DoH) | 443 | 基于 HTTPS 的加密查询(RFC 8484) |
1.2 BIND 简介
1.2.1 什么是 BIND
BIND(Berkeley Internet Name Domain)是目前世界上使用最广泛的 DNS 服务器软件,由 ISC(Internet Systems Consortium)维护。据估算,全球约 70% 的 DNS 服务器运行 BIND。
1.2.2 BIND 的核心能力
| 能力 | 说明 |
|---|---|
| 权威 DNS | 托管区域文件,响应域名查询 |
| 递归 DNS | 代替客户端完成完整的 DNS 解析链 |
| 转发 | 将查询转发给上游 DNS |
| 视图(Views) | 根据来源 IP 返回不同解析结果 |
| DNSSEC | DNS 安全扩展,防止缓存投毒 |
| 动态更新 | 运行时修改区域记录(DDNS) |
| RPZ | 响应策略区域,用于安全拦截 |
| TSIG | 事务签名,保护区域传输和动态更新 |
1.2.3 BIND 版本线
# 查看当前安装的 BIND 版本
named -v
# 输出示例: BIND 9.18.30-1~ubuntu22.04.1-Ubuntu (Extended Support Version)
| 版本 | 状态 | 特性 |
|---|---|---|
| 9.16 | EOL(生命周期结束) | 不再推荐 |
| 9.18 | LTS(长期支持) | 推荐生产使用,支持到 2026 年 |
| 9.20 | 最新稳定版 | 新特性优先,支持到 2028 年 |
注意: 生产环境推荐使用 LTS 版本(9.18),除非你需要 9.20 中的特定新特性。
1.3 权威服务器 vs 递归服务器
这是理解 DNS 最关键的区分之一。
1.3.1 权威 DNS 服务器(Authoritative DNS Server)
权威服务器是域名数据的"源头"。它存储区域文件,对特定域名的查询给出最终答案。
场景:example.com 的权威服务器
客户端问:www.example.com 的 IP 是什么?
权威服务器答:93.184.216.34(直接从区域文件读取,这是"权威"答案)
特点:
- 存储域名的区域文件(Zone File)
- 响应带有
AA(Authoritative Answer)标志 - 不负责递归查询其他域名
- 通常由域名注册商或企业自建
1.3.2 递归 DNS 服务器(Recursive/Resolving DNS Server)
递归服务器是客户端的"代理人"。它代替客户端去完成完整的 DNS 解析链路,包括查询根服务器、TLD 服务器、权威服务器等。
场景:企业内网递归服务器
客户端问:www.example.com 的 IP 是什么?
递归服务器:(先查缓存,没有则逐级查询)
→ 问根服务器:.com 的 NS 是谁?
→ 问 .com TLD:example.com 的 NS 是谁?
→ 问 example.com 权威服务器:www 的 A 记录?
→ 最终返回:93.184.216.34
特点:
- 不存储权威数据(除非同时充当权威服务器)
- 有缓存机制,减少重复查询
- 需要开启递归功能(
recursion yes) - 通常部署在内网或 ISP 侧
1.3.3 对比总结
| 维度 | 权威服务器 | 递归服务器 |
|---|---|---|
| 数据来源 | 本地区域文件 | 上游权威服务器 |
| 是否缓存 | 通常不缓存 | 核心功能 |
| 服务对象 | 全球用户 | 特定客户端 |
| 安全重点 | 数据完整性、防篡改 | 防缓存投毒、防滥用 |
| 典型部署 | 面向公网 | 面向内网/ISP |
| 配置重点 | 区域文件、传输安全 | 转发、缓存、ACL |
1.3.4 同一台服务器同时充当两种角色
BIND 允许在同一实例中同时运行权威服务和递归服务,但强烈建议不要这样做:
# ⚠️ 不推荐的配置(安全风险)
options {
recursion yes; # 开启递归
allow-recursion { any; }; # 允许所有人递归
};
zone "example.com" {
type primary; # 同时是权威服务器
file "example.com.zone";
};
为什么混合角色不好?
- 递归服务器容易遭受缓存投毒攻击(Cache Poisoning)
- 攻击者可能通过递归查询获取你的权威区域数据
- 增加攻击面,难以实施细粒度安全策略
- 维护复杂度高
推荐做法:使用 views(视图)将权威服务和递归服务分离,详见 第 08 章。
1.4 适用场景
1.4.1 什么时候需要自建 DNS
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 企业内部域名解析 | BIND 递归 + 内部权威 | 解析 .internal、.corp 等内部域名 |
| 托管多个域名 | BIND 权威 | 为多个域名提供权威解析 |
| 合规要求(金融/政府) | BIND 权威 + DNSSEC | 数据主权、日志审计 |
| 安全防护 | BIND + RPZ | 拦截恶意域名、钓鱼网站 |
| 开发测试环境 | BIND 递归 | 自定义解析规则、模拟 DNS 故障 |
| CDN / 负载均衡 | BIND + GeoIP/Views | 基于来源 IP 的智能解析 |
| Kubernetes 集群 | CoreDNS(K8s 内) + BIND(外部) | 混合方案 |
1.4.2 什么时候不需要自建 DNS
- 个人网站:使用域名注册商或云厂商的免费 DNS 即可
- 小型企业:直接使用
8.8.8.8(Google)或1.1.1.1(Cloudflare) - 纯云环境:使用 AWS Route 53、阿里云 DNS 等云 DNS 服务
1.4.3 典型企业架构
┌─────────────────────────────────────────────────────┐
│ 互联网 │
└─────────┬───────────────────────┬───────────────────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ 权威 DNS │ │ 权威 DNS │ ← 主从架构(公网)
│ (主/Primary)│ │(从/Secondary)│
└─────┬─────┘ └───────────┘
│
┌─────▼─────┐
│ 防火墙 │
└─────┬─────┘
│
┌─────▼─────┐ ┌───────────┐
│ 递归 DNS │ │ 内网权威 │ ← 内部域名
│ (主/Primary)│ │ DNS │
└─────┬─────┘ └───────────┘
│
┌─────▼─────┐
│ 客户端 │ ← DHCP 下发递归服务器地址
└───────────┘
1.5 与其他 DNS 软件对比
| 特性 | BIND | Unbound | PowerDNS | CoreDNS | dnsmasq |
|---|---|---|---|---|---|
| 权威服务 | ✅ | ❌ | ✅ | ✅ | ❌ |
| 递归服务 | ✅ | ✅ | ✅(Recursor) | ✅ | ✅ |
| DNSSEC | ✅ | ✅ | ✅ | ✅(有限) | ❌ |
| 视图 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 动态更新 | ✅ | ❌ | ✅ | ❌ | ❌ |
| RPZ | ✅ | ✅ | ❌ | ❌ | ❌ |
| 配置复杂度 | 高 | 中 | 中 | 低 | 低 |
| 资源占用 | 中-高 | 低 | 中 | 低 | 极低 |
| 适用场景 | 企业级、ISP | 纯递归 | 大规模权威 | Kubernetes | 家庭/小型 |
1.6 BIND 的安装目录标准(FHS)
了解 BIND 的标准文件路径,后续章节会频繁使用:
| 路径 | 说明 |
|---|---|
/etc/named.conf 或 /etc/bind/named.conf | 主配置文件 |
/var/named/ 或 /var/cache/bind/ | 区域文件存放目录 |
/var/named/dynamic/ | 动态更新区域文件 |
/var/named/data/ | 统计数据 |
/var/log/named/ | 日志目录(可配置) |
/var/run/named/ 或 /run/named/ | PID 文件、Unix Socket |
/etc/named.root.key | 根区域 DNSSEC 密钥 |
注意: 不同 Linux 发行版路径略有不同:
- RHEL/CentOS:
/etc/named.conf+/var/named/- Debian/Ubuntu:
/etc/bind/named.conf+/var/cache/bind/
1.7 本章小结
| 概念 | 要点 |
|---|---|
| DNS | 互联网的域名解析系统,基于 UDP/TCP 53 端口 |
| BIND | 最广泛使用的 DNS 服务器软件,由 ISC 维护 |
| 权威服务器 | 存储域名数据的源头,给出最终答案 |
| 递归服务器 | 代替客户端完成完整解析链,有缓存机制 |
| 版本选择 | 生产推荐 9.18 LTS,新特性选 9.20 |