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

2020-04-05 14:50:41 +08:00
 Buffer2Disk

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

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

2293 次点击
所在节点    Go 编程语言
6 条回复
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 了。
reus
2020-04-05 19:58:31 +08:00
做不到,你可以放在 docker 里,然后改里面的 /etc/resolv.conf
vus520
2020-04-05 21:32:29 +08:00
如果所有的网络接口都使用一个基类,那使用 Resolver 应该是可以的。否则应该是不行的。
Buffer2Disk
2020-04-06 12:18:37 +08:00
@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))
},
}
Mitt
2020-04-06 16:31:15 +08:00
Buffer2Disk
2020-04-06 23:54:36 +08:00
@Mitt 这个是引入了一个第三方的 dns client 了,他为了解决 windows 下用不了的问题 = =
我只需要 Linux 下能用就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX