Language:Chinese VersionEnglish Version

“总是DNS”这句话之所以存在,是因为它以令人尴尬的高频率成为现实。一个在你的笔记本电脑上运行但在同事电脑上无法访问的网站。一个部署后第一周邮件被归为垃圾邮件,第二周却正常收到的系统。一个SSL证书因错误消息拒绝解释原因而无法颁发。所有这些场景的根本原因往往是DNS问题,其频率超出了工程师的预期,而最能快速解决这些问题的开发者不是那些了解更多框架的人——而是那些真正理解开发者DNS知识如何转化为实际调试优势的人。本指南面向那些希望有意识地建立这种优势的人。

为什么DNS知识被系统性低估

DNS在技术栈中处于一个特殊位置:它工作时不可见,出问题时却令人困惑。大多数开发者通过注册商的控制面板与DNS交互,复制粘贴托管服务商通过邮件发送的名称服务器记录,然后就认为事情已经解决。这种方法在不出问题时确实有效,但当它失效时,如果不了解底层机制,故障模式确实令人困惑。

更深层次的问题是,DNS错误常常表现为其他方面的症状。SSL证书颁发失败看起来像是证书错误。邮件被归为垃圾邮件看起来像是声誉问题。网站在一个网络中可加载但在另一个网络中无法加载看起来像是CDN错误。没有坚实DNS基础的开发者会在错误的层面花费数小时。而理解DNS的人则直接使用dig命令,在五分钟内识别出配置错误,然后继续工作。

还有一个安全维度在典型的后端或前端课程中未得到足够重视。DNS不仅仅是查找服务——它是一个信任和路由层。配置错误的DNS会导致证书错误颁发、电子邮件欺骗和子域名劫持。理解记录的实际作用是避免这些故障的先决条件。

DNS解析实际如何工作

DNS的学术解释涉及递归解析器和根服务器,使这个过程听起来比实际情况更复杂。这里有一个有助于调试的简化版本。

当你的浏览器想要连接到api.example.com时,它首先检查本地缓存。如果没有缓存,它会询问操作系统的解析器,而解析器又会询问一个递归解析器——通常是你的ISP、公司网络或公共解析器,如1.1.1.1(Cloudflare)或8.8.8.8(Google)。递归解析器负责完成这项工作。

递归解析器从顶部开始。它联系十三个根名称服务器集群中的一个,询问在哪里可以找到 .com 的权威服务器。根服务器响应 .com TLD 名称服务器(由 Verisign 运营)的地址。然后,递归解析器询问 .com 名称服务器在哪里可以找到 example.com 的权威服务器。这些服务器响应指向您域名名称服务器的 NS 记录——无论您在注册商处配置的是什么。最后,递归解析器询问您的名称服务器获取 api.example.com 的 A 记录,获取 IP 地址,并将其返回给您的浏览器。整个链在热解析器的情况下通常在 100 毫秒内完成。

从这条链中可以得出两个实际含义。首先,在注册商处更改名称服务器是一个缓慢的操作——.com TLD 服务器需要传播更新,并且在 TLD 层的 NS 委派记录上的 TTL 通常是 48 小时。其次,您自己在名称服务器上的记录更改受您为各个记录设置的 TTL 限制。链的不同部分有不同的时钟,在迁移过程中混淆它们是常见的困惑来源。

开发者实际需要了解的记录类型

DNS 有数十种记录类型。大多数开发者需要深入理解其中七种,并能按名称识别其他几种。

A 和 AAAA

A 记录将主机名映射到 IPv4 地址。AAAA 记录将主机名映射到 IPv6 地址。这些是基本记录。常见错误:为域设置多个 A 记录并假设 DNS 会进行智能负载均衡。DNS 会平等地轮询 A 记录,而不管服务器健康状况如何——它不知道您的服务器是否实际响应。如果您需要智能路由,请使用负载均衡器或健康检查的 anycast(如 Cloudflare)。

CNAME

CNAME 记录将主机名映射到另一个主机名——然后目标会被递归解析。www.example.com CNAME example.com 意味着”解析 example.com 解析到的任何内容”。CNAME 对于指向更改 IP 地址的服务很有用,如 CDN 提供商或 SaaS 平台。最常违反的规则:您不能在区域顶点放置 CNAME(您的裸域,没有子域的 example.com)。RFC 1034 禁止这样做,因为 CNAME 记录不能与其他记录类型共存,而顶点总是至少需要 SOA 和 NS 记录。一些 DNS 提供商(Cloudflare、Route 53)提供 CNAME 扁平化,通过在查询时解析 CNAME 并返回 resulting A 记录来解决这个问题——这是提供商特定的扩展,不是标准的 DNS 行为。

MX

MX 记录指定负责接受您域名的邮件服务器,以及优先级值。优先级数值较低者获胜。example.com MX 10 mail1.example.comexample.com MX 20 mail2.example.com 表示 mail1 是主服务器,mail2 是备用服务器。关键错误:MX 记录必须指向有自己的 A 记录的主机名,而不是指向 IP 地址或 CNAME。RFC 2181 对此有明确规定。将 MX 记录设置为 CNAME 会导致某些邮件服务器传递失败。

TXT

TXT 记录是用于域名验证和邮件认证的自由文本字段。大多数开发者在设置 SPF、DKIM 和 DMARC(在邮件传递性部分介绍)、Google Search Console 验证或第三方服务所有权验证时会遇到 TXT 记录。同一主机名上允许多个 TXT 记录 — 它们可以共存而不会出现问题。开发者常犯的错误是添加第二个 SPF 记录而不是扩展现有记录。每个主机名只允许一个有效的 SPF TXT 记录;有两个记录会导致接收方拒绝或静默忽略它们。

NS

NS 记录将区域或子域委托给特定的名称服务器。在您的区域顶点,NS 记录列出了您的权威名称服务器。当您设置像 api.example.com 这样的子域并希望将其 DNS 管理委托给不同的提供商时,您会添加指向该提供商名称服务器的 NS 记录。使用基础设施即代码的开发者经常管理内部区域的 NS 委托。需要注意:区域文件中的顶点 NS 记录只是信息性的,但父区域中的粘记录才是实际解析的关键。您的注册商管理这些记录。

CAA

CAA (证书颁发机构授权) 记录指定哪些证书颁发机构被允许为您的域名颁发 SSL 证书。example.com CAA 0 issue "letsencrypt.org" 只允许 Let’s Encrypt 颁发 DV 证书。如果 CA 遇到的 CAA 记录不包含它们,则必须拒绝颁发。CAA 记录是一项有意义的安全控制 — 它们可以防止恶意或被攻破的 CA 错误颁发证书。相对于它们的价值,这些记录的部署率仍然不足。如果您同时使用 Let’s Encrypt 和 Cloudflare,请记住如果 Cloudflare 也为您的域名颁发证书,则需要同时包含两者。

TTL 策略:传播与缓存的权衡

TTL (生存时间) 以秒为单位测量,告诉递归解析器在重新查询之前缓存记录的时间长度。正确设置 TTL 是 DNS 管理中实际影响最大的决策之一,大多数开发者将其保留为注册商的默认值。

这种权衡是直接的:高TTL意味着更快的响应(缓存已预热)和更低的服务器负载,但变更传播缓慢。低TTL意味着变更传播迅速,但递归解析器会频繁重新查询,增加负载并在缓存未命中时略微增加解析延迟。

