1983年,Paul Mockapetris在RFC 882和883中定义了Domain Name System(DNS)。这个协议的核心目标简单明确:将人类可读的域名映射为机器可读的IP地址。在那个只有几百台联网主机的ARPANET时代,Mockapetris和他的同事们做了一个影响至今的设计决策——DNS查询和响应不需要任何形式的身份验证。
这个决策在1983年是合理的。当时的网络环境是一个"可信社区",所有参与者都是已知的研究机构。但四十年后,当每天有超过2万亿次DNS查询在全球互联网上执行时,这个"无验证"设计变成了一把悬在互联网头上的达摩克利斯之剑。
信任的代价:DNS协议的根本性缺陷
DNS协议的设计者并非没有考虑过安全问题。但在1980年代,“安全"的含义与今天完全不同。当时的主要威胁是配置错误和网络故障,而非恶意攻击。协议被设计为"尽可能简单”,每个DNS消息只包含三个关键信息:查询名称、查询类型和一个16位的交易ID(Transaction ID)。
这个16位ID是DNS协议中唯一的"安全机制"。当一个解析器发送查询时,它会随机选择一个0到65535之间的数字作为ID,并期望收到的响应携带相同的ID。理论上,攻击者如果不知道这个ID,就无法伪造有效的响应。
但16位只有65536种可能。更糟糕的是,早期DNS实现使用的是简单的递增计数器而非真随机数。这意味着攻击者只需要发送大量伪造的响应,就有很大概率猜中正确的ID——这就是DNS缓存投毒(Cache Poisoning)攻击的核心原理。
一个解析器的困境
当递归解析器(Recursive Resolver)代表客户端查询某个域名时,它会经历一个复杂的过程。以查询www.example.com为例:
- 解析器首先向13个根服务器之一查询
.com的权威服务器 - 根服务器返回
.com顶级域的NS记录和胶水记录 - 解析器向
.com权威服务器查询example.com的权威服务器 .com服务器返回example.com的NS记录- 解析器向
example.com权威服务器查询www.example.com的A记录 - 权威服务器返回最终答案
每一步都可能成为攻击的切入点。而且,这个过程中的"额外信息"——比如权威服务器在响应中附加的胶水记录——同样会被解析器信任并缓存。如果一个攻击者能在正确答案到达之前注入伪造的响应,解析器就会将错误信息缓存起来,影响所有后续查询该域名的用户。
Kaminsky攻击:一个协议缺陷的完美演绎
2008年,安全研究员Dan Kaminsky发现了一种方法,可以将这个理论风险转化为实际的灾难性攻击。他的创新之处不在于攻击的技术细节,而在于攻击的策略。
传统的缓存投毒攻击需要攻击者知道解析器何时会发起查询。但Kaminsky发现,攻击者可以主动触发查询:只需要让解析器查询一个不存在的子域名(如random123.example.com),解析器就会被迫向example.com的权威服务器发起查询。
在解析器等待权威服务器响应的时间窗口内,攻击者可以疯狂发送伪造的响应。每个伪造响应不仅包含对random123.example.com的回答,还包含额外的"权威"记录——将example.com的NS记录指向攻击者控制的服务器。
这就是Kaminsky攻击的精髓:不是投毒单个记录,而是劫持整个域名的权威性。一旦成功,攻击者就成为了该域名在受害者解析器眼中的"官方来源",可以返回任何他想返回的IP地址。
16位的数学困境
在Kaminsky攻击公开之前,大多数DNS服务器使用固定的源端口(通常是53)进行所有查询。这意味着攻击者只需要猜测16位的交易ID,大约65536种可能。
Kaminsky本人估计,在一个典型的网络环境下,攻击者可以在大约10秒内成功投毒一个域名。这对于一个精心准备的攻击来说绰绰有余。
作为紧急响应,DNS软件开发商实施了源端口随机化(Source Port Randomization)。解析器现在会为每个查询随机选择一个源端口(约16000个可选端口),将攻击者需要猜测的空间从16位扩展到约32位。这使攻击复杂度从65536次尝试增加到超过40亿次,理论上将攻击时间延长到不切实际的水平。
但"理论上"和"实际上"之间往往存在距离。
SAD DNS:当安全措施成为攻击面
2020年11月,加州大学河滨分校和清华大学的研究人员在ACM CCS会议上发表了一篇论文,展示了如何绕过源端口随机化保护。他们称之为SAD DNS(Side-channel AttackeD DNS)。
攻击的巧妙之处在于利用ICMP速率限制作为侧信道。现代操作系统为了防止ICMP洪水攻击,会对发出的ICMP错误消息进行速率限制——例如Linux默认限制为每秒50个。研究人员发现,这个速率限制可以用来"探测"哪些端口是开放的。
攻击流程如下:
- 攻击者发送大量UDP探测包到目标解析器的不同端口,伪造源地址为权威服务器的IP
- 如果探测的端口是关闭的,解析器会尝试发送ICMP"端口不可达"消息,但会因速率限制而丢弃部分消息
- 如果探测的端口恰好是解析器等待权威响应的开放端口,则不会有ICMP消息,速率限制计数器不会增加
- 攻击者通过发送自己的测试包并观察是否收到ICMP响应,来判断速率限制是否被触发
- 通过这种二分搜索方法,攻击者可以逐步缩小开放端口的范围
这种方法将32位的搜索空间重新压缩到可操作的范围内。虽然攻击仍然需要相当的资源和时间,但它证明了"隐藏端口号"这种安全措施本质上是"通过隐匿实现安全"(security through obscurity),在没有密码学验证的情况下永远不可能完全可靠。
Sea Turtle:当国家级攻击者盯上DNS
如果说Kaminsky攻击展示了协议缺陷的破坏力,那么2019年曝光的Sea Turtle攻击则展示了DNS漏洞在国家级攻击者手中的战略价值。
Cisco Talos的安全研究人员发现,一个疑似与伊朗有关联的威胁组织从2017年初开始,对中东和北非的政府机构、外交部门、能源组织发动了持续两年的DNS劫持行动。至少40个不同国家的组织受到影响。
Sea Turtle攻击的独特之处在于它的攻击路径:攻击者不是直接攻击目标组织,而是先入侵为这些组织提供服务的DNS注册商和互联网基础设施提供商。通过获得对这些关键中间人的控制,攻击者可以修改受害域名的DNS记录,将流量重定向到攻击者控制的服务器。

