diff --git a/doh-client/client.go b/doh-client/client.go index 2ffb7ae..5de26e2 100644 --- a/doh-client/client.go +++ b/doh-client/client.go @@ -131,13 +131,14 @@ func (c *Client) newHTTPClient() error { if c.httpTransport != nil { c.httpTransport.CloseIdleConnections() } + dialer := &net.Dialer{ + Timeout: time.Duration(c.conf.Timeout) * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + Resolver: c.bootstrapResolver, + } c.httpTransport = &http.Transport{ - DialContext: (&net.Dialer{ - Timeout: time.Duration(c.conf.Timeout) * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - Resolver: c.bootstrapResolver, - }).DialContext, + DialContext: dialer.DialContext, ExpectContinueTimeout: 1 * time.Second, IdleConnTimeout: 90 * time.Second, MaxIdleConns: 100, @@ -146,6 +147,14 @@ func (c *Client) newHTTPClient() error { ResponseHeaderTimeout: time.Duration(c.conf.Timeout) * time.Second, TLSHandshakeTimeout: time.Duration(c.conf.Timeout) * time.Second, } + if c.conf.NoIPv6 { + c.httpTransport.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) { + if strings.HasPrefix(network, "tcp") { + network = "tcp4" + } + return dialer.DialContext(ctx, network, address) + } + } err := http2.ConfigureTransport(c.httpTransport) if err != nil { return err diff --git a/doh-client/config.go b/doh-client/config.go index 2b39950..0018740 100644 --- a/doh-client/config.go +++ b/doh-client/config.go @@ -37,6 +37,7 @@ type config struct { Timeout uint `toml:"timeout"` NoCookies bool `toml:"no_cookies"` NoECS bool `toml:"no_ecs"` + NoIPv6 bool `toml:"no_ipv6"` Verbose bool `toml:"verbose"` } diff --git a/doh-client/doh-client.conf b/doh-client/doh-client.conf index 7d67ca7..2153442 100644 --- a/doh-client/doh-client.conf +++ b/doh-client/doh-client.conf @@ -65,5 +65,13 @@ no_cookies = false # the same configuration as most public DNS servers. no_ecs = false +# Disable IPv6 when querying upstream +# +# Only enable this if you really have trouble connecting. +# Doh-client uses both IPv4 and IPv6 by default and should not have problems +# with an IPv4-only environment. +# Note that DNS listening and bootstrapping is not controlled by this option. +no_ipv6 = false + # Enable logging verbose = false