基于运营经验的合理分层策略:

  • 默认状态(稳定,无变更):大多数记录使用3600秒(1小时)。这提供了足够的缓存效率,同时保持变更窗口的可管理性。
  • 计划迁移前:在变更前24-48小时,将受影响记录的TTL降至300秒(5分钟)。这使解析器预先接受快速更新。
  • 活跃事件或迁移期间:60-300秒。低到足以让变更在几分钟内传播,但又不会低到过度冲击服务器。
  • 迁移后,稳定时:将TTL恢复为3600秒或更高。生产记录的TTL超过86400(24小时)很少有必要。

预先降低TTL这一步骤是大多数开发者会跳过但后来会后悔的。如果你将A记录TTL设置为3600然后立即更改IP地址,一些解析器可能会在长达一小时的时间内提供旧IP。先降低TTL,等待当前高TTL缓存过期,然后再进行变更。

DNS调试工具

dig是主要的DNS调试工具,每个接触基础设施的开发者都应该了解其基本用法。dig example.com A返回A记录。dig example.com MX返回MX记录。+short标志会去除冗长的输出。@语法允许你查询特定的名称服务器:dig @8.8.8.8 example.com A直接查询Google的解析器,绕过本地解析器。dig @ns1.example.com example.com A直接查询你的权威名称服务器——在变更传播前验证变更是否在源头生效很有用。

nslookup是较老的工具,默认包含在Windows中,适用于快速检查。nslookup -type=MX example.com返回MX记录。它的输出格式不如dig结构化,但在dig不可用的环境中仍然可用。

dog是用Rust编写的现代dig替代品,具有彩色输出和更清晰的格式化。在macOS上通过Homebrew安装(brew install dog)。其查询语法略有不同:dog example.com MX @8.8.8.8。对于经常使用终端的开发者来说,dog能显著加快解析DNS响应的速度。

dnschecker.org对于传播验证是必不可少的。它可以同时显示来自20多个地理位置的名称服务器的响应,这是验证更改是否已全球传播的正确方法——而不是从你自己的机器上测试,因为你的机器会积极缓存,只反映你解析器的视图。

常见DNS问题及如何诊断

“我的网站在某些网络上可用,但在其他网络上不可用”

这是典型的传播症状,它会让不理解解析器独立缓存的开发者感到困惑。正确的调试流程:首先,直接查询你的权威名称服务器(dig @ns1.yourprovider.com yourdomain.com A)以确认记录在源端是正确的。如果是这样,问题在于受影响网络的解析器上的陈旧缓存。使用dnschecker.org来确定哪些地区仍在查看旧记录。唯一的解决方法是等待这些解析器的缓存TTL过期——没有机制可以强制外部解析器为你的域名刷新缓存。如果你在更改前设置的TTL很高(3600+),你可能需要等待长达一小时。这就是为什么在迁移前预先降低TTL的经验教训。

“我的SSL证书无法签发”

来自Let’s Encrypt或其他CA的域名验证失败经常是伪装成证书问题的DNS问题。Let’s Encrypt使用自己的解析器执行域名验证,这些解析器与你的不同。两个常见原因:ACME DNS挑战的TXT记录尚未传播到Let’s Encrypt使用的解析器(使用公共解析器查询dig @8.8.8.8 _acme-challenge.yourdomain.com TXT检查);或者CAA记录阻止了你尝试使用的CA。运行dig yourdomain.com CAA并验证签发CA是否被列出,或者确认不存在CAA记录。当使用Cloudflare的代理时,还有一个额外的复杂情况:如果你使用HTTP-01挑战类型,Cloudflare的代理必须能够将挑战请求转发到你的源服务器。如果你的源服务器在80端口上没有响应,验证将失败。

“我的邮件被发送到垃圾邮件”

邮件投递失败几乎总是由缺失或错误配置的 SPF、DKIM 或 DMARC 记录引起的。诊断方法是有条理的。首先执行 dig yourdomain.com TXT 并查找以 v=spf1 开头的 SPF 记录。然后验证每个代表您发送邮件的服务(事务性邮件提供商、CRM、营销平台)都包含在您的 SPF 记录中—一个常见的失败是添加新的邮件服务而不更新 SPF。DKIM 需要检查您提供商指定的选择器记录是否存在:dig selector._domainkey.yourdomain.com TXT。最后,使用 dig _dmarc.yourdomain.com TXT 检查您的 DMARC 策略。p=none 且启用 rua 报告是最安全起点—它告诉接收方在您诊断对齐失败时收集数据而不拒绝邮件。

