Files
dns-server/dns/.trae/documents/plan_20251225_130822.md
Alex Yang cdac4fcf43 update
2026-01-16 11:09:11 +08:00

2.3 KiB
Raw Blame History

问题分析

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

修改点

  1. 添加地址处理函数:在文件中添加normalizeDNSServerAddress函数
  2. 在parallel模式中使用修改第865行附近的代码
  3. 在loadbalance模式中使用修改第1063行附近的代码
  4. 在fastest-ip模式中使用修改第1189行附近的代码
  5. 在default模式中使用修改第1311行附近的代码
  6. 在DNSSEC专用服务器请求中使用修改第1452行附近的代码
  7. 在本地解析中使用修改第1550行附近的代码

4. 确保配置文件加载时也处理地址

  • 检查配置文件加载代码确保在加载配置时就处理DNS服务器地址
  • 或者在每次使用DNS服务器地址时动态处理

修复步骤

  1. 创建地址处理函数:实现normalizeDNSServerAddress函数
  2. 修改所有DNS查询点:在所有调用resolver.Exchange()的地方使用该函数
  3. 测试修复效果重启DNS服务器并测试查询功能
  4. 验证各种配置场景测试带端口和不带端口的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查询点