最近使用 Golang 写了一个应用, 但是在使用的时候发现有些域名在中国被污染了. 于是使用 DoT (DNS over TLS) 解决了这个问题

具体实现

 1func newResolver(serverName string, addr string) *net.Resolver {
 2	var dialer net.Dialer
 3	tlsConfig := &tls.Config{
 4		ServerName: serverName,
 5		ClientSessionCache: tls.NewLRUClientSessionCache(32),
 6
 7		InsecureSkipVerify: false,
 8	}
 9
10	return &net.Resolver{
11		PreferGo: true,
12		Dial: func (context context.Context, _, address string) (net.Conn, error) {
13			conn, err := dialer.DialContext(context, "tcp", addr)
14			if err != nil {
15				return nil, err
16			}
17
18			_ = conn.(*net.TCPConn).SetKeepAlive(true)
19			_ = conn.(*net.TCPConn).SetKeepAlivePeriod(10 * time.Minute)
20			return tls.Client(conn, tlsConfig), nil
21		},
22	}
23
24}
25
26func init() {
27	net.DefaultResolver = newResolver('cloudflare-dns.com', '1.0.0.1:853')
28}

原理解析

Golang 在解析域名的时候会通过 net.DefaultResolver 来进行解析, 只需要写一个支持的 net.Resolver 就可以做到 DoT 了, 并且 Golang 自带了 tls 库可以方便的完成这一操作