diff --git a/dns/client.go b/dns/client.go index a7df7fe8..14de3091 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 964b3396..36502265 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 f0e931f0..7682a21e 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 bbc85bad..a0ac3d01 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 {