🌐 第04章 · DNS 解析
dig nslookup 记录类型 A/CNAME/MX
DNS 解析¶
DNS 把人类好记的域名(bangdream.xyz)翻译成机器能懂的 IP(2.25.183.241)。这一章讲 DNS 怎么工作、记录有哪些类型、用 dig/nslookup 怎么查、以及为什么"改完还没生效"。
DNS 是干嘛的¶
网络通信靠 IP,但人记不住一串数字,于是有 DNS 这个"网络电话簿"。bangdream.xyz 要能访问,前提是该域名的 A 记录指向 2.25.183.241,并在 DNS 服务器上正常发布。
hostname -I # 本机 IP
dig +short bangdream.xyz # 查域名对应的 IP
层次结构与解析过程¶
DNS 是分布式层级结构,自根到叶子逐级委托:
根服务器 (.)
└─ 顶级域 .xyz
└─ 二级域 bangdream.xyz
└─ 权威服务器(存有一条 A 记录 → 2.25.183.241)
一次完整解析分两阶段:
| 阶段 | 途径 | 缓存 | 说明 |
|---|---|---|---|
| 递归查询 | 本地 resolver 向上问 | 各级缓存 | 用户只发起一次 |
| 迭代查询 | resolver 逐级找 | 权威结果 | 根→TLD→权威一步步追 |
你的机器通常不直接问权威服务器,而是问本地 resolver。本机 DNS 指向 systemd-resolved 的 stub 解析器 127.0.0.53:
cat /etc/resolv.conf # 看本机 DNS 配置
resolvectl status # 看当前上游 DNS 与缓存
nameserver 127.0.0.53 # systemd-resolved 的本地 stub
常见 DNS 记录类型¶
| 类型 | 作用 | 示例 | 本机应用 |
|---|---|---|---|
| A | 域名 → IPv4 | bangdream.xyz → 2.25.183.241 |
网站主记录 |
| AAAA | 域名 → IPv6 | → 2a02:4780:75:fdeb::1 |
网站 IPv6 地址 |
| CNAME | 别名指向另一域名 | www → bangdream.xyz |
子域转发,CDN 常用 |
| MX | 邮件服务器 | @ → mail.example.com |
收发邮件路由 |
| TXT | 任意文本 | SPF/DKIM 记录 |
反垃圾邮件、验证 |
| NS | 权威服务器 | → ns1.registrar.com |
声明哪台管解析 |
| SOA | 区域起始 | 版本/过期时间 | 主从同步元数据 |
| PTR | IP → 域名(反解) | 2.25.183.241 → bangdream.xyz |
邮件反垃圾校验 |
易错点 CNAME 是"别名",新节点只能有一条,且一个地址要么是 CNAME、要么是 A/AAAA 等记录,不能混用同节点的其他记录(一般不允许 CNAME 与 A 并存,各家解析商会报错)。给域名同时做解析时,记得主域名加 A,子域用 CNAME 时别再加 A。
用 dig 查询¶
dig 是最常用的 DNS 工具,参数看着多,抓核心几个就够:
dig bangdream.xyz # 完整查询,含 ANSWER 段
dig +short bangdream.xyz # 只看结果 IP,最常用
dig +noall +answer bangdream.xyz # 只看 ANSWER 段落
dig @8.8.8.8 bangdream.xyz # 指定 DNS 服务器查询
dig +trace bangdream.xyz # 从根逐级追解析过程
dig -x 2.25.183.241 # 反向查询(PTR)
用 +short 日常判断解析是否正确最快:
dig +short bangdream.xyz
# 2.25.183.241 ← 输出这一行即解析正常
用 -x 做反向解析,常用来查"这是我的 IP,反解指向哪儿"。
dig -x 2.25.183.241 +short
用 @ 指定不同 DNS,可对比不同解析服务器结果是否一致,排查"是不是缓存了旧 IP"。
用 nslookup(轻量替代)¶
nslookup 输出更像对话,适合快速人肉确认:
nslookup bangdream.xyz
nslookup -type=MX bangdream.xyz
nslookup -type=AAAA bangdream.xyz
提示 如果公司环境只装了
nslookup没装dig,也没关系,功能等价,只是dig更结构化、更适合脚本解析。运维优先用dig。
为什么改了记录还不生效¶
刚改完 DNS 记录,经常出现"我明明改了怎么还是旧 IP",原因通常是缓存:
| 环节 | 缓存时长 | 说明 |
|---|---|---|
| 递归服务器缓存 | 由 TTL 决定 | 最长要等上一条记录的 TTL 过期 |
| 浏览器缓存 | 数分钟 | 换浏览器/无痕窗口可避开 |
| 本机系统缓存 | 视配置 | resolvectl flush-caches 可清 |
| 权威 DNS 生效 | 秒级到分钟 | 取决于解析商 |
易错点 DNS 改了"不生效",多半不是没改,而是旧记录 TTL 没到期。判断办法:用
dig +trace从权威服务器逐级追,能查到最后真正的权威回答;或者直接dig @权威DNS +short看权威返回的值——如果权威返回新 IP 而普通dig返回旧 IP,说明就是某一层缓存。
常见故障对照¶
| 现象 | 可能原因 | 处理 |
|---|---|---|
dig +short 无输出 |
记录没配 / 域名未上线 | 去解析商检查 A 记录 |
| 解析到旧 IP | 缓存 / TTL 未过 | resolvectl flush-caches + 等 TTL |
| 解析到错 IP | 记录配错 / 被劫持 | dig @8.8.8.8 与权威对比 |
| 本地解析慢 | resolver 异常 | resolvectl status 查上游 |
易错点¶
dig +short只输出 ANSWER 段落,别拿它当完整查询;想看细节去掉+short。- DNS 缓存的锅大于配错的锅:改记录后先
resolvectl flush-caches,再dig +trace确认权威值。 - CNAME 同节点不要再加 A 记录,否则解析冲突报错。
- "网站打不开"别一上来怪 DNS:先用
dig +short确认解析,再用nc -zv/curl测端口与服务,逐层排除(见第 7 章)。
相关命令¶
dig、nslookup、host、resolvectl、cat /etc/resolv.conf。配置文件:/etc/resolv.conf、ignore(systemd-resolved 的 DNS 服务设置)。