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