# DNSSEC功能修复计划 ## 问题分析 当前DNSSEC实现存在以下问题: 1. 当启用DNSSEC时,系统只是验证上游服务器返回的DNSSEC签名,但不会主动请求DNSSEC记录 2. 当上游服务器返回的响应没有DNSSEC记录时,系统只是将其作为备选响应 3. 没有专门从8.8.8.8/1.1.1.1获取DNSSEC记录进行验证 4. 缓存时没有优先考虑DNSSEC记录 ## 修复方案 ### 1. 改进DNS请求转发逻辑 **修改文件:** `dns/server.go` **修改函数:** `forwardDNSRequestWithCache` - 当启用DNSSEC且响应中没有DNSSEC记录时,主动向8.8.8.8/1.1.1.1发送DNS请求 - 比较不同服务器返回的结果,优先使用带有DNSSEC记录的响应 - 如果DNSSEC结果不匹配,优先使用8.8.8.8/1.1.1.1提供的解析记录 ### 2. 增强DNSSEC验证机制 **修改文件:** `dns/server.go` - 完善DNSSEC记录提取和验证逻辑 - 确保正确处理DNSKEY和RRSIG记录 - 改进AD标志(Authenticated Data)的设置 ### 3. 优化缓存机制 **修改文件:** `dns/cache.go` 和 `dns/server.go` - 缓存时标记DNSSEC状态 - 优先返回带有DNSSEC记录的缓存项 - 改进缓存键生成,考虑DNSSEC属性 ### 4. 增加DNSSEC特定服务器配置 **修改文件:** `config.json` - 添加专门用于DNSSEC查询的服务器配置 - 默认为8.8.8.8和1.1.1.1 ## 具体实现步骤 1. **修改`forwardDNSRequestWithCache`函数**: - 当启用DNSSEC且主响应没有DNSSEC记录时,向DNSSEC专用服务器发送请求 - 比较所有响应,选择最优结果(优先DNSSEC记录,其次是可靠服务器) - 实现DNSSEC结果验证和比较逻辑 2. **改进缓存获取逻辑**: - 在`handleDNSRequest`函数中,优先检查是否有带有DNSSEC记录的缓存项 - 如果有,直接返回;否则再检查普通缓存项 3. **优化DNSSEC记录验证**: - 增强`verifyDNSSEC`函数的实现 - 确保正确验证所有RRSIG记录 - 改进错误处理和日志记录 4. **添加DNSSEC服务器配置**: - 在配置文件中添加`dnssecUpstreamDNS`配置项 - 默认值为["8.8.8.8:53", "1.1.1.1:53"] ## 测试计划 1. 启动DNS服务器,启用DNSSEC 2. 使用`dig`命令测试DNSSEC记录获取 3. 验证带有DNSSEC记录的响应被正确返回 4. 验证缓存机制优先返回DNSSEC记录 5. 测试DNSSEC验证失败时的处理逻辑 ## 预期效果 1. 启用DNSSEC后,系统会主动请求并验证DNSSEC记录 2. 优先返回带有DNSSEC记录的解析结果 3. 当DNSSEC结果不匹配时,优先使用8.8.8.8/1.1.1.1提供的记录 4. 缓存机制正确处理DNSSEC标记,优先返回DNSSEC记录 5. 完善的日志记录,便于调试和监控 ## 代码修改范围 - `dns/server.go`:核心DNSSEC逻辑修改 - `dns/cache.go`:缓存机制优化 - `config.json`:配置项添加 通过以上修改,将解决当前DNSSEC功能的问题,确保启用DNSSEC后能够正确获取、验证和返回DNSSEC记录。