## 问题分析 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查询点