图片来源: 2.bp.blogspot.com
Sea Turtle攻击的DNS劫持方法论(图片来源:Cisco Talos)
攻击者甚至入侵了瑞典的NetNod——一个管理DNS根服务器(i.root-servers.net)的非营利组织。通过这个访问权限,他们能够劫持沙特阿拉伯国家域名(.sa)的DNS记录,潜在影响所有沙特域名。
证书"冒充"技术
Sea Turtle攻击者使用了一种称为"证书冒充"的技术来绕过SSL/TLS保护。当攻击者将域名重定向到自己的服务器时,他们会从Let’s Encrypt、Comodo等证书颁发机构获取该域名的合法证书。
这些证书是完全有效的——浏览器不会显示任何警告。攻击者只需要证明他们"控制"了该域名,而由于他们刚刚劫持了域名的DNS记录,这个验证过程变得轻而易举。
一旦用户被重定向到攻击者的服务器,他们的凭据就会被捕获,然后流量被透明地代理到真正的服务器。用户可能只会注意到轻微的延迟,而不会意识到他们的密码已经被窃取。
DNS放大攻击:安全机制本身成为武器
讽刺的是,DNSSEC——为解决DNS安全问题而设计的扩展——本身也可能被滥用为攻击武器。
DNS放大攻击(Amplification Attack)利用了UDP协议的无状态特性和DNS响应通常比查询大得多的事实。攻击者向开放DNS解析器发送小型查询(通常使用ANY类型请求所有记录),但将源IP伪造成受害者的IP。解析器会将大型响应发送给受害者,造成带宽淹没。
DNSSEC签名的域名会显著增加响应大小。一个典型的DNSSEC签名响应可能达到4000字节,而对应的查询只有几十字节。这意味着放大倍数可以达到100:1甚至更高。Cloudflare的研究人员指出:“讽刺的是,DNSSEC设计的目的是让DNS系统更安全,但巨大的密钥却使攻击更有效。”
DNSSEC:迟到的验证层
面对这些威胁,互联网工程任务组(IETF)在1997年开始开发DNS Security Extensions(DNSSEC),最终在2005年以RFC 4033-4035系列正式发布。
DNSSEC的核心思想是给DNS数据加上数字签名。但它不是加密DNS流量——用户仍然可以看到查询和响应的内容——而是提供数据来源认证和数据完整性保护。
四种关键记录类型
DNSSEC引入了四种新的DNS记录类型:
DNSKEY(DNS公钥):存储用于验证签名的公钥。每个DNSSEC-enabled区域至少有一个密钥对。实际上,通常使用两个密钥:Zone Signing Key(ZSK)用于签署区域内的常规记录,Key Signing Key(KSK)用于签署DNSKEY记录本身。这种分离允许频繁轮换ZSK而不需要与父区域协调。
RRSIG(资源记录签名):存储对RRset(一组相同类型和名称的记录)的数字签名。每个签名包含签名者的密钥标签、签名过期时间、使用的算法,以及实际的签名数据。当解析器请求A记录时,它会同时收到对应的RRSIG记录。
DS(委托签名者):建立父子区域之间的信任链。DS记录存储的是子区域KSK的哈希值,由父区域签名。例如,.com区域包含example.com的DS记录,该记录由.com的密钥签名。这种机制确保了信任可以从根区域一直延伸到叶子域名。
NSEC/NSEC3(下一个安全记录):提供"不存在证明"。当查询一个不存在的域名时,权威服务器返回NSEC记录,证明在字母顺序上该域名之前和之后都没有记录。NSEC3使用哈希来防止"区域遍历"攻击,即攻击者通过枚举所有不存在查询来重建整个区域的内容。
信任链的构建
DNSSEC的信任模型是一个从根到叶的层级结构:

