# 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记录。