diff --git a/go.mod b/go.mod index 60e8a85f..85cb0db7 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/AdguardTeam/AdGuardHome go 1.20 require ( - github.com/AdguardTeam/dnsproxy v0.59.1 + github.com/AdguardTeam/dnsproxy v0.59.2-0.20231129093901-b1d6bad15937 github.com/AdguardTeam/golibs v0.17.2 github.com/AdguardTeam/urlfilter v0.17.3 github.com/NYTimes/gziphandler v1.1.1 @@ -64,3 +64,5 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.15.0 // indirect ) + +require github.com/jessevdk/go-flags v1.5.0 // indirect diff --git a/go.sum b/go.sum index bb748eec..3467d2a7 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/AdguardTeam/dnsproxy v0.59.1 h1:G/6T32EuPF0rhRkACkLFwD0pajI9351a1LACpuA2UcE= github.com/AdguardTeam/dnsproxy v0.59.1/go.mod h1:ZvkbM71HwpilgkCnTubDiR4Ba6x5Qvnhy2iasMWaTDM= +github.com/AdguardTeam/dnsproxy v0.59.2-0.20231129093901-b1d6bad15937 h1:ZGOsX3UYLtrPJbBoKL9Zv6PLnO1duE8RgOsoxFmXGjQ= +github.com/AdguardTeam/dnsproxy v0.59.2-0.20231129093901-b1d6bad15937/go.mod h1:ZvkbM71HwpilgkCnTubDiR4Ba6x5Qvnhy2iasMWaTDM= github.com/AdguardTeam/golibs v0.17.2 h1:vg6wHMjUKscnyPGRvxS5kAt7Uw4YxcJiITZliZ476W8= github.com/AdguardTeam/golibs v0.17.2/go.mod h1:DKhCIXHcUYtBhU8ibTLKh1paUL96n5zhQBlx763sj+U= github.com/AdguardTeam/urlfilter v0.17.3 h1:fg/ObbnO0Cv6aw0tW6N/ETDMhhNvmcUUOZ7HlmKC3rw= @@ -52,6 +54,8 @@ github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8 github.com/insomniacslk/dhcp v0.0.0-20231016090811-6a2c8fbdcc1c h1:PgxFEySCI41sH0mB7/2XswdXbUykQsRUGod8Rn+NubM= github.com/insomniacslk/dhcp v0.0.0-20231016090811-6a2c8fbdcc1c/go.mod h1:3A9PQ1cunSDF/1rbTq99Ts4pVnycWg+vlPkfeD2NLFI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk= @@ -100,6 +104,7 @@ github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0 github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= @@ -145,6 +150,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/dnsforward/dialcontext.go b/internal/dnsforward/dialcontext.go index c2ffe1e7..edb96b14 100644 --- a/internal/dnsforward/dialcontext.go +++ b/internal/dnsforward/dialcontext.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "net" + "net/netip" + "strconv" "time" "github.com/AdguardTeam/golibs/errors" @@ -11,10 +13,12 @@ import ( ) // DialContext is an [aghnet.DialContextFunc] that uses s to resolve hostnames. +// addr should be a valid host:port address, where host could be a domain name +// or an IP address. func (s *Server) DialContext(ctx context.Context, network, addr string) (conn net.Conn, err error) { log.Debug("dnsforward: dialing %q for network %q", addr, network) - host, port, err := net.SplitHostPort(addr) + host, portStr, err := net.SplitHostPort(addr) if err != nil { return nil, err } @@ -28,21 +32,24 @@ func (s *Server) DialContext(ctx context.Context, network, addr string) (conn ne return dialer.DialContext(ctx, network, addr) } - addrs, err := s.Resolve(host) + port, err := strconv.Atoi(portStr) if err != nil { - return nil, fmt.Errorf("resolving %q: %w", host, err) + return nil, fmt.Errorf("invalid port %s: %w", portStr, err) } - log.Debug("dnsforward: resolving %q: %v", host, addrs) - - if len(addrs) == 0 { + ips, err := s.Resolve(ctx, network, host) + if err != nil { + return nil, fmt.Errorf("resolving %q: %w", host, err) + } else if len(ips) == 0 { return nil, fmt.Errorf("no addresses for host %q", host) } + log.Debug("dnsforward: resolved %q: %v", host, ips) + var dialErrs []error - for _, a := range addrs { - addr = net.JoinHostPort(a.String(), port) - conn, err = dialer.DialContext(ctx, network, addr) + for _, ip := range ips { + addrPort := netip.AddrPortFrom(ip, uint16(port)) + conn, err = dialer.DialContext(ctx, network, addrPort.String()) if err != nil { dialErrs = append(dialErrs, err) diff --git a/internal/dnsforward/dnsforward.go b/internal/dnsforward/dnsforward.go index cc9f6bbc..77e784b8 100644 --- a/internal/dnsforward/dnsforward.go +++ b/internal/dnsforward/dnsforward.go @@ -2,6 +2,7 @@ package dnsforward import ( + "context" "fmt" "io" "net" @@ -329,15 +330,14 @@ func (s *Server) AddrProcConfig() (c *client.DefaultAddrProcConfig) { } } -// Resolve - get IP addresses by host name from an upstream server. -// No request/response filtering is performed. -// Query log and Stats are not updated. -// This method may be called before Start(). -func (s *Server) Resolve(host string) ([]net.IPAddr, error) { +// Resolve gets IP addresses by host name from an upstream server. No +// request/response filtering is performed. Query log and Stats are not +// updated. This method may be called before [Server.Start]. +func (s *Server) Resolve(ctx context.Context, net, host string) (addr []netip.Addr, err error) { s.serverLock.RLock() defer s.serverLock.RUnlock() - return s.internalProxy.LookupIPAddr(host) + return s.internalProxy.LookupNetIP(ctx, net, host) } const ( diff --git a/internal/home/dns.go b/internal/home/dns.go index 592e84f2..59d3fa62 100644 --- a/internal/home/dns.go +++ b/internal/home/dns.go @@ -540,11 +540,13 @@ type safeSearchResolver struct{} var _ filtering.Resolver = safeSearchResolver{} // LookupIP implements [filtering.Resolver] interface for safeSearchResolver. -// It returns the slice of net.IP with IPv4 and IPv6 instances. -// -// TODO(a.garipov): Support network. -func (r safeSearchResolver) LookupIP(_ context.Context, _, host string) (ips []net.IP, err error) { - addrs, err := Context.dnsServer.Resolve(host) +// It returns the slice of net.Addr with IPv4 and IPv6 instances. +func (r safeSearchResolver) LookupIP( + ctx context.Context, + network string, + host string, +) (ips []net.IP, err error) { + addrs, err := Context.dnsServer.Resolve(ctx, network, host) if err != nil { return nil, err } @@ -554,7 +556,7 @@ func (r safeSearchResolver) LookupIP(_ context.Context, _, host string) (ips []n } for _, a := range addrs { - ips = append(ips, a.IP) + ips = append(ips, a.AsSlice()) } return ips, nil