图片来源: jpmens.net
DNSSEC信任链示意图(图片来源:Jan-Piet Mens)
-
信任锚点(Trust Anchor):根区域的KSK公钥被预装在所有DNSSEC验证解析器中。这个密钥通过ICANN的根密钥签名仪式(Root Key Signing Ceremony)生成和管理。
-
根区域签署:根区域的ZSK由KSK签名,而KSK的公钥就是信任锚点。
-
顶级域签署:根区域包含每个TLD(如
.com、.net)的DS记录,指向该TLD的KSK。验证解析器可以通过根区域的签名验证这些DS记录,然后用它们来验证TLD的DNSKEY。 -
二级域名签署:TLD包含每个注册域名的DS记录,延续信任链。
当验证解析器查询www.example.com时,它会从根开始,逐级验证每个签名,直到最终验证example.com返回的A记录签名。如果任何一级验证失败,整个响应都会被标记为不可信。
根密钥签名仪式:互联网的"核按钮"
DNSSEC信任链的顶端是根区域的KSK。这个密钥的私有部分存储在两个安全设施中:一个在美国加利福尼亚州洛杉矶,另一个在弗吉尼亚州库尔佩珀。每个设施都有专门的"仪式室"(Ceremony Room),配备硬件安全模块(HSM)来存储密钥。
每季度,来自世界各地的约50名"可信社区代表"(Trusted Community Representatives)会参与密钥签名仪式。这些人分为三组,每组七人,持有不同的物理密钥或智能卡。要访问HSM并使用根KSK签署新的根区域ZSK,需要多个不同组别的代表同时在场。
整个仪式持续3到8小时,每一步都严格按照脚本执行,全程录像并直播。独立的审计员监督整个过程,确保没有任何密钥被非法复制或使用。
这个复杂的仪式确保了即使单个参与者被收买或设施被入侵,攻击者也无法获得完整的密钥。这可能是互联网上最接近"七个人控制互联网"这种说法的现实存在——尽管实际机制要复杂得多,需要至少十几个人同时在场才能操作。
DNSSEC部署困境:为什么安全机制难以普及
尽管DNSSEC在技术上是解决DNS安全问题的正确方案,但其部署率却低得惊人。根据2024年的统计数据,全球只有约5-6%的域名启用了DNSSEC签名,而.com顶级域的签名率仅为5%左右。

