This commit is contained in:
Alex Yang
2026-01-16 11:09:11 +08:00
parent 8159577be0
commit cdac4fcf43
284 changed files with 2813570 additions and 14 deletions

View File

@@ -0,0 +1,82 @@
# 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记录。