0Pricing
Security+ Academy · 课时

安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)

学习 DNSSEC 如何防止 DNS 缓存投毒,以及基于 HTTPS 和基于 TLS 的 DNS 如何保护查询隐私,抵御链路上的观察者。

安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH) 是 CoddyKit 上的免费 Security+ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Security+ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Security+ Academy 课程共包含 4 节课。

DNS 安全挑战

域名系统(DNS)将人类可读的域名转换为 IP 地址。DNS 设计于 20 世纪 80 年代,当时构建时并未考虑安全性——查询和响应通过 UDP/TCP 53 端口以明文传输,且没有身份验证。这会造成两项主要漏洞:DNS 缓存投毒(注入伪造的 DNS 响应,将用户重定向到恶意服务器)和 DNS 窃听(观察用户查询了哪些域名,从而了解其浏览活动)。有两项标准可以应对这些问题:DNSSEC 可防止伪造,基于 HTTPS 的 DNS(DoH) 可防止窃听。

DNS 缓存投毒

DNS 缓存投毒(Kaminsky 攻击)利用了 DNS 协议缺乏身份验证这一弱点。Resolver 向权威 DNS 服务器发送查询,并将响应缓存 TTL 时长。能够猜出事务 ID(16 位且可预测)和源端口(根据 RFC 5452 用作额外熵)的攻击者,可以发送伪造响应并让 Resolver 将其缓存,从而将查询该 Resolver 的所有用户重定向到攻击者的服务器。缓存一旦被投毒,即使用户输入了正确的域名,也会被定向到伪造的服务器。DNSSEC 通过对 DNS 响应进行数字签名来防止这种攻击。

# DNS cache poisoning simulation
# Attacker floods resolver with forged responses
# for the query 'A example.com?'

# Each response guesses a different transaction ID:
# ID=1234: example.com -> 198.51.100.1  (attacker IP)
# ID=1235: example.com -> 198.51.100.1
# ...
# ID=XXXX: example.com -> 198.51.100.1  (correct guess!)

# Resolver caches poisoned answer (TTL = 3600s)
# All users querying this resolver get attacker IP
# Users are redirected to phishing/malware server

DNSSEC:DNS 安全扩展

DNSSEC 为 DNS 记录添加加密签名,使 Resolver 能够验证响应确实来自合法的区域授权机构且未被篡改。DNSSEC 引入了新的记录类型:RRSIG(资源记录签名,即对记录集进行的实际签名)、DNSKEY(用于验证签名的公钥)、DS(委派签名者,用于链接父区域和子区域的密钥),以及 NSEC/NSEC3(经身份验证的不存在证明,即证明某个名称不存在)。DNSSEC 从根区域(由 ICANN 签名)开始,向下贯穿 TLD 和权威区域,形成一条信任链。

# Verify DNSSEC signature on a domain
dig +dnssec example.com A
# Look for 'ad' (authenticated data) flag in response
# and the RRSIG record alongside the A record

# Query for DNSKEY record
dig DNSKEY example.com

# Query for DS record at parent zone
dig DS example.com @a.iana-servers.net

# Full DNSSEC chain validation check
dig +sigchase +trusted-key=/.../root.key example.com A

DNSSEC 密钥类型:KSK 和 ZSK

DNSSEC 使用两种签名密钥。区域签名密钥(ZSK)用于签署各个 DNS 记录集(RRSIG),并且会频繁轮换(每月或每季度一次),以提高运维灵活性。密钥签名密钥(KSK)用于签署 DNSKEY 记录集,为该区域提供信任锚。KSK 的轮换频率较低(每年一次),因为每次 KSK 发生变化时,都必须使用新的 DS 记录更新父区域,这一过程需要进行协调。KSK 验证 ZSK;ZSK 签署数据。这种双层结构在安全性(频繁轮换 ZSK)与运维负担(不频繁轮换 KSK)之间实现了平衡。

DNSSEC 的局限性

DNSSEC 存在一些重要局限。它不会加密 DNS 查询——它只对响应进行签名以保证完整性。窃听者仍然可以看到所有 DNS 查询,只是无法伪造响应。区域枚举:NSEC 记录(用于证明不存在)允许攻击者遍历区域并枚举其中的所有域名;NSEC3 使用哈希名称来缓解这一问题,但并不完美。运维复杂性:密钥管理、签名到期和父区域协调会带来显著的运维负担。DNSSEC 的采用情况仍不完整——许多 TLD 和注册商支持 DNSSEC,但许多组织尚未部署。