DNSSEC验证率和ccTLD注册表部署情况(图片来源:Internet Society)
复杂性障碍
DNSSEC的复杂性是其部署率低的主要原因之一。与简单地将A记录指向一个IP地址不同,启用DNSSEC需要:
- 生成密钥对(ZSK和KSK)
- 配置权威服务器签署区域
- 将DS记录提交给注册商
- 建立自动化流程处理密钥轮换和重新签名
- 确保所有权威服务器同步
这个过程涉及多个参与方——域名注册人、DNS服务提供商、域名注册商——任何一个环节出错都可能导致域名无法解析。
失败的代价:DNSSEC配置错误的灾难
DNSSEC的一个特点是"失败即拒绝"。如果验证失败,解析器不会返回"不确定"的结果,而是直接返回SERVFAIL错误。这意味着用户根本无法访问该域名——不是被重定向到错误地址,而是完全无法连接。
Ianix维护了一份DNSSEC故障列表,记录了自2009年以来数百起影响重大的DNSSEC故障:
- 2010年,瑞典(.se)域名因DNSSEC配置问题大规模不可访问
- 2012年,美国政府域名(.gov)因DNSSEC验证失败而中断
- 2018年,比利时(.be、.vlaanderen、.brussels)影响1410个域名的DNSSEC故障
- 2023年,澳大利亚(.au)域名因DNSSEC问题出现服务中断
值得注意的是,列表中DNSSEC故障的中位持续时间是8天。更极端的案例包括某些美国政府域名的DNSSEC故障持续超过1000天(被称为"kiloday"级故障)。
这种高风险使得许多组织对启用DNSSEC持谨慎态度。对于大多数网站来说,DNSSEC提供的额外安全性难以量化,但配置错误导致的停机风险却是真实且可能致命的。
技术债务
DNSSEC的设计始于1990年代,当时的一些假设在今天已经过时:
预签名要求:早期设计认为服务器不够安全,无法存储私钥,因此要求所有记录预先签名。这导致了NSEC/NSEC3机制的复杂性,并阻止了动态签名带来的灵活性。
双密钥层级:KSK/ZSK分离的设计是为了减少与父区域的交互,但这也增加了管理复杂性。随着自动化程度提高,许多运营商现在使用单一密钥(CSK)。
响应大小问题:DNSSEC签名显著增加DNS响应大小。虽然EDNS0扩展允许更大的UDP数据包,但大型响应可能触发IP分片或强制TCP回退,两种情况都可能被中间设备阻止或导致性能问题。
使用RSA-2048密钥的DNSKEY记录约1755字节,加上签名,一个简单的DNS查询响应可能超过4000字节。这比传统DNS的512字节限制大了近8倍,在网络条件不佳时可能导致解析失败。
经济激励错位
DNSSEC的收益和成本分布不均。域名所有者承担了部署和维护DNSSEC的全部成本,包括技术复杂性和故障风险。但安全收益——防止缓存投毒和中间人攻击——主要惠及访问这些域名的用户。
更复杂的是,DNSSEC的收益在应用层几乎是不可见的。当用户访问一个DNSSEC签名的域名时,浏览器不会显示任何安全指示器。即使DNSSEC验证成功阻止了一个中间人攻击,用户也不知道自己刚刚被保护了。
相比之下,HTTPS会在浏览器地址栏显示锁图标,SSL证书错误会显示明确的警告页面。这种可见性为网站所有者提供了启用HTTPS的明确激励,但DNSSEC缺乏类似的反馈机制。
现代DNS安全:多条防线并行
DNSSEC并非DNS安全的唯一解决方案。近年来,几种互补的技术得到了广泛部署:
DNS over TLS (DoT) 和 DNS over HTTPS (DoH)
RFC 7858定义的DoT和RFC 8484定义的DoH为DNS查询提供了传输层加密。DoT使用专用端口853,DoH则复用HTTPS的443端口。
这些技术解决了DNS查询的机密性问题——防止网络上的窃听者看到用户查询了哪些域名。但它们并不验证DNS响应的真实性。攻击者如果控制了用户使用的解析器,仍然可以返回伪造的响应。
DoT/DoH和DNSSEC解决的是不同的问题:前者保护查询在传输过程中不被窃听或篡改,后者验证响应数据本身的真实性。两者是互补的,而非替代关系。
DNS Cookies
RFC 7873定义的DNS Cookies是一种轻量级的事务安全机制。客户端和服务器交换类似HTTP Cookie的令牌,用于验证后续请求的合法性。
与DNSSEC不同,DNS Cookies不验证DNS数据的真实性,而是验证请求/响应对的关联性。这可以有效防止源IP欺骗攻击(如放大攻击),但无法防止恶意权威服务器返回伪造数据。
RPKI和BGP安全
DNS不是唯一被设计为"可信"的互联网基础设施。BGP——互联网的路由协议——同样缺乏内置的验证机制。攻击者可以"劫持"IP前缀,将流量重定向到自己的网络。
资源公钥基础设施(RPKI)为BGP路由通告提供了验证机制。与DNSSEC类似,它使用加密签名来验证路由声明的合法性。虽然RPKI不直接保护DNS,但它可以防止攻击者通过路由劫持来拦截DNS流量。
为什么DNSSEC依然重要
尽管部署困难重重,DNSSEC仍然是解决DNS信任问题的根本方案。其他安全措施——如源端口随机化、DNS Cookies、DoT/DoH——都是在此基础上的补充防御。
DNSSEC提供了其他技术无法替代的能力:
数据来源认证:验证DNS记录确实来自域名的授权所有者,而非某个中间人。
数据完整性保护:确保记录在传输过程中未被篡改。
不存在证明:权威地证明某个域名不存在,防止攻击者伪造不存在的记录。
支持高级应用:DNSSEC为DANE(基于DNS的命名实体认证)提供基础设施,允许域名所有者在DNS中发布TLS证书指纹、SSH公钥、PGP密钥等,无需依赖传统证书颁发机构。
未来的方向
DNSSEC的未来可能在于简化和自动化。几个发展方向值得关注:
单一密钥简化:越来越多的运营商放弃KSK/ZSK分离,使用单一密钥,减少管理复杂性。
CDS/CDNSKEY自动化:RFC 8078定义的机制允许子区域自动向父区域发布DS记录更新,无需人工干预。这消除了DNSSEC密钥轮换中最容易出错的环节。
现代加密算法:从RSA转向ECDSA(椭圆曲线)和Ed25519,可以显著减小密钥和签名大小,降低响应膨胀问题。ECDSA P-256的密钥只有256位,而等效安全强度的RSA需要3072位。
DELEG记录类型:正在开发的新DNS记录类型可能彻底改变区域委托方式,将DNSSEC集成到委托机制本身,并支持加密传输(DoT/DoH)的自动发现。
结语
DNS协议的"无验证"设计是早期互联网信任文化的产物。在那个时代,网络上的每个节点都是已知的研究机构,安全意味着确保消息能够正确传递,而非防止恶意行为。
但这种信任假设在今天的互联网上已经不再成立。当攻击者可以利用DNS协议的缺陷窃取国家机密、劫持银行网站、发动大规模DDoS攻击时,“信任"本身成为了最大的安全漏洞。
DNSSEC不是完美的解决方案。它的复杂性、部署难度和故障风险是真实存在的问题。但在一个攻击者越来越复杂的世界里,密码学验证——尽管复杂——仍然是确保DNS可信的唯一根本方法。
正如安全研究员Thomas Ptacek那句著名的评论所言:“你可以在Pastebin上发布DNSSEC根RSA私钥,互联网上重要的一切都不会崩溃。“这既是批评(因为DNSSEC部署太少,泄露私钥影响有限),也是对现状的无奈——当我们终于有了验证DNS的工具,却选择了不用。
直到DNSSEC成为一种默认而非例外,DNS协议四十年前的设计缺陷将继续困扰互联网的每一天。
参考资料
- Mockapetris, P. (1983). Domain Names - Concepts and Facilities. RFC 882.
- Kaminsky, D. (2008). Kaminsky DNS Vulnerability. Black Hat USA.
- Adamitis, D. et al. (2019). Sea Turtle: A Persistent Cyber Espionage Threat. Cisco Talos.
- Houser, R. et al. (2020). SAD DNS: Side-Channel AttackeD DNS. ACM CCS 2020.
- Arends, R. et al. (2005). DNS Security Introduction and Requirements. RFC 4033.
- Huston, G. (2024). Where Did DNSSEC Go Wrong? Internet Society Pulse.
- SIDN Labs. (2025). None of the Biggest Internet Services Are DNSSEC-Enabled.
- Whisper Security. (2025). State of DNSSEC 2025.
- ICANN. (2023). The Key to the Internet and Key Ceremonies: An Explainer.
- Cloudflare. (2020). SAD DNS Explained.
- Mandiant. (2019). Global DNS Hijacking Campaign: DNS Record Manipulation at Scale.
- Ianix. (2025). Major DNSSEC Outages and Validation Failures.