Golang Go语言中如何指定一个程序内部使用的全局 DNS

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言中如何指定一个程序内部使用的全局 DNS

如题,golang 如何指定一个程序内部使用的全局 dns,

即这个 golang 程序,内部的所有网络请求全部走自己指定的 dns,不走 /etc/resolv.conf 来获取

7 回复

https://golang.org/pkg/net/#Dialer

golang<br>type Dialer struct {<br>...<br> // Resolver optionally specifies an alternate resolver to use.<br> Resolver *Resolver<br>...<br>}<br>

可以在 Dialer 层设置 net.Resolver,然后再用 HTTP 包裹 Dialer,最后发起连接即可。
你可以封装下上面的 struct,这样所有网络请求都可以走自定义的 DNS 了。

更多关于Golang Go语言中如何指定一个程序内部使用的全局 DNS的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


做不到,你可以放在 docker 里,然后改里面的 /etc/resolv.conf

如果所有的网络接口都使用一个基类,那使用 Resolver 应该是可以的。否则应该是不行的。

试了下,可以做到,不过这种方法在 windows 下无效

https://godoc.org/net

On Windows, the resolver always uses C library functions, such as GetAddrInfo and DnsQuery.

```
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(4000),
}
return d.DialContext(ctx, “udp”, fmt.Sprintf("%s:53", dns))
},
}

这个是引入了一个第三方的 dns client 了,他为了解决 windows 下用不了的问题 = =
我只需要 Linux 下能用就行了

在 Go 语言中,如果你想指定一个程序内部使用的全局 DNS 服务器,可以通过设置系统的 resolv.conf 文件中的 nameserver 条目来实现,但这通常需要系统级权限,并且影响整个系统的 DNS 解析行为。对于只需要在 Go 程序内部使用的特定 DNS 服务器,可以通过自定义 DNS 解析器来实现。

Go 的 net 包提供了足够的灵活性来设置自定义的 DNS 解析器。你可以使用 net.Dialernet.Resolver 来实现这一点。以下是一个基本示例,展示了如何为特定 HTTP 请求设置自定义 DNS 解析器:

package main

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

func main() {
    dialer := &net.Dialer{
        Resolver: &net.Resolver{
            PreferGo: true,
            Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
                d := net.Dialer{}
                return d.DialContext(ctx, "tcp", "8.8.8.8:53") // 使用 Google DNS
            },
        },
    }

    transport := &http.Transport{
        DialContext: dialer.DialContext,
    }

    client := &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second,
    }

    resp, err := client.Get("http://example.com")
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        resp.Body.Close()
        fmt.Println("Request succeeded")
    }
}

这段代码展示了如何通过自定义 net.Resolvernet.Dialer 来使用特定的 DNS 服务器(例如 Google DNS 8.8.8.8)进行 HTTP 请求。

回到顶部