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