DNS域名解析
写在前面DNS 可能是互联网里最容易被忽视又最重要的基础设施。没有 DNS你上网就得记 IP 地址——220.181.38.148是百度140.250.180.109是京东……谁能记住DNS 的作用就一句话把人类记的名字翻译成机器认的号码。就像手机通讯录——你给老妈打电话手机自动拨出存在通讯录里的号码。DNS 就是互联网的通讯录。一、DNS 基础 — 互联网的查号台1.1 全球13台根服务器你可能听过一个说法全球只有13台根DNS服务器。准确地说是13个逻辑上的根服务器A到M由不同组织管理但每个逻辑服务器背后有成百上千台物理服务器通过任播(Anycast)技术提供服务。几个字母管理方A 根 (198.41.0.4)VerisignB 根 (199.9.14.201)USC-ISIC 根 (192.33.4.12)Cogent…………其中雪人计划是中国主导的 IPv6 根服务器部署了25组。1.2 FQDN — 域名的完整地址完整格式主机名.二级域.顶级域.www.magedu.com. ↑ ↑ ↑ ↑ 主机 二级 顶级 根 名 域 域 域注意FQDN 最后是有个.的代表根。但在日常使用中我们通常忽略它。www.magedu.com → 域名不完整 www.magedu.com. → FQDN完整最后有个点 mag67.magedu.com → FQDNmag67是主机名1.3 域名层次结构像一颗倒过来的树.根域 ┌─────┼─────┬──────┬──────┐ com cn org net edu ...顶级域 │ │ magedu baidu 二级域 │ │ bj sh image api 子域 │ │ www www 主机名/记录你买的magedu.com叫二级域www.magedu.com是二级域下的一个主机名A记录bj.magedu.com是子域。二、DNS 解析原理 — 你找谁我帮你问2.1 完整解析流程从输入域名到打开页面你在浏览器输入www.baidu.com回车。这中间经历了什么你在浏览器输入 www.baidu.com → 回车 ↓ ① 查浏览器缓存我以前去过没 ↓ 没找到 ② 查操作系统缓存系统知道不 ↓ 没找到 ③ 查 hosts 文件有人让我记过没 ↓ 没找到 ④ 发请求给本地DNS服务器LDNS ↓ ⑤ LDNS开始递归查询我帮你找 ↓ ⑥ LDNS迭代询问各层DNS LDNS → 根服务器baidu.com 归谁管 根服务器 → 去问 .com 服务器地址是…… LDNS → .com 服务器baidu.com 归谁管 .com 服务器 → 去问 ns.baidu.com地址是…… LDNS → ns.baidu.comwww.baidu.com 的IP是多少 ns.baidu.com → 是 220.181.38.148 ↓ ⑦ LDNS 把结果缓存起来返回给客户端 ↓ ⑧ 浏览器拿到 IP建立TCP连接开始访问这个流程必须理解透面试绝对会问。2.2 两种查询方式递归 vs 迭代查询方式是谁在干活一句话递归查询LDNS 替你跑腿到底你等着我去给你问到迭代查询LDNS 每次只能问一步你去问xxx吧我不帮你跑实际场景你的浏览器 → LDNS递归LDNS替你问到底 LDNS → 根服务器迭代根只告诉你下一步找谁 LDNS → .com服务器迭代同上 LDNS → ns.baidu.com迭代返回最终结果注意两个概念的区别正向解析域名 → IP最常用你在用的就是这个反向解析IP → 域名邮件服务器验证发件方身份、日志溯源三、资源记录类型 — DNS 的数据库表3.1 记录格式每条 DNS 记录包含5个字段Owner谁 TTL存活多久 CLASS一般是IN互联网 TYPE类型 RDATA数据3.2 常用记录类型必须掌握类型全称作用一句话类比SOAStart of Authority区域起点包含同步参数这个区的管理员声明NSName Server指定区域的权威DNS服务器谁说了算AAddress域名 → IPv4名字→门牌号(IPv4)AAAAIPv6 Address域名 → IPv6名字→门牌号(IPv6)CNAMECanonical Name别名→另一个域名我不是本名但你可以叫我……MXMail Exchange邮件服务器寄信寄到哪TXTText文本信息SPF/DKIM/域名验证备注栏PTRPointerIP → 域名反向解析门牌号→找主人名字3.3 SOA 记录 — 区域的身份证SOA 是一条区域的第一条记录定义了谁是这个区域的管理员、从服务器怎么同步 IN SOA ns1.magedu.com. admin.magedu.com. ( 2026061501 ; serial — 版本号改了就要递增 1D ; refresh — 从服务器每天检查一次 1H ; retry — 检查失败了一小时后再试 1W ; expire — 一周联系不上主服务器数据作废 3H ; minimum — 查不到的域名也缓存3小时 )serial 是最关键的。主从同步就是靠对比 serial 大小来判断有没有数据更新。改了数据一定要递增 serial不然从服务器永远不知道你改了。3.4 CNAME — CDN 的核心机制www.magedu.com. IN CNAME www.magedu.cdn.com.你访问www.magedu.comDNS 说别找我去找www.magedu.cdn.com然后浏览器去查这个域名的 IP。CDN 就是靠 CNAME 把你的域名指向最近的节点。3.5 PTR — 反向解析13 IN PTR ns1.magedu.com. 14 IN PTR www.magedu.com.从 IP 查域名。邮件服务器很看重这个——如果你的 IP 没有 PTR 记录或者 PTR 记录的域名和发件域名对不上对方的邮件服务器可能直接拒收判定为垃圾邮件。四、BIND 实践 — 搭建你自己的 DNS 服务器4.1 安装# Rocky / CentOS dnf install bind -y systemctl enable --now named # Ubuntu apt install bind9 -y systemctl enable --now bind94.2 主配置文件named.confoptions { listen-on port 53 { 127.0.0.1; any; }; # 监听所有网卡的53端口 allow-query { localhost; any; }; # 允许所有主机来查询 recursion yes; # 允许递归查询 forward first; forwarders { 223.5.5.5; 223.6.6.6; }; # 查不到的去问阿里DNS };⚠️BIND 配置的第一大坑每行配置结尾必须有;分号少一个分号服务就起不来。初学者90%的报错都是这个原因。4.3 区域配置告诉 BIND你要管理哪些域名# 根区域必须有 zone . IN { type hint; file named.ca; }; # 正向区域域名→IP zone magedu.com IN { type master; file /etc/bind/db.magedu.com; }; # 反向区域IP→域名 zone 0.0.10.in-addr.arpa IN { type master; file /etc/bind/db.10.0.0; };4.4 区域文件 — DNS 的数据表正向区域文件域名→IP$TTL 1D IN SOA ns1.magedu.com. admin.magedu.com. ( 2026061501 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ; minimum ) IN NS ns1.magedu.com. IN MX 10 mail.magedu.com. ns1 IN A 10.0.0.13 www IN A 10.0.0.14 mail IN A 10.0.0.14 web IN CNAME www.magedu.com.反向区域文件IP→域名13 IN PTR ns1.magedu.com. 14 IN PTR www.magedu.com. 14 IN PTR mail.magedu.com.代表当前域名zone 里定义的那个。ns1.magedu.com.最后的点不能丢——有点代表是FQDN没点会自动拼上域名后缀。4.5 配置生效的四种方式方式命令场景检查语法named-checkconf修改配置后第一步一定要做在线重载rndc reload改区域文件后不中断服务重载全部rndc reconfig新增了区域定义需要重载整份配置重启服务systemctl restart named以上搞不定的情况会短暂中断最佳实践改完配置先named-checkconf检查语法再rndc reload热加载不中断业务。五、主从同步 — DNS 的双机热备单个 DNS 服务器挂了业务就断了。所以生产环境至少是一主一从。5.1 架构图客户端(10.0.0.12) ↓ 查 www.magedu.com MASTER (10.0.0.13) ←同步→ SLAVE (10.0.0.15) ↓ WEB服务器 (10.0.0.14)5.2 Master 配置zone magedu.com IN { type master; file /etc/bind/db.magedu.com; allow-transfer { 10.0.0.15; }; # 只允许这台从服务器来同步 also-notify { 10.0.0.15; }; # 数据变了主动通知它 };5.3 Slave 配置zone magedu.com IN { type slave; file /etc/bind/slaves/db.magedu.com; # 同步过来的本地副本 masters { 10.0.0.13; }; # 主服务器是谁 };注意 slaves 目录权限BIND 以 named 用户运行slaves 目录必须是 named 可写的。否则同步会失败。这是最常见的主从同步失败原因。5.4 同步触发机制有两种机制方向说明NOTIFY推送Master → Slave主数据变了就喊一声快来同步REFRESH拉取Slave → Master从定期检查 serial 号默认一天一次触发同步的四步操作① 修改区域文件 → 增加serial必须递增 ② rndc reload → 让修改生效 ③ NOTIFY通知 → Master通知Slave有更新 ④ Slave检查serial → 发现变大开始同步踩坑总结改了区域文件没改 serial从服务器永远不会同步你的修改。六、DNS 检测工具 — 运维的听诊器dig — 最强工具运维首选dig www.magedu.com # 基础查询 dig www.magedu.com 10.0.0.13 # 指定DNS服务器查询 dig -t mx magedu.com # 查MX记录 dig -x 8.8.8.8 # 反向查询 dig short www.magedu.com # 只输出IP适合脚本用dig 的输出信息最全——你能看到查询耗时、哪个DNS服务器回复的、权威还是非权威答案、TTL还剩多少。排错首选。host — 简洁快速host www.magedu.com host -t mx magedu.com输出最简洁适合快速看一眼。nslookup — 交互式查询nslookup server 10.0.0.13 # 切到自建的DNS set typemx # 查MX记录 magedu.com # 查这个域名 exit适合交互式排查——在一个工具里反复切DNS服务器、切查询类型。rndc — BIND 管理rndc status # 看BIND运行状态 rndc reload # 重载配置 rndc flush # 清空缓存 rndc retransfer domain # 强制从服务器重新同步七、高级主题7.1 DNS 转发 — 有事找我上级学校宿舍楼的保安不认识快递员但他认识门卫室。快递来了他先问门卫室——门卫室知道就告诉保安不知道他再去查通讯录。这就是 DNS 转发模式含义场景forward first先问转发器查不到再自己查最常用forward only只问转发器查不到就报错公司内DNS只信任特定的上游options { forward first; forwarders { 223.5.5.5; 223.6.6.6; }; };7.2 DNS 视图View— 智能DNS同一个域名内网用户查到一个内网IP外网用户查到公网IP。view internal { match-clients { 10.0.0.0/8; }; # 内网来的 zone magedu.com IN { type master; file db.magedu.com.internal; # 返回 10.0.x.x }; }; view external { match-clients { any; }; # 外网来的 zone magedu.com IN { type master; file db.magedu.com.external; # 返回公网IP }; };这就是CDN 和 智能DNS 的基础——根据你从哪来的返回离你最近的节点IP。7.3 子域授权大公司把 DNS 管理下放给各个部门magedu.com → 总部管 bj.magedu.com → 北京分公司管 sh.magedu.com → 上海分公司管做法父区域的 zone file 里加 NS 记录指向子域的 DNS 服务器。7.4 Ubuntu 的 systemd-resolvedUbuntu 有个特殊的地方——它用systemd-resolved管理 DNS 解析不是一个单纯的/etc/resolv.conf。resolvectl status # 查看当前DNS配置 resolvectl flush-caches # 清空DNS缓存常见坑你手动改了/etc/resolv.conf重启后又被 systemd-resolved 覆盖了。要永久改 DNS得用nmcli或netplan配或者改/etc/systemd/resolved.conf。八、CDN — 让北京用户访问北京服务器8.1 CDN 的三大核心机制机制作用一句话智能DNS调度根据用户位置返回最近的节点IP你是北京的去北京节点内容缓存静态资源存在边缘节点你常看的视频我提前下载好了回源边缘节点没有就去源站拉我这儿没有去总部拿一份8.2 CDN 工作流程用户请求 → DNS解析 → CNAME到CDN厂商 ↓ CDN智能DNS → 定位最近的边缘节点 ↓ 边缘节点有缓存 → 有 → 直接返回快 ↓ 没有 回源站拉取 → 缓存到本地 → 返回给用户用京东自营来理解 CDN源站京东总仓在北京边缘节点全国各地的京东仓库智能DNS系统自动把你分配到最近的仓库缓存热销商品提前配送到各地仓库回源你买的东西本地仓库没有从总仓调货九、常见坑点全是血泪教训;漏了— BIND 配置文件每行结尾必须加分号少一个就起不来serial 没递增— 改了数据没改 serial从服务器永远不会同步防火墙没放行53端口— DNS 用 TCP UDP 53都要放SELinux 没关— BIND 被 SELinux 限制了无法读写区域文件Rocky常见slaves 目录权限不对— named 用户没写权限同步失败转发时 dnssec 冲突— 有些上游DNS不支持dnssec要关掉bogon 显示— dig 显示 bogon 是因为反向解析没配resolv.conf 被覆盖— Ubuntu 有 systemd-resolved 管着手动改没用要点速查卡DNS 解析八步浏览器缓存 → 系统缓存 → hosts文件 → LDNS → 根服务器 → 顶级域 → 权威DNS → 返回IP核心记录类型SOA — 区域声明含同步参数 NS — 谁是这个域的权威DNS A — 域名 → IPv4 AAAA — 域名 → IPv6 CNAME — 别名 → 真名 MX — 邮件服务器 PTR — IP → 域名反向 TXT — 文本SPF/DKIM主从同步三步① 改数据 → ② 递增serial → ③ rndc reload常用命令dig — 最全DNS查询 host — 简洁查询 nslookup — 交互式查询 rndc reload — 重载BIND配置 rndc flush — 清空BIND缓存 named-checkconf — 检查BIND语法端口DNS: UDP 53查询 TCP 53区域传输最后说几句DNS 是一个平时感觉不到存在一出问题全世界都卡的协议。最需要记住的几点DNS解析八步流程必须刻在脑子里——排错时你得知道卡在哪一步递归 vs 迭代的区别——面试必问BIND 配置的坑——;结尾、serial 递增、防火墙、SELinuxCDN 智能DNS 边缘缓存——这就是抖音、爱奇艺能秒开的原因反向解析很重要——邮件服务器用 PTR 记录防垃圾邮件学完 DNS跑一遍实验搭一个主DNS → 加区域 → 加几条A记录 → 用 dig 查 → 再搭一个从DNS → 测试主从同步。这套流程走完了DNS 你就基本拿下了。