Browse Source

Feature: android binary runtime default dns set 8.8.8.8:53 (#572)

ref https://github.com/golang/go/issues/8877
ref https://github.com/v2ray/v2ray-core/issues/1909
CalmLong 4 years ago
parent
commit
3eb13868f2

+ 4 - 0
infra/conf/dns.go

@@ -158,6 +158,10 @@ func (c *DNSConfig) Build() (*dns.Config, error) {
 		config.NameServer = append(config.NameServer, ns)
 	}
 
+	if BootstrapDNS() {
+		newError("Bootstrap DNS: ", bootstrapDNS).AtWarning().WriteToLog()
+	}
+
 	if c.Hosts != nil && len(c.Hosts) > 0 {
 		domains := make([]string, 0, len(c.Hosts))
 		for domain := range c.Hosts {

+ 9 - 0
infra/conf/dns_bootstrap.go

@@ -0,0 +1,9 @@
+// +build !android
+
+package conf
+
+const bootstrapDNS = ""
+
+func BootstrapDNS() bool {
+	return false
+}

+ 25 - 0
infra/conf/dns_bootstrap_android.go

@@ -0,0 +1,25 @@
+// +build android
+
+package conf
+
+import (
+	"context"
+	"net"
+)
+
+const bootstrapDNS = "8.8.8.8:53"
+
+func BootstrapDNS() bool {
+	var dialer net.Dialer
+	net.DefaultResolver = &net.Resolver{
+		PreferGo: false,
+		Dial: func(context context.Context, _, _ string) (net.Conn, error) {
+			conn, err := dialer.DialContext(context, "udp", bootstrapDNS)
+			if err != nil {
+				return nil, err
+			}
+			return conn, nil
+		},
+	}
+	return true
+}

+ 28 - 0
infra/conf/dns_bootstrap_test.go

@@ -0,0 +1,28 @@
+package conf
+
+import (
+	"context"
+	"net"
+	"testing"
+)
+
+func TestBootstrapDNS(t *testing.T) {
+	const (
+		defaultNS = "8.8.8.8:53"
+		domain    = "github.com"
+	)
+	var dialer net.Dialer
+	net.DefaultResolver = &net.Resolver{
+		PreferGo: true,
+		Dial: func(context context.Context, network, address string) (net.Conn, error) {
+			conn, err := dialer.DialContext(context, "udp", defaultNS)
+			if err != nil {
+				return nil, err
+			}
+			return conn, nil
+		},
+	}
+	if ips, err := net.LookupIP(domain); len(ips) == 0 {
+		t.Error("set BootstrapDNS failed: ", err)
+	}
+}