From df2e29b74d4105efdad1a0c4063a225d2c07fd7d Mon Sep 17 00:00:00 2001 From: Charlie Jonas Date: Mon, 16 Aug 2021 18:25:34 +0100 Subject: [PATCH 1/4] Add --internal-dns flag --- src/cli/cli.go | 1 + src/models/constants.go | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 1808cb21..8dcadc62 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -80,6 +80,7 @@ func Run() (err error) { }, } app.Flags = []cli.Flag{ + &cli.BoolFlag{Name: "internal-dns", Usage: "use a built-in DNS stub resolver rather than the host operating system"}, &cli.BoolFlag{Name: "remember", Usage: "save these settings to reuse next time"}, &cli.BoolFlag{Name: "debug", Usage: "toggle debug mode"}, &cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"}, diff --git a/src/models/constants.go b/src/models/constants.go index 183d0b28..66c5ca63 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net" + "os" "time" ) @@ -16,6 +17,7 @@ var ( DEFAULT_RELAY6 = "croc6.schollz.com" DEFAULT_PORT = "9009" DEFAULT_PASSPHRASE = "pass123" + INTERNAL_DNS = false ) // lookupTimeout for DNS requests @@ -35,6 +37,13 @@ var publicDns = []string{ } func init() { + for _, flag := range os.Args { + if flag == "--internal-dns" { + INTERNAL_DNS = true + break + } + } + var err error DEFAULT_RELAY, err = lookup(DEFAULT_RELAY) if err == nil { @@ -50,16 +59,11 @@ func init() { } } -// lookup an IP address. -// -// Priority is given to local queries, and the system falls back to a list of -// public DNS servers. +// Resolve a hostname to an IP address using DNS. func lookup(address string) (ipaddress string, err error) { - ipaddress, err = localLookupIP(address) - if err == nil { - return + if !INTERNAL_DNS { + return localLookupIP(address) } - err = nil result := make(chan string, len(publicDns)) for _, dns := range publicDns { From be7705efc36efdaddc6f5547fc32d420d2ad4f10 Mon Sep 17 00:00:00 2001 From: Charlie Jonas Date: Mon, 16 Aug 2021 18:32:55 +0100 Subject: [PATCH 2/4] Remove DNS lookup timeouts --- src/models/constants.go | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/models/constants.go b/src/models/constants.go index 66c5ca63..52829269 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "os" - "time" ) // TCP_BUFFER_SIZE is the maximum packet size @@ -20,9 +19,6 @@ var ( INTERNAL_DNS = false ) -// lookupTimeout for DNS requests -const lookupTimeout = time.Second - // publicDns are servers to be queried if a local lookup fails var publicDns = []string{ "1.0.0.1", // Cloudflare @@ -86,10 +82,7 @@ func lookup(address string) (ipaddress string, err error) { // localLookupIP returns a host's IP address based on the local resolver. func localLookupIP(address string) (ipaddress string, err error) { - ctx, cancel := context.WithTimeout(context.Background(), lookupTimeout) - defer cancel() - - ip, err := net.DefaultResolver.LookupHost(ctx, address) + ip, err := net.LookupHost(address) if err != nil { return } @@ -102,10 +95,8 @@ func remoteLookupIP(address, dns string) (ipaddress string, err error) { r := &net.Resolver{ PreferGo: true, Dial: func(ctx context.Context, network, address string) (net.Conn, error) { - d := net.Dialer{ - Timeout: lookupTimeout, - } - return d.DialContext(ctx, "udp", dns+":53") + d := new(net.Dialer) + return d.DialContext(ctx, network, dns+":53") }, } ip, err := r.LookupHost(context.Background(), address) From f64f68d5a98739e06ace60f29218829e8fd85c0b Mon Sep 17 00:00:00 2001 From: Charlie Jonas Date: Mon, 16 Aug 2021 18:39:42 +0100 Subject: [PATCH 3/4] Tidy up code slightly --- src/models/constants.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/models/constants.go b/src/models/constants.go index 52829269..397bf3fc 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -39,7 +39,6 @@ func init() { break } } - var err error DEFAULT_RELAY, err = lookup(DEFAULT_RELAY) if err == nil { @@ -60,23 +59,22 @@ func lookup(address string) (ipaddress string, err error) { if !INTERNAL_DNS { return localLookupIP(address) } - result := make(chan string, len(publicDns)) for _, dns := range publicDns { go func(dns string) { - s, _ := remoteLookupIP(address, dns) - result <- s + s, err := remoteLookupIP(address, dns) + if err == nil { + result <- s + } }(dns) } - for i := 0; i < len(publicDns); i++ { ipaddress = <-result if ipaddress != "" { return } } - - err = fmt.Errorf("failed to lookup %s at any DNS server", address) + err = fmt.Errorf("failed to resolve %s: all DNS servers exhausted", address) return } From d75530b78b76ba0fed5e80bf6d95b5d101689876 Mon Sep 17 00:00:00 2001 From: Charlie Jonas Date: Mon, 16 Aug 2021 18:48:03 +0100 Subject: [PATCH 4/4] Improve built-in list of public DNS recursors --- src/models/constants.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/models/constants.go b/src/models/constants.go index 397bf3fc..ca2543ce 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -23,13 +23,22 @@ var ( var publicDns = []string{ "1.0.0.1", // Cloudflare "1.1.1.1", // Cloudflare + "[2606:4700:4700::1111]", // Cloudflare + "[2606:4700:4700::1001]", // Cloudflare "8.8.4.4", // Google "8.8.8.8", // Google - "8.26.56.26", // Comodo - "208.67.220.220", // Cisco OpenDNS - "208.67.222.222", // Cisco OpenDNS "[2001:4860:4860::8844]", // Google "[2001:4860:4860::8888]", // Google + "9.9.9.9", // Quad9 + "149.112.112.112", // Quad9 + "[2620:fe::fe]", // Quad9 + "[2620:fe::fe:9]", // Quad9 + "8.26.56.26", // Comodo + "8.20.247.20", // Comodo + "208.67.220.220", // Cisco OpenDNS + "208.67.222.222", // Cisco OpenDNS + "[2620:119:35::35]", // Cisco OpenDNS + "[2620:119:53::53]", // Cisco OpenDNS } func init() {