~/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