DNS 和安全:开发者不能忽视的内容

DNSSEC

DNSSEC 为 DNS 记录添加加密签名,允许解析器验证响应在传输过程中未被篡改。如果签名验证失败,解析器将返回错误而不是提供可能被污染的数据。DNSSEC 可以防止 DNS 缓存投毒攻击,即使输入正确地址,攻击者也能将用户重定向到恶意服务器。DNSSEC 的操作复杂性(管理签名密钥、处理密钥轮换)意味着在企业环境之外部署不足,但对于高价值域名,值得实施。Cloudflare 和 Route 53 都提供一键式 DNSSEC 管理,可自动处理密钥轮换。

作为安全控制的 CAA 记录

除了指定允许的 CA 的基本功能外,CAA 记录还支持 issuewild 标签(对通配符证书颁发进行单独控制)和用于违规报告的 iodef 标签。使用 Let’s Encrypt 的域的完整 CAA 设置可能如下所示:

example.com CAA 0 issue "letsencrypt.org"
example.com CAA 0 issuewild ";"
example.com CAA 0 iodef "mailto:security@example.com"

issuewild ";" 条目明确禁止任何 CA 颁发通配符证书,关闭了一个重要的攻击面。iodef 条目要求 CA 在收到不合规的颁发请求时向您的安全地址发送报告—对于检测子域名接管尝试和未经授权的证书请求很有用。

DNS over HTTPS 和 DNS over TLS

标准的 DNS 查询是未加密的,这意味着您的 ISP、网络运营商或任何能够访问您流量的人都可以观察您的设备解析的每个主机名。DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 会加密此流量。Cloudflare 的 1.1.1.1 同时支持这两种协议。对于构建面向用户的应用程序的开发者来说,这主要是一个用户隐私考虑因素,而不是应用程序安全要求——您的应用程序的 DNS 解析发生在服务器端,网络环境是可控的。对于个人设备和企业环境,加密 DNS 具有重要价值。Firefox 默认使用 Cloudflare 的解析器启用 DoH。

DNS 提供商:诚实对比

Cloudflare DNS 是大多数用例的默认推荐。免费套餐功能齐全,名称服务器响应时间在全球最快之列(大多数地区中位数低于 10ms),用户界面在同类产品中最易用。集成的安全功能——DDoS 保护、Bot 管理、Workers——为开发者创造了有吸引力的技术栈。权衡之处在于锁定:Cloudflare 特有的功能如 Workers 和 Page Rules 无法完美导出。

AWS Route 53 是当您的基础设施已在 AWS 中且可编程性很重要时的正确选择。Route 53 的 API 全面,与其他 AWS 服务(EC2、ELB、CloudFront)的集成无缝,并且支持基于健康检查的路由,这是 Cloudflare 免费套餐所不具备的。基于延迟和地理位置的路由策略对全球应用真正有用。定价(每个托管区域每月 0.50 美元,每百万次查询 0.40 美元)对于生产应用来说是合理的,但如果您管理许多区域,成本会累积。

Google Cloud DNS 是 GCP 原生基础设施的自然选择。其 API 简洁,全球广播覆盖出色,定价与 Route 53 相当。它缺乏 Route 53 的一些路由策略的复杂性,但覆盖了绝大多数用例。

Namecheap 的内置 DNS 对于个人项目和简单设置足够用,但缺乏专用 DNS 提供商的 API 完整性和全球基础设施。如果您管理的不只是一小部分个人域名,迁移到上述之一是值得的。

Cloudflare 代理决策

