2.3 KiB
2.3 KiB
问题分析
DNS服务器出现"Server Failed"的根本原因是:当用户配置的DNS服务器地址没有包含端口号时,代码直接将其传递给dns.Client.Exchange()方法,而该方法需要完整的"IP:端口"格式地址。
解决方案
1. 创建DNS服务器地址处理函数
- 功能:确保DNS服务器地址始终包含端口号,默认添加53端口
- 实现:创建
normalizeDNSServerAddress函数,检查并添加端口号
2. 应用地址处理函数到所有DNS服务器配置
需要修改的位置:
- 主DNS服务器:
s.config.UpstreamDNS - DNSSEC专用服务器:
s.config.DNSSECUpstreamDNS - 域名特定DNS服务器:
s.config.DomainSpecificDNS - 所有调用
resolver.Exchange()的地方:确保传递的服务器地址包含端口号
3. 修改具体代码位置
文件:dns/server.go
修改点:
- 添加地址处理函数:在文件中添加
normalizeDNSServerAddress函数 - 在parallel模式中使用:修改第865行附近的代码
- 在loadbalance模式中使用:修改第1063行附近的代码
- 在fastest-ip模式中使用:修改第1189行附近的代码
- 在default模式中使用:修改第1311行附近的代码
- 在DNSSEC专用服务器请求中使用:修改第1452行附近的代码
- 在本地解析中使用:修改第1550行附近的代码
4. 确保配置文件加载时也处理地址
- 检查配置文件加载代码,确保在加载配置时就处理DNS服务器地址
- 或者在每次使用DNS服务器地址时动态处理
修复步骤
- 创建地址处理函数:实现
normalizeDNSServerAddress函数 - 修改所有DNS查询点:在所有调用
resolver.Exchange()的地方使用该函数 - 测试修复效果:重启DNS服务器并测试查询功能
- 验证各种配置场景:测试带端口和不带端口的DNS服务器配置
预期效果
- 当用户配置DNS服务器为
223.5.5.5时,自动添加端口变为223.5.5.5:53 - 当用户配置DNS服务器为
8.8.8.8:53时,保持不变 - DNS查询成功率显著提高,不再出现"Server Failed"错误
- 支持各种DNS服务器配置格式,提高系统兼容性
关键文件修改
/root/dns/dns/server.go:添加地址处理函数并应用到所有DNS查询点