From 7cd58fbdf68cc2a390fa3b4c7b4857a253057198 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 2 Dec 2025 23:29:35 +0800 Subject: [PATCH] chore: add DialerForAPI to outbound option for library user --- adapter/outbound/anytls.go | 7 +-- adapter/outbound/base.go | 16 +++++++ adapter/outbound/http.go | 26 +++-------- adapter/outbound/hysteria.go | 12 +---- adapter/outbound/hysteria2.go | 7 +-- adapter/outbound/mieru.go | 15 ++----- adapter/outbound/shadowsocks.go | 45 ++++--------------- adapter/outbound/shadowsocksr.go | 41 +++-------------- adapter/outbound/singmux.go | 5 +-- adapter/outbound/snell.go | 44 ++---------------- adapter/outbound/socks5.go | 37 +++------------ adapter/outbound/ssh.go | 17 ++----- adapter/outbound/sudoku.go | 32 +++---------- adapter/outbound/trojan.go | 44 ++---------------- adapter/outbound/tuic.go | 12 +---- adapter/outbound/vless.go | 44 ++---------------- adapter/outbound/vmess.go | 44 ++---------------- adapter/outbound/wireguard.go | 7 ++- component/proxydialer/byname.go | 37 +++++++++++++++ component/proxydialer/proxydialer.go | 15 +------ component/proxydialer/sing.go | 67 ++++------------------------ ntp/ntp/service.go | 7 ++- 22 files changed, 140 insertions(+), 441 deletions(-) create mode 100644 component/proxydialer/byname.go diff --git a/adapter/outbound/anytls.go b/adapter/outbound/anytls.go index 78b1e40c..5ba7c6d2 100644 --- a/adapter/outbound/anytls.go +++ b/adapter/outbound/anytls.go @@ -7,7 +7,6 @@ import ( "time" CN "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/anytls" @@ -20,7 +19,6 @@ import ( type AnyTLS struct { *Base client *anytls.Client - dialer proxydialer.SingDialer option *AnyTLSOption } @@ -101,9 +99,8 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) { }, option: &option, } - - singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)) - outbound.dialer = singDialer + outbound.dialer = option.NewDialer(outbound.DialOptions()) + singDialer := proxydialer.NewSingDialer(outbound.dialer) tOption := anytls.ClientConfig{ Password: option.Password, diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 9e5112c6..a3408f70 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -12,6 +12,7 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/dialer" + "github.com/metacubex/mihomo/component/proxydialer" "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -35,6 +36,7 @@ type Base struct { rmark int id string prefer C.DNSPrefer + dialer C.Dialer } // Name implements C.ProxyAdapter @@ -164,6 +166,20 @@ type BasicOption struct { RoutingMark int `proxy:"routing-mark,omitempty"` IPVersion string `proxy:"ip-version,omitempty"` DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy + + DialerForAPI C.Dialer `proxy:"-"` // the dialer used for API usage has higher priority than all the above configurations. +} + +func (b *BasicOption) NewDialer(opts []dialer.Option) C.Dialer { + cDialer := b.DialerForAPI + if cDialer == nil { + if b.DialerProxy != "" { + cDialer = proxydialer.NewByName(b.DialerProxy) + } else { + cDialer = dialer.NewDialer(opts...) + } + } + return cDialer } type BaseOption struct { diff --git a/adapter/outbound/http.go b/adapter/outbound/http.go index 7b898e2e..61b8596a 100644 --- a/adapter/outbound/http.go +++ b/adapter/outbound/http.go @@ -13,8 +13,6 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" ) @@ -61,18 +59,7 @@ func (h *Http) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Me // DialContext implements C.ProxyAdapter func (h *Http) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { - return h.DialContextWithDialer(ctx, dialer.NewDialer(h.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (h *Http) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(h.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(h.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", h.addr) + c, err := h.dialer.DialContext(ctx, "tcp", h.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", h.addr, err) } @@ -89,11 +76,6 @@ func (h *Http) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metad return NewConn(c, h), nil } -// SupportWithDialer implements C.ProxyAdapter -func (h *Http) SupportWithDialer() C.NetWork { - return C.TCP -} - // ProxyInfo implements C.ProxyAdapter func (h *Http) ProxyInfo() C.ProxyInfo { info := h.Base.ProxyInfo() @@ -183,7 +165,7 @@ func NewHttp(option HttpOption) (*Http, error) { } } - return &Http{ + outbound := &Http{ Base: &Base{ name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), @@ -198,5 +180,7 @@ func NewHttp(option HttpOption) (*Http, error) { pass: option.Password, tlsConfig: tlsConfig, option: &option, - }, nil + } + outbound.dialer = option.NewDialer(outbound.DialOptions()) + return outbound, nil } diff --git a/adapter/outbound/hysteria.go b/adapter/outbound/hysteria.go index 9ba118f3..46737798 100644 --- a/adapter/outbound/hysteria.go +++ b/adapter/outbound/hysteria.go @@ -13,7 +13,6 @@ import ( "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -74,16 +73,8 @@ func (h *Hysteria) genHdc(ctx context.Context) utils.PacketDialer { return &hyDialerWithContext{ ctx: context.Background(), hyDialer: func(network string, rAddr net.Addr) (net.PacketConn, error) { - var err error - var cDialer C.Dialer = dialer.NewDialer(h.DialOptions()...) - if len(h.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(h.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } rAddrPort, _ := netip.ParseAddrPort(rAddr.String()) - return cDialer.ListenPacket(ctx, network, "", rAddrPort) + return h.dialer.ListenPacket(ctx, network, "", rAddrPort) }, remoteAddr: func(addr string) (net.Addr, error) { udpAddr, err := resolveUDPAddr(ctx, "udp", addr, h.prefer) @@ -263,6 +254,7 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) { tlsConfig: tlsClientConfig, echConfig: echConfig, } + outbound.dialer = option.NewDialer(outbound.DialOptions()) return outbound, nil } diff --git a/adapter/outbound/hysteria2.go b/adapter/outbound/hysteria2.go index bc203366..78d2b9ff 100644 --- a/adapter/outbound/hysteria2.go +++ b/adapter/outbound/hysteria2.go @@ -12,7 +12,6 @@ import ( CN "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" @@ -36,7 +35,6 @@ type Hysteria2 struct { option *Hysteria2Option client *hysteria2.Client - dialer proxydialer.SingDialer } type Hysteria2Option struct { @@ -119,9 +117,8 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { }, option: &option, } - - singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)) - outbound.dialer = singDialer + outbound.dialer = option.NewDialer(outbound.DialOptions()) + singDialer := proxydialer.NewSingDialer(outbound.dialer) var salamanderPassword string if len(option.Obfs) > 0 { diff --git a/adapter/outbound/mieru.go b/adapter/outbound/mieru.go index e09b1898..5a2db630 100644 --- a/adapter/outbound/mieru.go +++ b/adapter/outbound/mieru.go @@ -9,8 +9,6 @@ import ( "sync" CN "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" @@ -130,20 +128,12 @@ func (m *Mieru) ensureClientIsRunning() error { } // Create a dialer and add it to the client config, before starting the client. - var dialer C.Dialer = dialer.NewDialer(m.DialOptions()...) - var err error - if len(m.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(m.option.DialerProxy, dialer) - if err != nil { - return err - } - } config, err := m.client.Load() if err != nil { return err } - config.Dialer = dialer - config.PacketDialer = mieruPacketDialer{Dialer: dialer} + config.Dialer = m.dialer + config.PacketDialer = mieruPacketDialer{Dialer: m.dialer} config.Resolver = mieruDNSResolver{prefer: m.prefer} if err := m.client.Store(config); err != nil { return err @@ -187,6 +177,7 @@ func NewMieru(option MieruOption) (*Mieru, error) { option: &option, client: c, } + outbound.dialer = option.NewDialer(outbound.DialOptions()) return outbound, nil } diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go index c6cfa914..0ece8151 100644 --- a/adapter/outbound/shadowsocks.go +++ b/adapter/outbound/shadowsocks.go @@ -8,8 +8,6 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/structure" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/ntp" gost "github.com/metacubex/mihomo/transport/gost-plugin" @@ -191,17 +189,6 @@ func (ss *ShadowSocks) StreamConnContext(ctx context.Context, c net.Conn, metada // DialContext implements C.ProxyAdapter func (ss *ShadowSocks) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { - return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(ss.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(ss.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } var c net.Conn if ss.kcptunClient != nil { c, err = ss.kcptunClient.OpenStream(ctx, func(ctx context.Context) (net.PacketConn, net.Addr, error) { @@ -213,7 +200,7 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale return nil, nil, err } - pc, err := dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) + pc, err := ss.dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) if err != nil { return nil, nil, err } @@ -221,7 +208,7 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale return pc, addr, nil }) } else { - c, err = dialer.DialContext(ctx, "tcp", ss.addr) + c, err = ss.dialer.DialContext(ctx, "tcp", ss.addr) } if err != nil { return nil, fmt.Errorf("%s connect error: %w", ss.addr, err) @@ -237,25 +224,14 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale // ListenPacketContext implements C.ProxyAdapter func (ss *ShadowSocks) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { - return ss.ListenPacketWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (ss *ShadowSocks) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.PacketConn, err error) { if ss.option.UDPOverTCP { - tcpConn, err := ss.DialContextWithDialer(ctx, dialer, metadata) + tcpConn, err := ss.DialContext(ctx, metadata) if err != nil { return nil, err } return ss.ListenPacketOnStreamConn(ctx, tcpConn, metadata) } - if len(ss.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(ss.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - if err = ss.ResolveUDP(ctx, metadata); err != nil { + if err := ss.ResolveUDP(ctx, metadata); err != nil { return nil, err } addr, err := resolveUDPAddr(ctx, "udp", ss.addr, ss.prefer) @@ -263,7 +239,7 @@ func (ss *ShadowSocks) ListenPacketWithDialer(ctx context.Context, dialer C.Dial return nil, err } - pc, err := dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) + pc, err := ss.dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) if err != nil { return nil, err } @@ -271,11 +247,6 @@ func (ss *ShadowSocks) ListenPacketWithDialer(ctx context.Context, dialer C.Dial return newPacketConn(pc, ss), nil } -// SupportWithDialer implements C.ProxyAdapter -func (ss *ShadowSocks) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // ProxyInfo implements C.ProxyAdapter func (ss *ShadowSocks) ProxyInfo() C.ProxyInfo { info := ss.Base.ProxyInfo() @@ -482,7 +453,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { return nil, fmt.Errorf("ss %s unknown udp over tcp protocol version: %d", addr, option.UDPOverTCPVersion) } - return &ShadowSocks{ + outbound := &ShadowSocks{ Base: &Base{ name: option.Name, addr: addr, @@ -504,5 +475,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { shadowTLSOption: shadowTLSOpt, restlsConfig: restlsConfig, kcptunClient: kcptunClient, - }, nil + } + outbound.dialer = option.NewDialer(outbound.DialOptions()) + return outbound, nil } diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go index efc368a4..8eecf677 100644 --- a/adapter/outbound/shadowsocksr.go +++ b/adapter/outbound/shadowsocksr.go @@ -8,8 +8,6 @@ import ( "strconv" N "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/shadowsocks/core" "github.com/metacubex/mihomo/transport/shadowsocks/shadowaead" @@ -68,18 +66,7 @@ func (ssr *ShadowSocksR) StreamConnContext(ctx context.Context, c net.Conn, meta // DialContext implements C.ProxyAdapter func (ssr *ShadowSocksR) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { - return ssr.DialContextWithDialer(ctx, dialer.NewDialer(ssr.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (ssr *ShadowSocksR) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(ssr.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(ssr.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", ssr.addr) + c, err := ssr.dialer.DialContext(ctx, "tcp", ssr.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", ssr.addr, err) } @@ -94,18 +81,7 @@ func (ssr *ShadowSocksR) DialContextWithDialer(ctx context.Context, dialer C.Dia // ListenPacketContext implements C.ProxyAdapter func (ssr *ShadowSocksR) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { - return ssr.ListenPacketWithDialer(ctx, dialer.NewDialer(ssr.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (ssr *ShadowSocksR) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.PacketConn, err error) { - if len(ssr.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(ssr.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - if err = ssr.ResolveUDP(ctx, metadata); err != nil { + if err := ssr.ResolveUDP(ctx, metadata); err != nil { return nil, err } addr, err := resolveUDPAddr(ctx, "udp", ssr.addr, ssr.prefer) @@ -113,7 +89,7 @@ func (ssr *ShadowSocksR) ListenPacketWithDialer(ctx context.Context, dialer C.Di return nil, err } - pc, err := dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) + pc, err := ssr.dialer.ListenPacket(ctx, "udp", "", addr.AddrPort()) if err != nil { return nil, err } @@ -123,11 +99,6 @@ func (ssr *ShadowSocksR) ListenPacketWithDialer(ctx context.Context, dialer C.Di return newPacketConn(&ssrPacketConn{EnhancePacketConn: epc, rAddr: addr}, ssr), nil } -// SupportWithDialer implements C.ProxyAdapter -func (ssr *ShadowSocksR) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // ProxyInfo implements C.ProxyAdapter func (ssr *ShadowSocksR) ProxyInfo() C.ProxyInfo { info := ssr.Base.ProxyInfo() @@ -186,7 +157,7 @@ func NewShadowSocksR(option ShadowSocksROption) (*ShadowSocksR, error) { return nil, fmt.Errorf("ssr %s initialize protocol error: %w", addr, err) } - return &ShadowSocksR{ + outbound := &ShadowSocksR{ Base: &Base{ name: option.Name, addr: addr, @@ -202,7 +173,9 @@ func NewShadowSocksR(option ShadowSocksROption) (*ShadowSocksR, error) { cipher: coreCiph, obfs: obfs, protocol: protocol, - }, nil + } + outbound.dialer = option.NewDialer(outbound.DialOptions()) + return outbound, nil } type ssrPacketConn struct { diff --git a/adapter/outbound/singmux.go b/adapter/outbound/singmux.go index cd9ec904..310e3b61 100644 --- a/adapter/outbound/singmux.go +++ b/adapter/outbound/singmux.go @@ -4,7 +4,6 @@ import ( "context" CN "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -17,7 +16,6 @@ import ( type SingMux struct { ProxyAdapter client *mux.Client - dialer proxydialer.SingDialer onlyTcp bool } @@ -96,7 +94,7 @@ func NewSingMux(option SingMuxOption, proxy ProxyAdapter) (ProxyAdapter, error) // TODO // "TCP Brutal is only supported on Linux-based systems" - singDialer := proxydialer.NewSingDialer(proxy, dialer.NewDialer(proxy.DialOptions()...), option.Statistic) + singDialer := proxydialer.NewSingDialer(proxydialer.New(proxy, option.Statistic)) client, err := mux.NewClient(mux.Options{ Dialer: singDialer, Logger: log.SingLogger, @@ -117,7 +115,6 @@ func NewSingMux(option SingMuxOption, proxy ProxyAdapter) (ProxyAdapter, error) outbound := &SingMux{ ProxyAdapter: proxy, client: client, - dialer: singDialer, onlyTcp: option.OnlyTcp, } return outbound, nil diff --git a/adapter/outbound/snell.go b/adapter/outbound/snell.go index ef3603e6..0c7d8876 100644 --- a/adapter/outbound/snell.go +++ b/adapter/outbound/snell.go @@ -8,8 +8,6 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/structure" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" obfs "github.com/metacubex/mihomo/transport/simple-obfs" "github.com/metacubex/mihomo/transport/snell" @@ -89,18 +87,7 @@ func (s *Snell) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn return NewConn(c, s), err } - return s.DialContextWithDialer(ctx, dialer.NewDialer(s.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (s *Snell) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(s.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(s.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", s.addr) + c, err := s.dialer.DialContext(ctx, "tcp", s.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", s.addr, err) } @@ -115,22 +102,11 @@ func (s *Snell) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta // ListenPacketContext implements C.ProxyAdapter func (s *Snell) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { - return s.ListenPacketWithDialer(ctx, dialer.NewDialer(s.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (s *Snell) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (C.PacketConn, error) { var err error - if len(s.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(s.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } if err = s.ResolveUDP(ctx, metadata); err != nil { return nil, err } - c, err := dialer.DialContext(ctx, "tcp", s.addr) + c, err := s.dialer.DialContext(ctx, "tcp", s.addr) if err != nil { return nil, err } @@ -141,11 +117,6 @@ func (s *Snell) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met return newPacketConn(pc, s), nil } -// SupportWithDialer implements C.ProxyAdapter -func (s *Snell) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // SupportUOT implements C.ProxyAdapter func (s *Snell) SupportUOT() bool { return true @@ -206,18 +177,11 @@ func NewSnell(option SnellOption) (*Snell, error) { obfsOption: obfsOption, version: option.Version, } + s.dialer = option.NewDialer(s.DialOptions()) if option.Version == snell.Version2 { s.pool = snell.NewPool(func(ctx context.Context) (*snell.Snell, error) { - var err error - var cDialer C.Dialer = dialer.NewDialer(s.DialOptions()...) - if len(s.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(s.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } - c, err := cDialer.DialContext(ctx, "tcp", addr) + c, err := s.dialer.DialContext(ctx, "tcp", addr) if err != nil { return nil, err } diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go index 00e096c3..3bc48d86 100644 --- a/adapter/outbound/socks5.go +++ b/adapter/outbound/socks5.go @@ -12,8 +12,6 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/socks5" ) @@ -69,18 +67,7 @@ func (ss *Socks5) StreamConnContext(ctx context.Context, c net.Conn, metadata *C // DialContext implements C.ProxyAdapter func (ss *Socks5) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { - return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (ss *Socks5) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(ss.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(ss.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", ss.addr) + c, err := ss.dialer.DialContext(ctx, "tcp", ss.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", ss.addr, err) } @@ -97,24 +84,12 @@ func (ss *Socks5) DialContextWithDialer(ctx context.Context, dialer C.Dialer, me return NewConn(c, ss), nil } -// SupportWithDialer implements C.ProxyAdapter -func (ss *Socks5) SupportWithDialer() C.NetWork { - return C.TCP -} - // ListenPacketContext implements C.ProxyAdapter func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { - var cDialer C.Dialer = dialer.NewDialer(ss.DialOptions()...) - if len(ss.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(ss.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } if err = ss.ResolveUDP(ctx, metadata); err != nil { return nil, err } - c, err := cDialer.DialContext(ctx, "tcp", ss.addr) + c, err := ss.dialer.DialContext(ctx, "tcp", ss.addr) if err != nil { err = fmt.Errorf("%s connect error: %w", ss.addr, err) return @@ -161,7 +136,7 @@ func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata) bindUDPAddr.IP = serverAddr.IP } - pc, err := cDialer.ListenPacket(ctx, "udp", "", bindUDPAddr.AddrPort()) + pc, err := ss.dialer.ListenPacket(ctx, "udp", "", bindUDPAddr.AddrPort()) if err != nil { return } @@ -210,7 +185,7 @@ func NewSocks5(option Socks5Option) (*Socks5, error) { } } - return &Socks5{ + outbound := &Socks5{ Base: &Base{ name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), @@ -228,7 +203,9 @@ func NewSocks5(option Socks5Option) (*Socks5, error) { tls: option.TLS, skipCertVerify: option.SkipCertVerify, tlsConfig: tlsConfig, - }, nil + } + outbound.dialer = option.NewDialer(outbound.DialOptions()) + return outbound, nil } type socksPacketConn struct { diff --git a/adapter/outbound/ssh.go b/adapter/outbound/ssh.go index 3b915147..ec9068dd 100644 --- a/adapter/outbound/ssh.go +++ b/adapter/outbound/ssh.go @@ -12,8 +12,6 @@ import ( "sync" N "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/randv2" @@ -44,14 +42,7 @@ type SshOption struct { } func (s *Ssh) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { - var cDialer C.Dialer = dialer.NewDialer(s.DialOptions()...) - if len(s.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(s.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } - client, err := s.connect(ctx, cDialer, s.addr) + client, err := s.connect(ctx, s.addr) if err != nil { return nil, err } @@ -63,13 +54,13 @@ func (s *Ssh) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, return NewConn(c, s), nil } -func (s *Ssh) connect(ctx context.Context, cDialer C.Dialer, addr string) (client *ssh.Client, err error) { +func (s *Ssh) connect(ctx context.Context, addr string) (client *ssh.Client, err error) { s.cMutex.Lock() defer s.cMutex.Unlock() if s.client != nil { return s.client, nil } - c, err := cDialer.DialContext(ctx, "tcp", addr) + c, err := s.dialer.DialContext(ctx, "tcp", addr) if err != nil { return nil, err } @@ -203,6 +194,6 @@ func NewSsh(option SshOption) (*Ssh, error) { option: &option, config: &config, } - + outbound.dialer = option.NewDialer(outbound.DialOptions()) return outbound, nil } diff --git a/adapter/outbound/sudoku.go b/adapter/outbound/sudoku.go index 9b4a9c9d..48d04258 100644 --- a/adapter/outbound/sudoku.go +++ b/adapter/outbound/sudoku.go @@ -11,17 +11,14 @@ import ( "strings" "time" - "github.com/metacubex/mihomo/log" - "github.com/saba-futai/sudoku/apis" "github.com/saba-futai/sudoku/pkg/crypto" "github.com/saba-futai/sudoku/pkg/obfs/httpmask" "github.com/saba-futai/sudoku/pkg/obfs/sudoku" N "github.com/metacubex/mihomo/common/net" - "github.com/metacubex/mihomo/component/dialer" - "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" + "github.com/metacubex/mihomo/log" ) type Sudoku struct { @@ -45,25 +42,13 @@ type SudokuOption struct { } // DialContext implements C.ProxyAdapter -func (s *Sudoku) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { - return s.DialContextWithDialer(ctx, dialer.NewDialer(s.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (s *Sudoku) DialContextWithDialer(ctx context.Context, d C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(s.option.DialerProxy) > 0 { - d, err = proxydialer.NewByName(s.option.DialerProxy, d) - if err != nil { - return nil, err - } - } - +func (s *Sudoku) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { cfg, err := s.buildConfig(metadata) if err != nil { return nil, err } - c, err := d.DialContext(ctx, "tcp", s.addr) + c, err := s.dialer.DialContext(ctx, "tcp", s.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", s.addr, err) } @@ -95,11 +80,6 @@ func (s *Sudoku) SupportUOT() bool { return false // Sudoku protocol only supports TCP } -// SupportWithDialer implements C.ProxyAdapter -func (s *Sudoku) SupportWithDialer() C.NetWork { - return C.TCP -} - // ProxyInfo implements C.ProxyAdapter func (s *Sudoku) ProxyInfo() C.ProxyInfo { info := s.Base.ProxyInfo() @@ -206,7 +186,7 @@ func NewSudoku(option SudokuOption) (*Sudoku, error) { baseConf.AEADMethod = option.AEADMethod } - return &Sudoku{ + outbound := &Sudoku{ Base: &Base{ name: option.Name, addr: baseConf.ServerAddress, @@ -221,7 +201,9 @@ func NewSudoku(option SudokuOption) (*Sudoku, error) { option: &option, table: table, baseConf: baseConf, - }, nil + } + outbound.dialer = option.NewDialer(outbound.DialOptions()) + return outbound, nil } func buildSudokuHandshakePayload(key string) [16]byte { diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index 5e0de39c..d2f7f38a 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -11,9 +11,7 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/gun" @@ -196,18 +194,7 @@ func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Con return NewConn(c, t), nil } - return t.DialContextWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (t *Trojan) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(t.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(t.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", t.addr) + c, err = t.dialer.DialContext(ctx, "tcp", t.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } @@ -250,21 +237,10 @@ func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata) pc := trojan.NewPacketConn(c) return newPacketConn(pc, t), err } - return t.ListenPacketWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (t *Trojan) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.PacketConn, err error) { - if len(t.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(t.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } if err = t.ResolveUDP(ctx, metadata); err != nil { return nil, err } - c, err := dialer.DialContext(ctx, "tcp", t.addr) + c, err = t.dialer.DialContext(ctx, "tcp", t.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } @@ -280,11 +256,6 @@ func (t *Trojan) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, me return newPacketConn(pc, t), err } -// SupportWithDialer implements C.ProxyAdapter -func (t *Trojan) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // SupportUOT implements C.ProxyAdapter func (t *Trojan) SupportUOT() bool { return true @@ -327,6 +298,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { option: &option, hexPassword: trojan.Key(option.Password), } + t.dialer = option.NewDialer(t.DialOptions()) var err error t.realityConfig, err = option.RealityOpts.Parse() @@ -355,15 +327,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { if option.Network == "grpc" { dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { - var err error - var cDialer C.Dialer = dialer.NewDialer(t.DialOptions()...) - if len(t.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(t.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } - c, err := cDialer.DialContext(ctx, "tcp", t.addr) + c, err := t.dialer.DialContext(ctx, "tcp", t.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", t.addr, err.Error()) } diff --git a/adapter/outbound/tuic.go b/adapter/outbound/tuic.go index d436ee96..8070359e 100644 --- a/adapter/outbound/tuic.go +++ b/adapter/outbound/tuic.go @@ -10,9 +10,7 @@ import ( "time" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/tuic" @@ -110,13 +108,6 @@ func (t *Tuic) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ } func (t *Tuic) dial(ctx context.Context) (transport *quic.Transport, addr net.Addr, err error) { - var cDialer C.Dialer = dialer.NewDialer(t.DialOptions()...) - if len(t.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(t.option.DialerProxy, cDialer) - if err != nil { - return nil, nil, err - } - } udpAddr, err := resolveUDPAddr(ctx, "udp", t.addr, t.prefer) if err != nil { return nil, nil, err @@ -127,7 +118,7 @@ func (t *Tuic) dial(ctx context.Context) (transport *quic.Transport, addr net.Ad } addr = udpAddr var pc net.PacketConn - pc, err = cDialer.ListenPacket(ctx, "udp", "", udpAddr.AddrPort()) + pc, err = t.dialer.ListenPacket(ctx, "udp", "", udpAddr.AddrPort()) if err != nil { return nil, nil, err } @@ -271,6 +262,7 @@ func NewTuic(option TuicOption) (*Tuic, error) { tlsConfig: tlsClientConfig, echConfig: echConfig, } + t.dialer = option.NewDialer(t.DialOptions()) clientMaxOpenStreams := int64(option.MaxOpenStreams) diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go index 00e46fdd..d6301076 100644 --- a/adapter/outbound/vless.go +++ b/adapter/outbound/vless.go @@ -12,9 +12,7 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/gun" @@ -252,18 +250,7 @@ func (v *Vless) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn return NewConn(c, v), nil } - return v.DialContextWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (v *Vless) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(v.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(v.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", v.addr) + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -301,23 +288,12 @@ func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata) ( return v.ListenPacketOnStreamConn(ctx, c, metadata) } - return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (v *Vless) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.PacketConn, err error) { - if len(v.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(v.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } if err = v.ResolveUDP(ctx, metadata); err != nil { return nil, err } - c, err := dialer.DialContext(ctx, "tcp", v.addr) + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -333,11 +309,6 @@ func (v *Vless) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met return v.ListenPacketOnStreamConn(ctx, c, metadata) } -// SupportWithDialer implements C.ProxyAdapter -func (v *Vless) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // ListenPacketOnStreamConn implements C.ProxyAdapter func (v *Vless) ListenPacketOnStreamConn(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ C.PacketConn, err error) { if err = v.ResolveUDP(ctx, metadata); err != nil { @@ -457,6 +428,7 @@ func NewVless(option VlessOption) (*Vless, error) { client: client, option: &option, } + v.dialer = option.NewDialer(v.DialOptions()) v.encryption, err = encryption.NewClient(option.Encryption) if err != nil { @@ -480,15 +452,7 @@ func NewVless(option VlessOption) (*Vless, error) { } case "grpc": dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { - var err error - var cDialer C.Dialer = dialer.NewDialer(v.DialOptions()...) - if len(v.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(v.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } - c, err := cDialer.DialContext(ctx, "tcp", v.addr) + c, err := v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go index c4badf99..7af32c6d 100644 --- a/adapter/outbound/vmess.go +++ b/adapter/outbound/vmess.go @@ -14,9 +14,7 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/proxydialer" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/ntp" @@ -313,18 +311,7 @@ func (v *Vmess) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn return NewConn(c, v), nil } - return v.DialContextWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) -} - -// DialContextWithDialer implements C.ProxyAdapter -func (v *Vmess) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.Conn, err error) { - if len(v.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(v.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } - c, err := dialer.DialContext(ctx, "tcp", v.addr) + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -358,23 +345,12 @@ func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata) ( } return v.ListenPacketOnStreamConn(ctx, c, metadata) } - return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) -} - -// ListenPacketWithDialer implements C.ProxyAdapter -func (v *Vmess) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, metadata *C.Metadata) (_ C.PacketConn, err error) { - if len(v.option.DialerProxy) > 0 { - dialer, err = proxydialer.NewByName(v.option.DialerProxy, dialer) - if err != nil { - return nil, err - } - } if err = v.ResolveUDP(ctx, metadata); err != nil { return nil, err } - c, err := dialer.DialContext(ctx, "tcp", v.addr) + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -389,11 +365,6 @@ func (v *Vmess) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met return v.ListenPacketOnStreamConn(ctx, c, metadata) } -// SupportWithDialer implements C.ProxyAdapter -func (v *Vmess) SupportWithDialer() C.NetWork { - return C.ALLNet -} - // ProxyInfo implements C.ProxyAdapter func (v *Vmess) ProxyInfo() C.ProxyInfo { info := v.Base.ProxyInfo() @@ -467,6 +438,7 @@ func NewVmess(option VmessOption) (*Vmess, error) { client: client, option: &option, } + v.dialer = option.NewDialer(v.DialOptions()) v.realityConfig, err = v.option.RealityOpts.Parse() if err != nil { @@ -485,15 +457,7 @@ func NewVmess(option VmessOption) (*Vmess, error) { } case "grpc": dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { - var err error - var cDialer C.Dialer = dialer.NewDialer(v.DialOptions()...) - if len(v.option.DialerProxy) > 0 { - cDialer, err = proxydialer.NewByName(v.option.DialerProxy, cDialer) - if err != nil { - return nil, err - } - } - c, err := cDialer.DialContext(ctx, "tcp", v.addr) + c, err := v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index ba6e99ee..66d46b02 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -40,7 +40,6 @@ type WireGuard struct { bind *wireguard.ClientBind device wireguardGoDevice tunDevice wireguard.Device - dialer proxydialer.SingDialer resolver resolver.Resolver initOk atomic.Bool @@ -177,8 +176,8 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) { prefer: C.NewDNSPrefer(option.IPVersion), }, } - singDialer := proxydialer.NewSlowDownSingDialer(proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)), slowdown.New()) - outbound.dialer = singDialer + outbound.dialer = option.NewDialer(outbound.DialOptions()) + singDialer := proxydialer.NewSlowDownSingDialer(proxydialer.NewSingDialer(outbound.dialer), slowdown.New()) var reserved [3]uint8 if len(option.Reserved) > 0 { @@ -196,7 +195,7 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) { outbound.connectAddr = option.Addr() } } - outbound.bind = wireguard.NewClientBind(context.Background(), wgSingErrorHandler{outbound.Name()}, outbound.dialer, isConnect, outbound.connectAddr.AddrPort(), reserved) + outbound.bind = wireguard.NewClientBind(context.Background(), wgSingErrorHandler{outbound.Name()}, singDialer, isConnect, outbound.connectAddr.AddrPort(), reserved) var err error outbound.localPrefixes, err = option.Prefixes() diff --git a/component/proxydialer/byname.go b/component/proxydialer/byname.go new file mode 100644 index 00000000..30ade063 --- /dev/null +++ b/component/proxydialer/byname.go @@ -0,0 +1,37 @@ +package proxydialer + +import ( + "context" + "fmt" + "net" + "net/netip" + + C "github.com/metacubex/mihomo/constant" + "github.com/metacubex/mihomo/tunnel" +) + +type byNameProxyDialer struct { + proxyName string +} + +func (d byNameProxyDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + proxies := tunnel.Proxies() + proxy, ok := proxies[d.proxyName] + if !ok { + return nil, fmt.Errorf("proxyName[%s] not found", d.proxyName) + } + return New(proxy, true).DialContext(ctx, network, address) +} + +func (d byNameProxyDialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) { + proxies := tunnel.Proxies() + proxy, ok := proxies[d.proxyName] + if !ok { + return nil, fmt.Errorf("proxyName[%s] not found", d.proxyName) + } + return New(proxy, true).ListenPacket(ctx, network, address, rAddrPort) +} + +func NewByName(proxyName string) C.Dialer { + return byNameProxyDialer{proxyName: proxyName} +} diff --git a/component/proxydialer/proxydialer.go b/component/proxydialer/proxydialer.go index fa574cec..51275038 100644 --- a/component/proxydialer/proxydialer.go +++ b/component/proxydialer/proxydialer.go @@ -2,33 +2,22 @@ package proxydialer import ( "context" - "fmt" "net" "net/netip" "strings" N "github.com/metacubex/mihomo/common/net" C "github.com/metacubex/mihomo/constant" - "github.com/metacubex/mihomo/tunnel" "github.com/metacubex/mihomo/tunnel/statistic" ) type proxyDialer struct { proxy C.ProxyAdapter - dialer C.Dialer statistic bool } -func New(proxy C.ProxyAdapter, dialer C.Dialer, statistic bool) C.Dialer { - return proxyDialer{proxy: proxy, dialer: dialer, statistic: statistic} -} - -func NewByName(proxyName string, dialer C.Dialer) (C.Dialer, error) { - proxies := tunnel.Proxies() - if proxy, ok := proxies[proxyName]; ok { - return New(proxy, dialer, true), nil - } - return nil, fmt.Errorf("proxyName[%s] not found", proxyName) +func New(proxy C.ProxyAdapter, statistic bool) C.Dialer { + return proxyDialer{proxy: proxy, statistic: statistic} } func (p proxyDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { diff --git a/component/proxydialer/sing.go b/component/proxydialer/sing.go index 51d685e8..9f332465 100644 --- a/component/proxydialer/sing.go +++ b/component/proxydialer/sing.go @@ -12,71 +12,22 @@ import ( type SingDialer interface { N.Dialer - SetDialer(dialer C.Dialer) } -type singDialer proxyDialer +type singDialer struct { + cDialer C.Dialer +} var _ N.Dialer = (*singDialer)(nil) -func (d *singDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { - return (*proxyDialer)(d).DialContext(ctx, network, destination.String()) +func (d singDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { + return d.cDialer.DialContext(ctx, network, destination.String()) } -func (d *singDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) { - return (*proxyDialer)(d).ListenPacket(ctx, "udp", "", destination.AddrPort()) +func (d singDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) { + return d.cDialer.ListenPacket(ctx, "udp", "", destination.AddrPort()) } -func (d *singDialer) SetDialer(dialer C.Dialer) { - (*proxyDialer)(d).dialer = dialer -} - -func NewSingDialer(proxy C.ProxyAdapter, dialer C.Dialer, statistic bool) SingDialer { - return (*singDialer)(&proxyDialer{ - proxy: proxy, - dialer: dialer, - statistic: statistic, - }) -} - -type byNameSingDialer struct { - dialer C.Dialer - proxyName string -} - -var _ N.Dialer = (*byNameSingDialer)(nil) - -func (d *byNameSingDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { - var cDialer C.Dialer = d.dialer - if len(d.proxyName) > 0 { - pd, err := NewByName(d.proxyName, d.dialer) - if err != nil { - return nil, err - } - cDialer = pd - } - return cDialer.DialContext(ctx, network, destination.String()) -} - -func (d *byNameSingDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) { - var cDialer C.Dialer = d.dialer - if len(d.proxyName) > 0 { - pd, err := NewByName(d.proxyName, d.dialer) - if err != nil { - return nil, err - } - cDialer = pd - } - return cDialer.ListenPacket(ctx, "udp", "", destination.AddrPort()) -} - -func (d *byNameSingDialer) SetDialer(dialer C.Dialer) { - d.dialer = dialer -} - -func NewByNameSingDialer(proxyName string, dialer C.Dialer) SingDialer { - return &byNameSingDialer{ - dialer: dialer, - proxyName: proxyName, - } +func NewSingDialer(cDialer C.Dialer) SingDialer { + return singDialer{cDialer: cDialer} } diff --git a/ntp/ntp/service.go b/ntp/ntp/service.go index 8f27d0aa..97918548 100644 --- a/ntp/ntp/service.go +++ b/ntp/ntp/service.go @@ -7,6 +7,7 @@ import ( "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/proxydialer" + C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" mihomoNtp "github.com/metacubex/mihomo/ntp" @@ -36,9 +37,13 @@ func ReCreateNTPService(server string, interval time.Duration, dialerProxy strin return } ctx, cancel := context.WithCancel(context.Background()) + var cDialer C.Dialer = dialer.NewDialer() + if dialerProxy != "" { + cDialer = proxydialer.NewByName(dialerProxy) + } globalSrv = &Service{ server: M.ParseSocksaddr(server), - dialer: proxydialer.NewByNameSingDialer(dialerProxy, dialer.NewDialer()), + dialer: proxydialer.NewSingDialer(cDialer), ticker: time.NewTicker(interval * time.Minute), ctx: ctx, cancel: cancel,