Fix: domain dns should follow hosts config, close #1318

This commit is contained in:
Dreamacro 2021-04-01 21:20:44 +08:00
parent 4ad9761b32
commit d0c829c578
3 changed files with 18 additions and 11 deletions

View file

@ -3,6 +3,7 @@ package resolver
import ( import (
"context" "context"
"errors" "errors"
"math/rand"
"net" "net"
"strings" "strings"
"time" "time"
@ -66,7 +67,7 @@ func ResolveIPv4(host string) (net.IP, error) {
return nil, ErrIPNotFound return nil, ErrIPNotFound
} }
return ipAddrs[0], nil return ipAddrs[rand.Intn(len(ipAddrs))], nil
} }
// ResolveIPv6 with a host, return ipv6 // ResolveIPv6 with a host, return ipv6
@ -102,20 +103,20 @@ func ResolveIPv6(host string) (net.IP, error) {
return nil, ErrIPNotFound return nil, ErrIPNotFound
} }
return ipAddrs[0], nil return ipAddrs[rand.Intn(len(ipAddrs))], nil
} }
// ResolveIP with a host, return ip // ResolveIPWithResolver same as ResolveIP, but with a resolver
func ResolveIP(host string) (net.IP, error) { func ResolveIPWithResolver(host string, r Resolver) (net.IP, error) {
if node := DefaultHosts.Search(host); node != nil { if node := DefaultHosts.Search(host); node != nil {
return node.Data.(net.IP), nil return node.Data.(net.IP), nil
} }
if DefaultResolver != nil { if r != nil {
if DisableIPv6 { if DisableIPv6 {
return DefaultResolver.ResolveIPv4(host) return r.ResolveIPv4(host)
} }
return DefaultResolver.ResolveIP(host) return r.ResolveIP(host)
} else if DisableIPv6 { } else if DisableIPv6 {
return ResolveIPv4(host) return ResolveIPv4(host)
} }
@ -132,3 +133,8 @@ func ResolveIP(host string) (net.IP, error) {
return ipAddr.IP, nil return ipAddr.IP, nil
} }
// ResolveIP with a host, return ip
func ResolveIP(host string) (net.IP, error) {
return ResolveIPWithResolver(host, DefaultResolver)
}

View file

@ -7,6 +7,7 @@ import (
"strings" "strings"
"github.com/Dreamacro/clash/component/dialer" "github.com/Dreamacro/clash/component/dialer"
"github.com/Dreamacro/clash/component/resolver"
D "github.com/miekg/dns" D "github.com/miekg/dns"
) )
@ -28,8 +29,7 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err
// a default ip dns // a default ip dns
ip = net.ParseIP(c.host) ip = net.ParseIP(c.host)
} else { } else {
var err error if ip, err = resolver.ResolveIPWithResolver(c.host, c.r); err != nil {
if ip, err = c.r.ResolveIP(c.host); err != nil {
return nil, fmt.Errorf("use default dns resolve failed: %w", err) return nil, fmt.Errorf("use default dns resolve failed: %w", err)
} }
} }

View file

@ -9,6 +9,7 @@ import (
"net/http" "net/http"
"github.com/Dreamacro/clash/component/dialer" "github.com/Dreamacro/clash/component/dialer"
"github.com/Dreamacro/clash/component/resolver"
D "github.com/miekg/dns" D "github.com/miekg/dns"
) )
@ -83,12 +84,12 @@ func newDoHClient(url string, r *Resolver) *dohClient {
return nil, err return nil, err
} }
ip, err := r.ResolveIPv4(host) ip, err := resolver.ResolveIPWithResolver(host, r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return dialer.DialContext(ctx, "tcp4", net.JoinHostPort(ip.String(), port)) return dialer.DialContext(ctx, "tcp", net.JoinHostPort(ip.String(), port))
}, },
}, },
} }