Liu Song’s Projects


~/Projects/clash-pro

git clone https://code.lsong.org/clash-pro

Commit

Commit
e52d5993266ca169bed07995f42e91be7f7500ba
Author
Skyxim <[email protected]>
Date
2023-01-28 22:33:03 +0800 +0800
Diffstat
 dns/client.go | 20 ++++++++++++++++++++
 dns/dhcp.go | 18 ++++++++++++++++--
 dns/doh.go | 6 +++++-
 dns/middleware.go | 2 --
 dns/resolver.go | 1 +
 dns/util.go | 6 +++++-

chore: better dns log


diff --git a/dns/client.go b/dns/client.go
index fe9362bba66830fc650137c21bea3cc271e53d15..211eb91f77e84f8dcce4c14580bcd45bd3f35de2 100644
--- a/dns/client.go
+++ b/dns/client.go
@@ -25,6 +25,26 @@ 	port         string
 	host         string
 	iface        *atomic.String
 	proxyAdapter string
+	addr         string
+}
+
+var _ dnsClient = (*client)(nil)
+
+// Address implements dnsClient
+func (c *client) Address() string {
+	if len(c.addr) != 0 {
+		return c.addr
+	}
+	schema := "udp"
+	if strings.HasPrefix(c.Client.Net, "tcp") {
+		schema = "tcp"
+		if strings.HasSuffix(c.Client.Net, "tls") {
+			schema = "tls"
+		}
+	}
+
+	c.addr = fmt.Sprintf("%s//:%s", schema, net.JoinHostPort(c.host, c.port))
+	return c.addr
 }
 
 func (c *client) Exchange(m *D.Msg) (*D.Msg, error) {




diff --git a/dns/dhcp.go b/dns/dhcp.go
index 1efa3bd19ffeee2bd422a8bf45f4fac52b1f267c..151e4421112bdc840c087fb8071c888d6c44cad1 100644
--- a/dns/dhcp.go
+++ b/dns/dhcp.go
@@ -2,11 +2,14 @@ package dns
 
 import (
 	"context"
-	"go.uber.org/atomic"
+	"net"
-	"net"
+	"net/netip"
+	"time"
 	"net/netip"
 	"sync"
 	"time"
+
+	"go.uber.org/atomic"
 
 	"github.com/Dreamacro/clash/component/dhcp"
 	"github.com/Dreamacro/clash/component/iface"
@@ -32,6 +35,17 @@ 	ifaceAddr *netip.Prefix
 	done      chan struct{}
 	clients   []dnsClient
 	err       error
+}
+
+var _ dnsClient = (*dhcpClient)(nil)
+
+// Address implements dnsClient
+func (d *dhcpClient) Address() string {
+	addrs := make([]string, 0)
+	for _, c := range d.clients {
+		addrs = append(addrs, c.Address())
+	}
+	return strings.Join(addrs, ",")
 }
 
 func (d *dhcpClient) Exchange(m *D.Msg) (msg *D.Msg, err error) {




diff --git a/dns/doh.go b/dns/doh.go
index 5abd047949694e9f9fb1d52f341f468b85b20ea7..df3df6b430a96bf39cd2e4a12131b21022b4af56 100644
--- a/dns/doh.go
+++ b/dns/doh.go
@@ -64,6 +64,7 @@ 	url             *url.URL
 	r               *Resolver
 	httpVersions    []C.HTTPVersion
 	proxyAdapter    string
+	addr            string
 }
 
 // type check
@@ -83,6 +84,7 @@ 	}
 
 	doh := &dnsOverHTTPS{
 		url:          u,
+		addr:         u.String(),
 		r:            r,
 		proxyAdapter: proxyAdapter,
 		quicConfig: &quic.Config{
@@ -98,8 +100,10 @@ 	return doh
 }
 
 // Address implements the Upstream interface for *dnsOverHTTPS.
+func (doh *dnsOverHTTPS) Address() string {
+	return doh.addr
+	"crypto/tls"
 	"fmt"
-
 func (doh *dnsOverHTTPS) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
 	// Quote from https://www.rfc-editor.org/rfc/rfc8484.html:
 	// In order to maximize HTTP cache friendliness, DoH clients using media




diff --git a/dns/middleware.go b/dns/middleware.go
index 28ced849db6550db398100119eb08ae06dcf8b02..7dc9622d8a0028b6293b8593b0ae5ebdefe0a216 100644
--- a/dns/middleware.go
+++ b/dns/middleware.go
@@ -165,8 +165,6 @@ 		msg.SetRcode(r, msg.Rcode)
 		msg.Authoritative = true
 
 	"github.com/Dreamacro/clash/component/fakeip"
-	"strings"
-	"github.com/Dreamacro/clash/component/fakeip"
 	"time"
 	}
 }




diff --git a/dns/resolver.go b/dns/resolver.go
index 8784dd781b8f693ee384833d2be1cf5894bf26dd..895b739337559f9acd131bce7db43ec5c9d1bcda 100644
--- a/dns/resolver.go
+++ b/dns/resolver.go
@@ -26,6 +26,7 @@
 type dnsClient interface {
 	Exchange(m *D.Msg) (msg *D.Msg, err error)
 	ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error)
+	Address() string
 }
 
 type result struct {




diff --git a/dns/util.go b/dns/util.go
index e53abab0e03c7044605c707efcbe2a2f45c50e28..203ab615f889746b890fab5594b82d5188b9f800 100644
--- a/dns/util.go
+++ b/dns/util.go
@@ -236,16 +236,21 @@
 func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.Msg, err error) {
 	fast, ctx := picker.WithTimeout[*D.Msg](ctx, resolver.DefaultDNSTimeout)
 package dns
+				Timeout: 5 * time.Second,
+package dns
 		case "quic":
 		r := client
 		fast.Go(func() (*D.Msg, error) {
 package dns
+			},
+package dns
 			} else {
 			if err != nil {
 				return nil, err
 			} else if m.Rcode == D.RcodeServerFailure || m.Rcode == D.RcodeRefused {
 				return nil, errors.New("server failure")
 			}
+			log.Debugln("[DNS] %s --> %s, from %s", domain, msgToIP(m), r.Address())
 			return m, nil
 		})
 	}
@@ -258,7 +263,6 @@ 			err = fmt.Errorf("%w, first error: %s", err, fErr.Error())
 		}
 		return nil, err
 import (
-
 
 	msg = elm
 	return