基于 HTTPS 的 DNS(DoH)

基于 HTTPS 的 DNS(DoH)会在 HTTPS(RFC 8484)中加密 DNS 查询,使网络观察者无法查看查询内容。查询会发送到支持 DoH 的解析器所提供的标准 HTTPS URL,因此 DNS 流量与其他 HTTPS 流量无法区分。这样可以防止 ISP、雇主和链路上的攻击者查看用户查询了哪些域名,从而弥补 DNSSEC 留下的隐私缺口。不过,DoH 会将信任对象从网络的 DNS 解析器转移到 DoH 提供商(通常是 Google 8.8.8.8、Cloudflare 1.1.1.1 或组织自有的 DoH 解析器)。目前,大多数主流浏览器都已原生支持 DoH。

# DoH query using curl
curl -H 'accept: application/dns-json' \
  'https://cloudflare-dns.com/dns-query?name=example.com&type=A'

# DoH query via RFC 8484 (binary format)
curl -s -H 'Content-Type: application/dns-message' \
     -H 'Accept: application/dns-message' \
     --data-binary @query.bin \
     https://dns.google/dns-query

# Configure Firefox to use DoH
# about:config -> network.trr.uri
# Set to: https://mozilla.cloudflare-dns.com/dns-query

基于 TLS 的 DNS(DoT)

基于 TLS 的 DNS(DoT)(RFC 7858)通过 TLS 在专用 TCP 端口 853 上加密 DNS 查询,而不是通过 HTTPS 建立隧道。DoT 提供与 DoH 相同的隐私优势——隐藏查询内容,防止被窃听——但网络管理员更容易识别和过滤它(端口 853,而不是端口 443)。这是一把双刃剑:DoT 的流量特征明显,企业防火墙可以将其阻断;而 DoH 更难在不影响常规 HTTPS 流量的情况下被阻断。存根解析器(操作系统级)更常使用 DoT,而浏览器更常使用 DoH。

# Test DoT connection using kdig
kdig -d @9.9.9.9 +tls-ca example.com A

# Test DoT using openssl
openssl s_client -connect 1.1.1.1:853
# Then type: query string in DNS wire format

# Configure systemd-resolved to use DoT (Linux)
# /etc/systemd/resolved.conf:
[Resolve]
DNS=9.9.9.9#dns.quad9.net
DNSOverTLS=yes

DoH 和 DoT:企业注意事项

加密 DNS 为依赖基于 DNS 的过滤和黑洞机制的企业环境带来了挑战。当浏览器使用外部 DoH 解析器时,内部 DNS 控制就会被绕过。企业可以采取以下应对措施:部署内部 DoH/DoT 解析器(Cisco Umbrella、支持 DoH 的 Pi-hole),并将所有设备配置为使用该解析器;在防火墙上通过端口 443 阻止外部 DoH 解析器的 IP 地址(Google 8.8.8.8、Cloudflare 1.1.1.1);使用Group Policy在受管终端上禁用浏览器级 DoH;以及配置透明代理规则,拦截端口 853 上的基于 TLS 的 DNS 流量。目标是让所有 DNS 流量都经过受控解析器,同时不完全阻止加密 DNS。

# Enterprise DoH bypass prevention
# Windows Group Policy:
# Computer Config > Admin Templates > Google Chrome
# 'DNS over HTTPS mode': Disabled
# 'DNS over HTTPS URI templates': <empty>

# Firewall: block known public DoH resolvers
iptables -I FORWARD -d 8.8.8.8 -p tcp --dport 443 -j DROP
iptables -I FORWARD -d 1.1.1.1 -p tcp --dport 443 -j DROP
iptables -I FORWARD -d 9.9.9.9 -p tcp --dport 443 -j DROP
iptables -I FORWARD -d 149.112.112.112 -p tcp --dport 443 -j DROP

# Redirect all DNS to corporate resolver
iptables -t nat -A PREROUTING -p udp --dport 53 \
  -j DNAT --to-destination 10.0.0.53:53

DNS 安全实践

