1.5 KiB
1.5 KiB
问题分析
- 收集验证记录集不完整:在DNSSEC验证过程中,代码只从
response.Answer和response.Ns中收集记录,而忽略了response.Extra中的记录,导致某些DNSSEC记录没有被正确验证。 - 验证失败处理不当:当DNSSEC签名验证失败时,代码会直接丢弃该响应,而不是返回包含DNSSEC记录的响应,导致客户端无法获取DNSSEC记录。
修复方案
- 修复记录集收集逻辑:在收集需要验证的记录集(rrset)时,确保从
response.Answer、response.Ns和response.Extra中收集所有相关记录。 - 改进验证失败处理:即使DNSSEC签名验证失败,也要返回包含DNSSEC记录的响应,同时设置正确的AD标志,让客户端决定如何处理验证失败的情况。
- 优化备选响应逻辑:确保在所有上游服务器都不返回DNSSEC记录时,仍然能够正确处理和返回响应。
具体修改
- 修改
forwardDNSRequestWithCache函数中的记录集收集逻辑,添加对response.Extra的处理 - 修改DNSSEC验证失败时的处理逻辑,确保返回包含DNSSEC记录的响应
- 优化备选响应的保存和返回逻辑,确保DNSSEC记录能够被正确处理
测试计划
- 编译修复后的代码
- 启动DNS服务器并启用DNSSEC
- 使用dig命令测试DNSSEC记录查询,例如:
dig +dnssec example.com - 检查查询结果是否包含DNSSEC记录(RRSIG、DNSKEY等)
- 检查日志中是否有DNSSEC验证相关的记录