Cloudflare 的橙色云(代理)与灰色云(仅 DNS)是 Cloudflare 后站点的最重要的 DNS 决策之一,而且并不总是清楚应该选择哪一个。当记录被代理(橙色云)时,流量会通过 Cloudflare 的网络——您的源 IP 被隐藏,DDoS 保护处于活动状态,并且 Cloudflare 的 CDN、SSL 终止和防火墙规则适用。当仅使用 DNS(灰色云)时,Cloudflare 提供指向您源的 A 记录,流量完全绕过 Cloudflare 的网络。

代理使用场景:当您需要DDoS保护、隐藏源IP、使用Cloudflare Workers,或希望Cloudflare CDN缓存您的静态资源时。不要代理的情况:当您使用HTTP/HTTPS/WebSockets以外的协议(Cloudflare代理仅支持这些协议)、指向另一个Cloudflare管理的资源(可能导致循环问题)、记录为MX记录(邮件流量不应被代理),或者需要CAA记录来验证您的源证书链时。常见错误模式:开发者通过Cloudflare代理其根域名但保留MX和DKIM记录不被代理——这是正确的——然后忘记_acme-challenge记录(用于证书续期)不会通过代理路由,需要设置为仅DNS或通过Cloudflare自己的证书管理来处理。

DNS记录类型参考

记录类型 映射到 常见用途 关键错误
A IPv4地址 Web服务器、子域名 假设多个A记录等于带健康检查的负载均衡
AAAA IPv6地址 支持IPv6的主机 设置AAAA记录前未验证源端的IPv6连接性
CNAME 另一个主机名 别名、CDN指针 在区域顶点使用CNAME;将MX记录指向CNAME
MX 邮件服务器主机名 邮件路由 将MX记录指向IP或CNAME而不是A记录
TXT 任意文本 SPF、DKIM、验证 多个SPF TXT记录;添加DKIM未更新DMARC对齐
NS 名称服务器主机名 区域委派 在区域顶点更改NS记录未更新注册商信息
CAA CA授权 证书签发控制 当Cloudflare与您的CA一起签发证书时未包含Cloudflare

将DNS能力建设作为持续实践

将DNS视为一次性配置任务的开发者与将其视为能够理解和调试的系统的开发者之间的差距,主要是缺乏有意识的实践。缩小差距的最快方法是停止仅使用GUI控制面板,而是对任何DNS问题都使用dig命令,即使GUI界面已有答案。阅读原始DNS响应能够建立对记录结构、TTL过期和解析链的直觉,这种效果是点击仪表盘无法实现的。

当生产环境中出现故障且可能与 DNS 相关时,调试流程几乎总是这样的:直接查询权威名称服务器,与公共解析器的结果进行比较,检查相关记录上的 TTL 值,验证是否存在 CNAME-at-apex 或 MX-to-CNAME 违规,最后如果是 SSL 问题则检查 CAA 记录。对于已经理解底层模型的人来说,这个流程能在十五分钟内解决大多数与 DNS 相关的事件。

使这一切成为可能的实用开发者 DNS 理解并非深奥的知识——它是一套心智模型,这些模型建立在理解解析链、知道每种记录类型在协议层面的实际作用,以及足够多次使用 dig 以至于能自然解读其输出的基础上。一次性投入时间,回报将贯穿你整个职业生涯的每一次部署、迁移和事件。


Michael Sun 是一位软件基础设施工程师,十年间为从早期初创公司到企业部署的各种团队构建和修复分布式系统。他的工作重点在应用开发与生产基础设施交汇的操作层面。

By Michael Sun

Founder and Editor-in-Chief of NovVista. Software engineer with hands-on experience in cloud infrastructure, full-stack development, and DevOps. Writes about AI tools, developer workflows, server architecture, and the practical side of technology. Based in China.

Leave a Reply

Your email address will not be published. Required fields are marked *

You missed