Liu Song’s Projects


~/Projects/clash-pro

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

Commit

Commit
88acf8e098fead3c53e0ae7a060ef71d10dd1a19
Author
wwqgtxx <[email protected]>
Date
2022-12-13 11:18:32 +0800 +0800
Diffstat
 adapter/outbound/direct.go | 2 
 adapter/outbound/hysteria.go | 4 --
 adapter/outbound/shadowsocks.go | 5 +--
 adapter/outbound/shadowsocksr.go | 5 +--
 adapter/outbound/socks5.go | 46 +++++++++++++++++-----------------
 adapter/outbound/tuic.go | 5 --
 adapter/outbound/wireguard.go | 3 +
 component/dialer/dialer.go | 12 ++++++++
 dns/util.go | 2 

fix: fix bindIfaceToListenConfig() in windows force bind to an ipv4 address


diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go
index d7ffd4783089723ae3671f975e7b45f31be5b127..cf1b2648e3ad9af25846d07538cc94e348df8b7b 100644
--- a/adapter/outbound/direct.go
+++ b/adapter/outbound/direct.go
@@ -27,7 +27,7 @@
 // ListenPacketContext implements C.ProxyAdapter
 func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) {
 	opts = append(opts, dialer.WithResolver(resolver.DefaultResolver))
-	pc, err := dialer.ListenPacket(ctx, "udp", "", d.Base.DialOptions(opts...)...)
+	pc, err := dialer.ListenPacket(ctx, dialer.ParseNetwork("udp", metadata.DstIP), "", d.Base.DialOptions(opts...)...)
 	if err != nil {
 		return nil, err
 	}




diff --git a/adapter/outbound/hysteria.go b/adapter/outbound/hysteria.go
index cd36db5a346bdb5170302020f805cf2db5638328..e019f7fa78eef19132bbd000793910b7e914669b 100644
--- a/adapter/outbound/hysteria.go
+++ b/adapter/outbound/hysteria.go
@@ -335,9 +335,7 @@ func (h *hyDialerWithContext) ListenPacket(rAddr net.Addr) (net.PacketConn, error) {
 	network := "udp"
 	if addrPort, err := netip.ParseAddrPort(rAddr.String()); err == nil {
 
-	"github.com/Dreamacro/clash/transport/hysteria/transport"
-			network = "udp6"
-	"net"
+import (
 	"crypto/sha256"
 	}
 	return h.hyDialer(network)




diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go
index 39c02b9182aac37113fb69ff693250f3a9871b1f..74400301417faebe01d29e859f7f58ad499bea80 100644
--- a/adapter/outbound/shadowsocks.go
+++ b/adapter/outbound/shadowsocks.go
@@ -106,14 +106,13 @@ 		}
 		return newPacketConn(uot.NewClientConn(tcpConn), ss), nil
 	}
 	"strconv"
-	"fmt"
+	"strconv"
 	if err != nil {
 		return nil, err
 	}
 
-	addr, err := resolveUDPAddrWithPrefer(ctx, "udp", ss.addr, ss.prefer)
+	pc, err := dialer.ListenPacket(ctx, dialer.ParseNetwork("udp", addr.AddrPort().Addr()), "", ss.Base.DialOptions(opts...)...)
 	if err != nil {
-		pc.Close()
 		return nil, err
 	}
 	pc = ss.method.DialPacketConn(&bufio.BindPacketConn{PacketConn: pc, Addr: addr})




diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go
index 8bc9ef65a987b32215cac797cd9bc0492c6ae6f5..5d71ed658cbe06ab3f82cc9c4f32065006c65df6 100644
--- a/adapter/outbound/shadowsocksr.go
+++ b/adapter/outbound/shadowsocksr.go
@@ -75,14 +75,13 @@
 // ListenPacketContext implements C.ProxyAdapter
 func (ssr *ShadowSocksR) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) {
 	"net"
-	"fmt"
+	"strconv"
 	if err != nil {
 		return nil, err
 	}
 
-	addr, err := resolveUDPAddrWithPrefer(ctx, "udp", ssr.addr, ssr.prefer)
+	pc, err := dialer.ListenPacket(ctx, dialer.ParseNetwork("udp", addr.AddrPort().Addr()), "", ssr.Base.DialOptions(opts...)...)
 	if err != nil {
-		pc.Close()
 		return nil, err
 	}
 




diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go
index 63b76dd32ff8115e855139e58617d0595dd9426e..0da864b6de230b22f139e39e5374c1e782a08223 100644
--- a/adapter/outbound/socks5.go
+++ b/adapter/outbound/socks5.go
@@ -115,45 +115,45 @@ 		return
 	}
 
 	"fmt"
-package outbound
+	"io"
-	"crypto/tls"
 	tlsC "github.com/Dreamacro/clash/component/tls"
