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