From 6e037731342e19fdf35ac2d0c594e79cd02ac6e1 Mon Sep 17 00:00:00 2001 From: MetaCubeX Date: Sun, 5 Jun 2022 12:52:29 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4dns=20interface?= =?UTF-8?q?=E4=B8=8Eadapter=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dns/client.go | 15 +++++++++------ dns/doh.go | 14 ++++---------- dns/doq.go | 10 +++------- dns/util.go | 3 --- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/dns/client.go b/dns/client.go index a7df7fe86..14de3091e 100644 --- a/dns/client.go +++ b/dns/client.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "fmt" + "github.com/Dreamacro/clash/tunnel" "go.uber.org/atomic" "net" "net/netip" @@ -55,14 +56,16 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error) } var conn net.Conn - if c.proxyAdapter != "" { - conn, err = dialContextWithProxyAdapter(ctx, c.proxyAdapter, network, ip, c.port, options...) - if err == errProxyNotFound { - options = append(options[:0], dialer.WithInterface(c.proxyAdapter), dialer.WithRoutingMark(0)) + if c.proxyAdapter == "" { + conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip.String(), c.port), options...) + } else { + _, ok := tunnel.Proxies()[c.proxyAdapter] + if ok { + conn, err = dialContextWithProxyAdapter(ctx, c.proxyAdapter, network, ip, c.port, options...) + } else { + options = append(options, dialer.WithInterface(c.proxyAdapter)) conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip.String(), c.port), options...) } - } else { - conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip.String(), c.port), options...) } if err != nil { diff --git a/dns/doh.go b/dns/doh.go index 964b3396e..365022652 100644 --- a/dns/doh.go +++ b/dns/doh.go @@ -97,17 +97,11 @@ func newDoHClient(url string, r *Resolver, proxyAdapter string) *dohClient { return nil, err } - if proxyAdapter != "" { - var conn net.Conn - conn, err = dialContextWithProxyAdapter(ctx, proxyAdapter, "tcp", ip, port) - if err == errProxyNotFound { - options := []dialer.Option{dialer.WithInterface(proxyAdapter), dialer.WithRoutingMark(0)} - conn, err = dialer.DialContext(ctx, "tcp", net.JoinHostPort(ip.String(), port), options...) - } - return conn, err + if proxyAdapter == "" { + return dialer.DialContext(ctx, "tcp", net.JoinHostPort(ip.String(), port)) + } else { + return dialContextWithProxyAdapter(ctx, proxyAdapter, "tcp", ip, port) } - - return dialer.DialContext(ctx, "tcp", net.JoinHostPort(ip.String(), port)) }, }, } diff --git a/dns/doq.go b/dns/doq.go index f0e931f05..7682a21e8 100644 --- a/dns/doq.go +++ b/dns/doq.go @@ -168,19 +168,15 @@ func (dc *quicClient) openSession() (quic.Connection, error) { } } else { conn, err := dialContextWithProxyAdapter(context.Background(), dc.proxyAdapter, "udp", ip, port) - if err == errProxyNotFound { - options := []dialer.Option{dialer.WithInterface(dc.proxyAdapter), dialer.WithRoutingMark(0)} - conn, err = dialContextWithProxyAdapter(context.Background(), dc.proxyAdapter, "udp", ip, port, options...) - if err != nil { - return nil, err - } - } else { + if err != nil { return nil, err } + wrapConn, ok := conn.(*wrapPacketConn) if !ok { return nil, fmt.Errorf("quio create packet failed") } + udp = wrapConn } diff --git a/dns/util.go b/dns/util.go index bbc85bad6..a0ac3d014 100644 --- a/dns/util.go +++ b/dns/util.go @@ -3,7 +3,6 @@ package dns import ( "context" "crypto/tls" - "errors" "fmt" "net" "net/netip" @@ -20,8 +19,6 @@ import ( D "github.com/miekg/dns" ) -var errProxyNotFound = errors.New("proxy adapter not found") - func putMsgToCache(c *cache.LruCache[string, *D.Msg], key string, msg *D.Msg) { var ttl uint32 switch {