Golang Go语言中如何指定一个程序内部使用的全局 DNS
Golang Go语言中如何指定一个程序内部使用的全局 DNS
如题,golang 如何指定一个程序内部使用的全局 dns,
即这个 golang 程序,内部的所有网络请求全部走自己指定的 dns,不走 /etc/resolv.conf 来获取
https://golang.org/pkg/net/#Dialergolang<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.Dialer
和 net.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.Resolver
和 net.Dialer
来使用特定的 DNS 服务器(例如 Google DNS 8.8.8.8)进行 HTTP 请求。