吃透 DNS:从递归 / 迭代解析到 BIND 权威服务器部署全实战

吃透 DNS:从递归 / 迭代解析到 BIND 权威服务器部署全实战 DNS 服务器1.DNS 层次结构DNS 采用层级化的域名命名体系从顶层到下层依次分为根域DNS 层级体系的最顶层以单个英文句点.表示是所有域名的最终溯源起点顶级域一级域根域的下一级分为两类核心类型 —— 通用顶级域如.com、.net、.org和国家代码顶级域如.cn、.us由互联网号码分配机构IANA统一管理二级域顶级域下的层级是各类组织 / 机构申请使用的核心域名如liu.cloud、redhat.fun具备独立的管理权限子域二级域向下延伸的层级如lab.liu.cloud为三级域可根据业务需求无限层级扩展。核心术语说明术语定义Domain以通用名结尾的资源记录集合代表 DNS 命名空间的完整子树示例laoma.cloudSubdomain某一域的子树域继承父域的命名空间示例lab.liu.cloud是liu.cloud的子域Zone特定名称服务器直接管辖的域范围可包含整个域或部分子域支持将子域委派至其他名称服务器管理2.DNS 查询主机发起的 DNS 查询类型由请求报头的RD字段决定核心分为递归查询和迭代查询两类RD1递归查询客户端默认使用的查询方式RD0迭代查询。2.1 递归查询核心逻辑以本地名称服务器为核心代理客户端仅需发送一次查询请求后续所有跨层级的 DNS 查询操作均由本地名称服务器完成客户端只需等待最终解析结果返回。完整流程客户端向本地名称服务器提交 DNS 域名解析请求本地名称服务器优先查询本地缓存若缓存中存在目标域名的解析记录直接将结果返回给客户端若缓存无记录则以客户端身份向根名称服务器发起查询请求根名称服务器返回目标域名所属顶级域对应的顶级名称服务器地址本地名称服务器向该顶级名称服务器发送查询请求顶级名称服务器优先查询本地缓存若存在解析记录直接返回给本地名称服务器再由其转发至客户端若不存在记录返回目标域名所属二级域对应的二级名称服务器地址本地名称服务器重复步骤 4-5依次向三级、四级等层级的名称服务器查询直至从权威名称服务器获取最终解析记录本地名称服务器将最终解析结果返回给客户端并将该记录缓存至本地供后续同域名查询复用。补充说明若权威服务器无对应域名记录会向客户端返回 “负响应”查询失败若配置了转发器权威服务器会通过转发器继续查询若客户端配置多台 DNS 服务器本地名称服务器会依次尝试向其他服务器查询。示例解析www.example.com客户端向本地名称服务器dns.example.com发送www.example.com的解析请求本地名称服务器缓存无该记录向根名称服务器a.rootserver.net发起查询根名称服务器返回.com顶级名称服务器的地址本地名称服务器向.com顶级名称服务器发送查询请求.com顶级名称服务器返回example.com二级名称服务器的地址本地名称服务器向example.com二级名称服务器发送查询请求example.com二级名称服务器返回www.example.com权威名称服务器的地址本地名称服务器向www.example.com权威名称服务器发送查询请求权威名称服务器返回www.example.com对应的 IP 地址本地名称服务器将 IP 地址返回给客户端完成解析流程。2.2 迭代查询核心逻辑以客户端自身为核心所有查询操作由客户端自主完成。客户端依次向本地名称服务器、根服务器、顶级服务器、权威服务器发送请求每一级服务器仅返回 “下一级服务器地址”直至客户端从权威服务器获取最终 IP 地址。完整流程客户端向本地名称服务器发送 DNS 查询请求本地名称服务器查询本地缓存若存在解析记录直接返回给客户端若不存在记录返回根名称服务器的地址客户端向根名称服务器发送查询请求根服务器返回顶级名称服务器地址客户端向顶级名称服务器发送查询请求顶级服务器返回二级名称服务器地址客户端重复步骤 4依次向三级、四级等层级服务器查询直至从权威服务器获取目标 IP若权威服务器无对应记录返回 “负响应”客户端可尝试向其他已配置的 DNS 服务器发起查询。示例解析www.example.com客户端向本地名称服务器发送www.example.com的解析请求本地名称服务器缓存无该记录返回根名称服务器a.rootserver.net的地址客户端向根服务器发送查询请求根服务器返回.com顶级名称服务器地址客户端向.com顶级服务器发送查询请求顶级服务器返回example.com二级名称服务器地址客户端向example.com二级服务器发送查询请求二级服务器返回www.example.com权威名称服务器地址客户端向权威服务器发送查询请求权威服务器返回www.example.com的 IP 地址客户端获取 IP 地址完成解析流程。2.3 递归与迭代查询对比维度递归查询迭代查询核心主体本地名称服务器客户端自身客户端操作仅发送 1 次请求等待最终结果返回依次向多台服务器主动发送请求服务器角色主动代理完成全流程查询仅返回下一级服务器地址不代理效率客户端侧效率高无需自主操作服务器侧负载低仅做地址指引3.DNS 资源记录DNS 区域中的资源记录RRResource Record用于存储区域内特定域名 / 对象的解析信息通用格式如下owner-name TTL classtypedata server.liu.cloud.86400IN A10.1.8.10字段说明字段名含义owner-name资源记录对应的域名 / 主机名如server.liu.cloudTTL记录的缓存时长单位秒决定 DNS 解析器缓存该记录的有效时间class记录类别互联网场景下几乎均为INInternettype记录类型核心类型A、CNAME、PTR、MX、NS 等data记录的具体数据格式随记录类型变化如 A 记录对应 IP 地址4.主机和资源记录任何主机客户端 / 服务器在 DNS 中需配置的核心资源记录至少 1 条 A 记录IPv4或 AAAA 记录IPv6用于 IP 反向解析的 PTR 记录可选的 1 条或多条 CNAME 记录别名记录。DNS 区域Zone需配置的核心资源记录唯一的 SOA 记录授权开始记录每个权威名称服务器对应的 NS 记录可选的 1 条或多条 MX 记录邮件交换记录可选的 1 条或多条 SRV 记录服务定位记录。5.配置权威名称服务器5.1 权威名称服务器架构权威名称服务器是存储 DNS 资源记录、并为管辖区域提供权威解析答案的核心服务器。Linux 系统中常用 Berkeley Internet Name DomainBIND软件实现该功能BIND 支持将权威服务器配置为两类角色主服务器Primary/Master区域记录的核心管理节点存储区域文件的原始版本辅助服务器Secondary/Slave通过 “区域传输” 机制定期从主服务器同步区域文件的最新版本提升解析可用性。注意同一台名称服务器可同时作为某区域的主服务器、另一区域的辅助服务器BIND 9.16 ESV 及后续版本中master/slave术语已逐步替换为primary/secondary。域名注册与权威服务器配置要求注册新 DNS 域名时需向注册商提供该域名所有公共权威名称服务器的域名和 IP 地址注册商会将该信息写入父域的区域文件NS/A/AAAA 记录确保 DNS 解析器能定位到目标名称服务器。为保障可靠性建议至少配置 2 台公共 DNS 服务器且部署在不同网络站点避免单点故障。权威服务器部署策略并非所有权威服务器都需公开可将主服务器配置为私有节点仅管理区域文件辅助服务器配置为公共节点对外提供权威解析既能保障外部客户端的解析需求又能保护主服务器免受外网攻击。架构示例 1外部客户端解析解析流程客户端的缓存名称服务器首先查询根名称服务器 → 根服务器指引至.com顶级服务器 → 顶级服务器返回laoma.cloud的 NS 记录 → 缓存服务器查询laoma.cloud的公共辅助服务器 → 获取最终解析结果。架构示例 2内部客户端解析优化方案部署内部辅助权威服务器内部客户端解析本地域名时无需访问外网既提升解析效率又增强安全性。5.2 安装 BINDBIND 是 Linux 系统中主流的 DNS 服务软件通过以下命令完成安装# 安装 BIND 服务端及工具包yuminstall-ybindbind-utils软件包说明bindBIND 服务端核心包提供 DNS 服务器运行能力bind-utilsBIND 配套工具包如 dig、nslookup 等用于 DNS 解析测试与调试。默认配置说明BIND 安装后默认配置为 “递归缓存名称服务器”核心特性仅对本地主机localhost及相关域 / 地址提供解析减轻根服务器负载仅监听 IPv4/IPv6 回环接口127.0.0.1、::1的 53 端口UDP/TCP仅允许本地主机上的程序访问。5.3 配置 BINDBIND 的核心配置文件为/etc/named.conf由 root 用户 /named 组拥有权限 0640SELinux 类型named_conf_t该文件控制 BIND 基础运行逻辑并指定区域文件的存储路径默认/var/named。完整的 BIND 配置流程包含以下核心步骤配置地址匹配列表配置 named 监听的 IP 地址配置客户端访问控制策略配置 DNS 区域Zone编写区域解析文件。5.4 完整配置实操示例1. 安装软件包[rootserver ~11:13:39]# yum install -y bind bind-utils2. 修改主配置文件/etc/named.conf[rootserver ~13:49:41]# vim /etc/named.confoptions{# 监听回环地址 业务地址 10.1.8.10listen-on port53{127.0.0.1;10.1.8.10;};# 监听 IPv6 回环地址listen-on-v6 port53{::1;};# 区域文件根目录directory/var/named;# 缓存转储文件路径dump-file/var/named/data/cache_dump.db;# 统计文件路径statistics-file/var/named/data/named_stats.txt;# 内存统计文件路径memstatistics-file/var/named/data/named_mem_stats.txt;# 递归查询文件路径recursing-file/var/named/data/named.recursing;# 安全根文件路径secroots-file/var/named/data/named.secroots;# 允许本地主机 10.1.8.0/24 网段查询allow-query{localhost;10.1.8.0/24;};# 关闭 DNSSEC 安全校验实验环境dnssec-enable no;dnssec-validation no;};# 新增正向解析区域liu.cloud主服务器zoneliu.cloudIN{typemaster;fileliu.cloud.zone;};# 新增反向解析区域8.1.10.in-addr.arpa主服务器zone8.1.10.in-addr.arpaIN{typemaster;file10.1.8.zone;};3. 准备区域文件# 进入区域文件目录[rootserver ~15:12:12]# cd /var/named/# 验证主配置文件语法[rootserver named15:24:54]# named-checkconf /etc/named.conf# 复制模板文件创建正向区域文件[rootserver named15:13:55]# cp -a named.localhost liu.cloud.zone# 编辑正向区域文件[rootserver named15:14:30]# vim liu.cloud.zone$TTL1D# 默认 TTL 1 天 IN SOA dns.liu.cloud. admin.liu.cloud(0;序列号 1D;刷新间隔1天 1H;重试间隔1小时 1W;过期时间1周 3H);负缓存时长3小时# NS 记录指定 liu.cloud 域的权威服务器 IN NS dns.liu.cloud.# A 记录dns.liu.cloud → 10.1.8.10dns IN A10.1.8.10# A 记录server.liu.cloud → 10.1.8.10server IN A10.1.8.10# A 记录client.liu.cloud → 10.1.8.11client IN A10.1.8.11# A 记录www.liu.cloud → 10.1.8.100www IN A10.1.8.100# MX 记录liu.cloud 邮件服务器优先级 10 IN MX10mail.liu.cloud.# A 记录mail.liu.cloud → 10.1.8.200mail IN A10.1.8.200# CNAME 记录web.liu.cloud 是 www.liu.cloud 的别名web IN CNAME www# 验证正向区域文件语法[rootserver named15:19:42]# named-checkzone liu.cloud liu.cloud.zone# 正常输出zone liu.cloud/IN: loaded serial 0 OK# 复制正向文件创建反向区域文件[rootserver named15:20:08]# cp -a liu.cloud.zone 10.1.8.zone# 编辑反向区域文件[rootserver named15:20:40]# vim 10.1.8.zone$TTL1D IN SOA dns.liu.cloud. admin.liu.cloud(0;序列号 1D;刷新间隔 1H;重试间隔 1W;过期时间 3H);负缓存时长# NS 记录 IN NS dns.liu.cloud.# PTR 记录10.1.8.10 → dns.liu.cloud10IN PTR dns.liu.cloud.# PTR 记录10.1.8.10 → server.liu.cloud10IN PTR server.liu.cloud.# PTR 记录10.1.8.11 → client.liu.cloud11IN PTR client.liu.cloud.# PTR 记录10.1.8.11 → student.liu.cloud11IN PTR student.liu.cloud.# PTR 记录10.1.8.100 → www.liu.cloud100IN PTR www.liu.cloud.# PTR 记录10.1.8.100 → web.liu.cloud100IN PTR web.liu.cloud.# PTR 记录10.1.8.200 → mail.liu.cloud200IN PTR mail.liu.cloud.# 验证反向区域文件语法[rootserver named15:24:54]# named-checkconf /etc/named.conf[rootserver named15:25:39]# named-checkzone 10.1.8 /var/named/10.1.8.zone# 正常输出zone 10.1.8/IN: loaded serial 0 OK4. 启动并启用 named 服务# 开机自启 立即启动 named 服务[rootserver named15:35:40]# systemctl enable named --now# 正常输出Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.# 关闭防火墙实验环境[rootserver named15:36:06]# systemctl stop firewalld5 客户端测试方式 1配置 DNS 后通过 ping 测试# 客户端配置 DNS 服务器为 10.1.8.10[rootclient ~16:03:20]# nmcli connection modify ens33 ipv4.dns 10.1.8.10# 重新加载网络连接[rootclient ~16:03:55]# nmcli connection up ens33# 正常输出连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/26# 测试 server.liu.cloud 解析[rootclient ~16:06:59]# ping -c1 serverPING server.liu.cloud(10.1.8.10)56(84)bytes of data.64bytes from server.liu.cloud(10.1.8.10):icmp_seq1ttl64time0.448ms --- server.liu.cloudpingstatistics ---1packets transmitted,1received,0% packet loss,time0ms rtt min/avg/max/mdev0.448/0.448/0.448/0.000 ms# 测试 www.liu.cloud 解析目标主机未开机故不可达[rootclient ~16:07:31]# ping -c1 wwwPING www.liu.cloud(10.1.8.100)56(84)bytes of data. From client.liu.cloud(10.1.8.11)icmp_seq1Destination Host Unreachable --- www.liu.cloudpingstatistics ---1packets transmitted,0received, 1 errors,100% packet loss,time0ms# 测试 mail.liu.cloud 解析目标主机未开机[rootclient ~16:08:30]# ping -c1 mailPING mail.liu.cloud(10.1.8.200)56(84)bytes of data. From client.liu.cloud(10.1.8.11)icmp_seq1Destination Host Unreachable --- mail.liu.cloudpingstatistics ---1packets transmitted,0received, 1 errors,100% packet loss,time0ms# 测试 dns.liu.cloud 解析[rootclient ~16:08:43]# ping -c1 dnsPING dns.liu.cloud(10.1.8.10)56(84)bytes of data.64bytes from server.liu.cloud(10.1.8.10):icmp_seq1ttl64time0.575ms --- dns.liu.cloudpingstatistics ---1packets transmitted,1received,0% packet loss,time0ms rtt min/avg/max/mdev0.575/0.575/0.575/0.000 ms# 测试 client.liu.cloud 解析[rootclient ~16:08:53]# ping clientPING client.liu.cloud(10.1.8.11)56(84)bytes of data.64bytes from client.liu.cloud(10.1.8.11):icmp_seq1ttl64time0.044ms64bytes from client.liu.cloud(10.1.8.11):icmp_seq2ttl64time0.094ms# 测试外网域名解析验证递归功能[rootclient ~16:09:22]# ping baidu.comPING baidu.com(110.242.74.102)56(84)bytes of data.64bytes from110.242.74.102(110.242.74.102):icmp_seq1ttl128time37.0ms方式 2通过 dig 工具精准测试# 测试 www.liu.cloud A 记录[rootclient ~15:47:28]# dig 10.1.8.10 www.liu.cloud;DiG9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.910.1.8.10 www.liu.cloud;(1server found)......;;ANSWER SECTION: www.liu.cloud.86400IN A10.1.8.100......# 过滤 ANSWER 段结果[rootclient ~15:58:34]# dig 10.1.8.10 www.liu.cloud |grep -A1 ANSWER;;flags: qr aa rd ra;QUERY:1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2--;;ANSWER SECTION: www.liu.cloud.86400IN A10.1.8.100# 显式指定查询 A 记录[rootclient ~15:59:25]# dig 10.1.8.10 www.liu.cloud A;DiG9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.910.1.8.10 www.liu.cloud A;(1server found)......;;ANSWER SECTION: www.liu.cloud.86400IN A10.1.8.100......# 测试 MX 记录[rootclient ~15:59:52]# dig 10.1.8.10 liu.cloud MX......;;ANSWER SECTION: liu.cloud.86400IN MX10mail.liu.cloud.......# 测试 mail.liu.cloud A 记录[rootclient ~16:00:08]# dig 10.1.8.10 mail.liu.cloud......;;ANSWER SECTION: mail.liu.cloud.86400IN A10.1.8.200......# 反向解析10.1.8.200 → mail.liu.cloud[rootclient ~16:00:33]# dig 10.1.8.10 -x 10.1.8.200......;;ANSWER SECTION:200.8.1.10.in-addr.arpa.86400IN PTR mail.liu.cloud.......# 反向解析10.1.8.100 → www/web.liu.cloud[rootclient ~16:01:01]# dig 10.1.8.10 -x 10.1.8.100......;;ANSWER SECTION:100.8.1.10.in-addr.arpa.86400IN PTR web.liu.cloud.100.8.1.10.in-addr.arpa.86400IN PTR www.liu.cloud.......# 测试 CNAME 记录web.liu.cloud → www.liu.cloud[rootclient ~16:01:28]# dig 10.1.8.10 web.liu.cloud......;;ANSWER SECTION: web.liu.cloud.86400IN CNAME www.liu.cloud. www.liu.cloud.86400IN A10.1.8.100......# 测试 server.liu.cloud A 记录[rootclient ~16:01:48]# dig 10.1.8.10 server.liu.cloud......;;ANSWER SECTION: server.liu.cloud.86400IN A10.1.8.10......。