完整的 DNS 安全策略需要结合多种控制措施。使用DNSSEC保护权威区域,通过 KSK/ZSK 密钥对为 DNS 记录添加签名,防止域缓存中毒。使用基于 DNS 的过滤(Cisco Umbrella、Cloudflare Gateway)在解析器层面阻止恶意域名。使用DoH/DoT 连接到受控解析器,既能保护查询隐私,又不会失去过滤可见性。将DNS 日志记录发送到 SIEM,可记录所有查询,用于威胁搜寻——DNS 日志能够揭示 C2 流量、通过 DNS 隧道进行的数据外泄,以及恶意软件产生的域名生成算法(DGA)活动。DNS 遥测是目前可获得的最高价值安全数据源之一。

DNS 隧道检测

DNS 隧道将数据编码到 DNS 查询和响应中,以便外泄数据,或在其他出站流量被阻止的网络中建立 C2 通道。iodine、DNScat 和 dnscat2 等工具会将有效载荷编码到子域标签中(查询 EXFILTRATEDDATA.evil.com),或编码到 TXT 记录中。检测方法包括:DNS 查询名称异常过长(超过 100 个字符)、单个主机产生的查询量很高、查询不存在的父域名、使用异常的记录类型(TXT、NULL),以及对域名标签进行熵分析(编码数据具有较高的 Shannon 熵)。DNS 安全分析平台可以自动标记隧道模式。

# DNS tunneling detection indicators
# Flag queries with:
# 1. Query name > 100 characters
# 2. More than 50 queries/minute from single host
# 3. High-entropy domain labels (base64/hex patterns)
# 4. TXT or NULL record type queries (unusual)
# 5. Queries to domains with no web presence

# Example tunnel query (encoded payload)
# aGVsbG8gd29ybGQ.vGhpcyBpcyBkYXRh.evil-domain.com
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Base64 encoded 'hello world this is data'

DNS 响应策略区域(RPZ)

DNS 响应策略区域(RPZ)允许 DNS 解析器对 DNS 响应应用本地覆盖策略——本质上是在解析器层面创建本地黑洞,而无需修改全局 DNS 基础设施。当客户端查询已知的恶意域名时,RPZ 策略会返回 NXDOMAIN、将请求重定向到黑洞 IP,或返回直通响应。RPZ 源可以从威胁情报提供商(Spamhaus、SURBL)处获取,也可以直接导入 BIND 或 Unbound 解析器。RPZ 是一种强大的防御工具,因为它可以在 DNS 层面为网络中的所有设备应用过滤,无需在客户端进行任何配置。

# BIND RPZ configuration snippet
# /etc/named.conf
response-policy {
  zone 'rpz.spamhaus.net';
  zone 'local-blocklist.internal';
};

# RPZ zone file (local-blocklist.internal)
$ORIGIN local-blocklist.internal.
@  SOA  ns1.company.com. admin.company.com. 2024010101 3600 600 86400 300
botnet-c2.evil IN CNAME .   # NXDOMAIN response
phishing-site.com IN A 10.0.0.99  # Redirect to sinkhole

快速检查

Test 您对本课 CompTIA Security+(SY0-701)概念的理解。

课程回顾

本课介绍了:DNSSEC使用 KSK/ZSK 密钥对为 DNS 记录添加加密签名,以防止缓存中毒,但不会加密查询;基于 HTTPS 的 DNS(DoH)在 HTTPS 中加密 DNS 查询,以防止窃听,但会带来绕过企业过滤的风险;以及DNS 隧道将数据编码到 DNS 查询中,并可通过查询长度、查询量和熵分析来检测。接下来我们将学习 IPsec、VPN 协议和远程访问安全。

常见问题解答

「安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)」课时是免费的吗?

是的 — 「安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Security+ Academy 课程的其余内容,请升级到 CoddyKit PRO。 Security+ Academy 课程共包含 4 节课。

「安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)」这节课中我会学到什么?

学习 DNSSEC 如何防止 DNS 缓存投毒,以及基于 HTTPS 和基于 TLS 的 DNS 如何保护查询隐私,抵御链路上的观察者。 你通过在浏览器中直接运行的动手代码来练习 Security+ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Security+ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Security+ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Security+ Academy 课中编写并运行代码吗?

能。每节 Security+ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 替换不安全协议:Telnet 对比 SSH、FTP 对比 SFTP
  2. TLS 版本、密码套件与完全前向保密
  3. 安全 DNS:DNSSEC 与基于 HTTPS 的 DNS(DoH)
  4. IPsec、VPN 协议与远程访问安全
← 返回 Security+ Academy