如题,golang 如何指定一个程序内部使用的全局 dns,
即这个 golang 程序,内部的所有网络请求全部走自己指定的 dns,不走 /etc/resolv.conf 来获取
1
junkman 2020-04-05 19:29:52 +08:00
https://golang.org/pkg/net/#Dialer
```golang type Dialer struct { ... // Resolver optionally specifies an alternate resolver to use. Resolver *Resolver ... } ``` 可以在 Dialer 层设置 net.Resolver,然后再用 HTTP 包裹 Dialer,最后发起连接即可。 你可以封装下上面的 struct,这样所有网络请求都可以走自定义的 DNS 了。 |
2
reus 2020-04-05 19:58:31 +08:00
做不到,你可以放在 docker 里,然后改里面的 /etc/resolv.conf
|
3
vus520 2020-04-05 21:32:29 +08:00
如果所有的网络接口都使用一个基类,那使用 Resolver 应该是可以的。否则应该是不行的。
|
4
Buffer2Disk OP @reus 试了下,可以做到,不过这种方法在 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)) }, } |
5
Mitt 2020-04-06 16:31:15 +08:00
|
6
Buffer2Disk OP @Mitt 这个是引入了一个第三方的 dns client 了,他为了解决 windows 下用不了的问题 = =
我只需要 Linux 下能用就行了 |