diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 188af6e1..bbac4e80 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -210,7 +210,7 @@ func (b *BasicOption) NewDialer(opts []dialer.Option) C.Dialer { cDialer := b.DialerForAPI if cDialer == nil { if b.DialerProxy != "" { - cDialer = proxydialer.NewByName(b.DialerProxy) + cDialer = proxydialer.NewByName(b.DialerProxy, b.NewTunnel()) } else { cDialer = dialer.NewDialer(opts...) } diff --git a/component/proxydialer/byname.go b/component/proxydialer/byname.go index 30ade063..74fe644c 100644 --- a/component/proxydialer/byname.go +++ b/component/proxydialer/byname.go @@ -7,14 +7,23 @@ import ( "net/netip" C "github.com/metacubex/mihomo/constant" - "github.com/metacubex/mihomo/tunnel" ) +type Tunnel interface { + C.Tunnel + Proxies() map[string]C.Proxy +} + type byNameProxyDialer struct { proxyName string + tunnel C.Tunnel } func (d byNameProxyDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + tunnel, _ := d.tunnel.(Tunnel) + if tunnel == nil { + return nil, fmt.Errorf("tunnel is invalid, must be proxydialer.Tunnel, but got: %T", d.tunnel) + } proxies := tunnel.Proxies() proxy, ok := proxies[d.proxyName] if !ok { @@ -24,6 +33,10 @@ func (d byNameProxyDialer) DialContext(ctx context.Context, network, address str } func (d byNameProxyDialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) { + tunnel, _ := d.tunnel.(Tunnel) + if tunnel == nil { + return nil, fmt.Errorf("tunnel is invalid, must be proxydialer.Tunnel, but got: %T", d.tunnel) + } proxies := tunnel.Proxies() proxy, ok := proxies[d.proxyName] if !ok { @@ -32,6 +45,6 @@ func (d byNameProxyDialer) ListenPacket(ctx context.Context, network, address st return New(proxy, true).ListenPacket(ctx, network, address, rAddrPort) } -func NewByName(proxyName string) C.Dialer { - return byNameProxyDialer{proxyName: proxyName} +func NewByName(proxyName string, tunnel C.Tunnel) C.Dialer { + return byNameProxyDialer{proxyName: proxyName, tunnel: tunnel} } diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 5db0744a..ed857ed3 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -229,10 +229,11 @@ func updateNTP(c *config.NTP) { net.JoinHostPort(c.Server, strconv.Itoa(c.Port)), time.Duration(c.Interval), c.DialerProxy, + tunnel.Tunnel, c.WriteToSystem, ) } else { - ntp.ReCreateNTPService("", 0, "", false) + ntp.ReCreateNTPService("", 0, "", nil, false) } } diff --git a/ntp/ntp/service.go b/ntp/ntp/service.go index 97918548..a629c626 100644 --- a/ntp/ntp/service.go +++ b/ntp/ntp/service.go @@ -27,7 +27,7 @@ type Service struct { syncSystemTime bool } -func ReCreateNTPService(server string, interval time.Duration, dialerProxy string, syncSystemTime bool) { +func ReCreateNTPService(server string, interval time.Duration, dialerProxy string, tunnel C.Tunnel, syncSystemTime bool) { globalMu.Lock() defer globalMu.Unlock() if globalSrv != nil { @@ -39,7 +39,7 @@ func ReCreateNTPService(server string, interval time.Duration, dialerProxy strin ctx, cancel := context.WithCancel(context.Background()) var cDialer C.Dialer = dialer.NewDialer() if dialerProxy != "" { - cDialer = proxydialer.NewByName(dialerProxy) + cDialer = proxydialer.NewByName(dialerProxy, tunnel) } globalSrv = &Service{ server: M.ParseSocksaddr(server), diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index d5418c54..ec451050 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -18,6 +18,7 @@ import ( "github.com/metacubex/mihomo/component/loopback" "github.com/metacubex/mihomo/component/nat" "github.com/metacubex/mihomo/component/process" + "github.com/metacubex/mihomo/component/proxydialer" "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/slowdown" "github.com/metacubex/mihomo/component/sniffer" @@ -72,6 +73,7 @@ type tunnel struct{} var Tunnel = tunnel{} var _ C.Tunnel = Tunnel var _ P.Tunnel = Tunnel +var _ proxydialer.Tunnel = Tunnel func (t tunnel) HandleTCPConn(conn net.Conn, metadata *C.Metadata) { connCtx := icontext.NewConnContext(conn, metadata) @@ -112,6 +114,10 @@ func (t tunnel) NatTable() C.NatTable { return natTable } +func (t tunnel) Proxies() map[string]C.Proxy { + return proxies +} + func (t tunnel) Providers() map[string]P.ProxyProvider { return providers }