DNS 的先天弱点
DNS 设计于互联网早期(1980 年代),当时假定网络上的参与者都是善意的。因此:
- 查询和响应是明文的(UDP,无加密);
- 没有完整性校验:无法验证响应是否被篡改;
- 没有来源验证:客户端无法确认响应确实来自权威服务器。
常见攻击
DNS 劫持
攻击者控制或冒充 DNS 服务器,返回错误的 IP,把用户引导到恶意网站。
手段:
- 入侵 DNS 服务器;
- 篡改用户的 DNS 配置(如恶意软件修改路由器或本机的 DNS 设置);
- 中间人攻击(在局域网内伪造 DNS 响应)。
危害:用户以为访问的是银行网站,实际访问的是钓鱼站点——浏览器地址栏显示的域名仍然"正确",只是解析到了错误的 IP。
DNS 缓存投毒(Cache Poisoning)
攻击者向递归解析器发送伪造的响应,抢在真正的权威服务器响应之前到达,让解析器缓存错误记录。
由于 DNS 使用 UDP 且早期的事务 ID 和源端口可预测,攻击者有可能猜中并伪造响应。
改进:随机化事务 ID 和源端口(源端口随机化),大幅增加了猜测难度。但这只是缓解,不是根治。
DNS 放大攻击(DDoS)
利用 DNS 响应包远大于请求包的特点:
- 攻击者伪造源 IP(设为受害者 IP)向开放递归解析器发送小查询;
- 解析器向受害者返回大得多的响应;
- 大量这样的请求形成流量放大,压垮受害者。
放大倍数可达数十倍(尤其是利用 DNSSEC 记录或 ANY 查询时)。
防范:关闭开放递归(解析器只服务于自己的用户)、响应速率限制(RRL)。
DNSSEC
目标:通过数字签名,保证 DNS 数据的完整性和来源真实性(注意:不提供机密性,DNS 响应仍是明文)。
原理:
- DNS 区域的管理者用自己的私钥对资源记录签名;
- 父区域用 DS(Delegation Signer)记录证明子区域公钥的合法性;
- 这样从根开始,逐级建立信任链。
验证过程:递归解析器从根开始,逐级验证签名,直到目标记录。
RRSIG:资源记录的签名。
DNSKEY:公钥。
DS:父区域对子区域 DNSKEY 的哈希,用于建立信任链。
NSEC/NSEC3:用于证明"某个域名确实不存在"(防止攻击者伪造"不存在"的响应)。
状态:根区和许多顶级域已部署 DNSSEC,但在递归解析器一侧的验证启用率仍不够高(如果解析器不验证,签名就白做了)。
加密传输:DoH 与 DoT
DNSSEC 解决"数据是否被篡改",但不解决"谁在窥探你的查询"。
DoT(DNS over TLS):在 TCP 853 端口上用 TLS 加密 DNS 查询。
DoH(DNS over HTTPS):把 DNS 查询封装在 HTTPS 中(443 端口)。
优势:防止中间人窥探和篡改本地网络中的 DNS 流量。
争议:
- 集中化问题:如果把所有查询都交给少数几家公共 DNS 服务商(如浏览器默认启用的 DoH),会形成新的集中点;
- 企业网络的可见性:企业 IT 部门通常依赖 DNS 做安全策略(如拦截恶意域名)。DoH 会绕过这些控制;
- 它加密的是"到你配置的那台 DNS 服务器"这一段,那台服务器仍然能看到你的查询(所以选择可信的服务商很重要)。
实用建议
- 使用可信的 DNS 服务商(运营商、或知名的公共 DNS);
- 检查路由器的 DNS 设置是否被篡改(这是家庭网络中常见的问题);
- 重要网站注意证书警告——如果 HTTPS 证书报错,即使域名看起来正确也要警惕;
- 企业环境中,明确 DNS 策略,避免 DoH 绕过安全控制。
说明:本文为网络安全的公开知识整理。