🌐 第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 服务设置)。