Golang实现不依赖搜索域的DNS查询解析

Golang实现不依赖搜索域的DNS查询解析 我正在使用标准网络库进行DNS请求,通过Resolver.LookupIPAddr配合自定义拨号器来指定要使用的名称服务器。如果查找失败,它会使用我的resolv.conf中的搜索域名重复查找。

如果我查找abc.blah.com失败,它会继续尝试abc.blah.com.int以及其他域名。

是否可以停止这种行为?我只想对我指定的确切名称进行单次查找。

2 回复

我刚刚找到了答案,在请求时使用末尾带点的域名,例如"abc.blah.com.",会导致查询忽略搜索域而只发出单个请求。

更多关于Golang实现不依赖搜索域的DNS查询解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在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查询严格针对输入域名,符合你的需求。如果查询失败,将直接返回错误,不会进行重试或其他域名的查找。

回到顶部