## 实现计划:优化DNSSEC查询逻辑 ### 1. 需求分析 - 当配置文件中`enableDNSSEC=true`时,DNS服务器应优先返回包含DNSSEC记录的结果 - 如果没有DNSSEC结果,应返回普通查询结果作为备选 - 保持现有代码结构和兼容性 ### 2. 实现步骤 #### 步骤1:修改`forwardDNSRequestWithCache`函数 - 在函数中添加备选响应变量,用于存储非DNSSEC的成功响应 - 当`enableDNSSEC=true`时,遍历所有上游DNS服务器: - 对于每个上游,检查响应是否成功 - 如果响应成功且包含DNSSEC记录,立即返回该响应 - 如果响应成功但不包含DNSSEC记录,将其保存为备选响应 - 遍历完成后,如果有备选响应,返回该响应 - 如果没有成功响应,返回服务器失败错误 #### 步骤2:添加DNSSEC记录检测逻辑 - 在响应处理中添加DNSSEC记录检测 - 检查响应的Answer、Ns和Extra部分是否包含RRSIG记录 - 使用该检测结果决定是否优先返回该响应 #### 步骤3:优化日志记录 - 为DNSSEC优先返回的情况添加专门的日志记录 - 为备选响应返回的情况添加日志记录 ### 3. 技术细节 #### 3.1 DNSSEC检测方法 - 检查响应中是否包含RRSIG(资源记录签名)记录 - 检查范围包括Answer、Ns和Extra部分 - 使用类型断言判断记录类型 #### 3.2 优先级逻辑 - 最高优先级:成功且包含DNSSEC的响应 - 次高优先级:成功但不包含DNSSEC的响应 - 最低优先级:失败响应 ### 4. 预期效果 - 当启用DNSSEC时,优先返回安全的DNSSEC结果 - 提高DNS查询的安全性 - 兼容现有配置和代码 - 提供详细的日志记录 ### 5. 文件修改 - **文件**:`/root/dns/dns/server.go` - **函数**:`forwardDNSRequestWithCache` - **修改内容**:添加DNSSEC优先逻辑和备选响应处理 ### 6. 测试要点 - 验证启用DNSSEC时优先返回DNSSEC结果 - 验证无DNSSEC结果时返回普通结果 - 验证禁用DNSSEC时使用原有逻辑 - 验证日志记录正确 ### 7. 实现时间线 - 代码修改:20分钟 - 测试:10分钟 - 总计:30分钟