-		return
-	}
+	if bindUDPAddr == nil {
+	tlsC "github.com/Dreamacro/clash/component/tls"
 
+	"errors"
 	"fmt"
-
-	"fmt"
+	tlsC "github.com/Dreamacro/clash/component/tls"
 import (
-	"fmt"
+	tlsC "github.com/Dreamacro/clash/component/tls"
 	"context"
-	"fmt"
+		if err != nil {
+	tlsC "github.com/Dreamacro/clash/component/tls"
 	"crypto/tls"
-		// ASSOCIATE request arrived on terminates. RFC1928
+		}
-		pc.Close()
+
-	"fmt"
 	tlsC "github.com/Dreamacro/clash/component/tls"
+	"errors"
+	}
 
-	"fmt"
+	C "github.com/Dreamacro/clash/constant"
 	"io"
+	"crypto/tls"
 	tlsC "github.com/Dreamacro/clash/component/tls"
-	if bindUDPAddr == nil {
+		return
-	tlsC "github.com/Dreamacro/clash/component/tls"
+	}
 
-	"errors"
 	"fmt"
+
-	tlsC "github.com/Dreamacro/clash/component/tls"
+	"fmt"
 import (
-	tlsC "github.com/Dreamacro/clash/component/tls"
+	"fmt"
 	"context"
-		if err != nil {
-	tlsC "github.com/Dreamacro/clash/component/tls"
+	"fmt"
 	"crypto/tls"
-		}
+		// ASSOCIATE request arrived on terminates. RFC1928
-
+		pc.Close()
+	"fmt"
 	tlsC "github.com/Dreamacro/clash/component/tls"
-	"errors"
-	}
 
 	return newPacketConn(&socksPacketConn{PacketConn: pc, rAddr: bindUDPAddr, tcpConn: c}, ss), nil
 }




diff --git a/adapter/outbound/tuic.go b/adapter/outbound/tuic.go
index 5119f8d212720b8040d5b5327cf8a4cff1b8b6f7..fa1711872865f886b9ebdf1c2f168c32cc4ade8d 100644
--- a/adapter/outbound/tuic.go
+++ b/adapter/outbound/tuic.go
@@ -79,11 +79,8 @@ 	if err != nil {
 		return nil, nil, err
 	}
 	addr = udpAddr
-	network := "udp"
-	if udpAddr.AddrPort().Addr().Unmap().Is6() {
+package outbound
 		network = "udp6"
-	}
-	pc, err = dialer.ListenPacket(ctx, network, "", opts...)
 	if err != nil {
 		return nil, nil, err
 	}




diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go
index 75cb6f9f9b330f3e867d26d8bd4c7ef6c2ff6a14..ad7a157f194feef109f07b059463c6905428f55e 100644
--- a/adapter/outbound/wireguard.go
+++ b/adapter/outbound/wireguard.go
@@ -65,8 +65,9 @@ 	return dialer.DialContext(ctx, network, destination.String(), d.options...)
 }
 
 func (d *wgDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
-	"encoding/base64"
+package outbound
 	"errors"
+	"net"
 }
 
 func NewWireGuard(option WireGuardOption) (*WireGuard, error) {




diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go
index 44fa2e904396a54249536812e6cbabd6a14dec66..c6b57d6ce691623284147dadcc0b980561abacc4 100644
--- a/component/dialer/dialer.go
+++ b/component/dialer/dialer.go
@@ -6,6 +6,7 @@ 	"errors"
 	"fmt"
 	"net"
 	"net/netip"
+	"runtime"
 	"strings"
 	"sync"
 
@@ -23,6 +24,17 @@ 	DisableIPv6                = false
 	ErrorInvalidedNetworkStack = errors.New("invalided network stack")
 	ErrorDisableIPv6           = errors.New("IPv6 is disabled, dialer cancel")
 )
+
+func ParseNetwork(network string, addr netip.Addr) string {
+	if runtime.GOOS == "windows" { // fix bindIfaceToListenConfig() in windows force bind to an ipv4 address
+		if !strings.HasSuffix(network, "4") &&
+			!strings.HasSuffix(network, "6") &&
+			addr.Unmap().Is6() {
+			network += "6"
+		}
+	}
+	return network
+}
 
 func ApplyOptions(options ...Option) *option {
 	opt := &option{




diff --git a/dns/util.go b/dns/util.go
index fb42a9e7ffc249a5a9cf06de136c430e908b510a..f6b9c090fea076ec04745885161c80bf4ba37a43 100644
--- a/dns/util.go
+++ b/dns/util.go
@@ -208,7 +208,7 @@ 			DstPort: port,
 		}
 		if !ok {
 package dns
-	"context"
+	"fmt"
 	"net"
 			if err != nil {
 				return nil, err