Go 如何覆盖默认DNS

Go 如何覆盖默认DNS,go,dns,resolve,Go,Dns,Resolve,我一直在寻找一种方法,试图覆盖默认的DNS服务器的围棋程序有一段时间,但仍然没有成功 目前我认为可行的解决方案是: package main import ( "context" "fmt" "net" "time" ) func main() { DNS := "1.1.1.1" net.DefaultResolver = &net.Resolver{ PreferGo: true, Dial: fun

我一直在寻找一种方法,试图覆盖默认的DNS服务器的围棋程序有一段时间,但仍然没有成功

目前我认为可行的解决方案是:

package main

import (
    "context"
    "fmt"
    "net"
    "time"
)

func main() {
    DNS := "1.1.1.1"
    net.DefaultResolver = &net.Resolver{
        PreferGo: true,
        Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
            d := net.Dialer{
                Timeout: time.Millisecond * time.Duration(3000),
            }
            return d.DialContext(ctx, "udp", fmt.Sprintf("%s:53", DNS))
        },
    }

    resp, err := net.LookupHost("tsdfsdf.com")
    if err != nil {
        fmt.Printf(err.Error())
    }

    fmt.Printf("%+v", resp)
}

但对此的反应是:

lookup tsdfsdf.com on 192.168.0.1:53: no such host[]
这是我在reslov.conf中设置的默认DNS服务器 我已尝试通过设置
export GODEBUG=netdns=Go

长期的解决方案是能够覆盖HTTP客户机的默认解析器,而这些解析器又会被一些AWS SDK的东西使用

有没有人面对过这件事,或者知道我该如何应对


仅供参考,我知道“tsdfsdf.com”不是一个真正的域,我只是用它来抛出一个没有这样的主机错误,以查看它要求的DNS。

该错误具有误导性,因为您忽略了address参数。错误消息是由拨号的呼叫者构造的(假定您正在连接到地址),您的硬编码地址不可能出现在其中。使用诸如tcpdump或Wireshark之类的工具,您将看到DNS查询转到CloudFlare。是的,使用Wireshark确实正确显示了这一点,我甚至没有想到。我在使用AWS Sdk时确实发现,我必须创建一个带有传输和拨号程序的自定义Http客户端,以便使用:)将发布我在下面使用的内容:)错误是误导性的,因为您忽略了address参数。错误消息是由拨号的呼叫者构造的(假定您正在连接到地址),您的硬编码地址不可能出现在其中。使用诸如tcpdump或Wireshark之类的工具,您将看到DNS查询转到CloudFlare。是的,使用Wireshark确实正确显示了这一点,我甚至没有想到。我在使用AWS Sdk时发现,我必须创建一个带有传输和拨号器的自定义Http客户端,以便它使用:)将发布我在下面使用的内容:)