Golang实现不依赖搜索域的DNS查询解析
Golang实现不依赖搜索域的DNS查询解析 我正在使用标准网络库进行DNS请求,通过Resolver.LookupIPAddr配合自定义拨号器来指定要使用的名称服务器。如果查找失败,它会使用我的resolv.conf中的搜索域名重复查找。
如果我查找abc.blah.com失败,它会继续尝试abc.blah.com.int以及其他域名。
是否可以停止这种行为?我只想对我指定的确切名称进行单次查找。
2 回复
在Go中,可以通过自定义Resolver并设置其PreferGo字段为true,同时提供一个自定义的Dial函数来指定DNS服务器,从而绕过系统的默认搜索域行为。标准库的net包在PreferGo启用且自定义Dial提供时,不会应用搜索域列表。
以下是一个示例实现:
package main
import (
"context"
"fmt"
"net"
"time"
)
func main() {
// 定义自定义的DNS解析器
resolver := &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{
Timeout: time.Millisecond * time.Duration(10000),
}
// 指定DNS服务器,例如使用Google的公共DNS 8.8.8.8:53
return d.DialContext(ctx, network, "8.8.8.8:53")
},
}
// 执行DNS查询,仅查找确切的域名
ips, err := resolver.LookupIPAddr(context.Background(), "abc.blah.com")
if err != nil {
fmt.Printf("Lookup failed: %v\n", err)
return
}
for _, ip := range ips {
fmt.Printf("Resolved IP: %s\n", ip.String())
}
}
在这个代码中:
PreferGo: true强制使用Go的纯DNS解析器而非C库。- 自定义
Dial函数直接连接到指定的DNS服务器(如8.8.8.8:53),避免了系统resolv.conf中搜索域的干扰。 LookupIPAddr只会对提供的确切域名abc.blah.com进行单次查询,不会尝试任何搜索域扩展。
这种方法确保了DNS查询严格针对输入域名,符合你的需求。如果查询失败,将直接返回错误,不会进行重试或其他域名的查找。


