From 610c79570a1031e18dda382a364932c6f6d4a2b9 Mon Sep 17 00:00:00 2001 From: Clash-Mini Date: Wed, 5 Jan 2022 11:24:00 +0800 Subject: [PATCH] make tun config compatible with premium --- hub/executor/executor.go | 36 +++++++++++++++++++----------------- tunnel/tunnel.go | 33 +++++++++++++-------------------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/hub/executor/executor.go b/hub/executor/executor.go index ae1892bd..5e2fa1fd 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -80,8 +80,8 @@ func ApplyConfig(cfg *config.Config, force bool) { updateProfile(cfg) updateIPTables(cfg.DNS, cfg.General, cfg.Tun) updateDNS(cfg.DNS, cfg.Tun) - updateGeneral(cfg.General, force) - updateTun(cfg.General, cfg.Tun) + updateGeneral(cfg.General, cfg.Tun, force) + updateTun(cfg.Tun) updateExperimental(cfg) } @@ -175,10 +175,24 @@ func updateRules(rules []C.Rule, ruleProviders map[string]*provider.RuleProvider tunnel.UpdateRules(rules, ruleProviders) } -func updateGeneral(general *config.General, force bool) { +func updateGeneral(general *config.General, Tun *config.Tun, force bool) { tunnel.SetMode(general.Mode) resolver.DisableIPv6 = !general.IPv6 adapter.UnifiedDelay.Store(general.UnifiedDelay) + + if (Tun.Enable || general.TProxyPort != 0) && general.Interface == "" { + autoDetectInterfaceName, err := dev.GetAutoDetectInterface() + if err == nil { + if autoDetectInterfaceName != "" && autoDetectInterfaceName != "" { + general.Interface = autoDetectInterfaceName + } else { + log.Debugln("Auto detect interface name is empty.") + } + } else { + log.Debugln("Can not find auto detect interface. %s", err.Error()) + } + } + dialer.DefaultInterface.Store(general.Interface) log.Infoln("Use interface name: %s", general.Interface) @@ -208,29 +222,17 @@ func updateGeneral(general *config.General, force bool) { log.SetLevel(general.LogLevel) } -func updateTun(General *config.General, Tun *config.Tun) { +func updateTun(Tun *config.Tun) { if Tun == nil { return } - if (Tun.Enable || General.TProxyPort != 0) && General.Interface == "" { - autoDetectInterfaceName, err := dev.GetAutoDetectInterface() - if err == nil { - if autoDetectInterfaceName != "" && autoDetectInterfaceName != "" { - General.Interface = autoDetectInterfaceName - } else { - log.Debugln("Auto detect interface name is empty.") - } - } else { - log.Debugln("Can not find auto detect interface. %s", err.Error()) - } - } - tcpIn := tunnel.TCPIn() udpIn := tunnel.UDPIn() if err := P.ReCreateTun(*Tun, tcpIn, udpIn); err != nil { log.Errorln("Start Tun interface error: %s", err.Error()) + os.Exit(2) } } diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index 0f4b1206..05354f2d 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -158,7 +158,7 @@ func preHandleMetadata(metadata *C.Metadata) error { return nil } -func resolveMetadata(ctx C.PlainContext, metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err error) { +func resolveMetadata(metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err error) { switch mode { case Direct: proxy = proxies["DIRECT"] @@ -222,7 +222,7 @@ func handleUDPConn(packet *inbound.PacketAdapter) { }() pCtx := icontext.NewPacketConnContext(metadata) - proxy, rule, err := resolveMetadata(pCtx, metadata) + proxy, rule, err := resolveMetadata(metadata) if err != nil { log.Warnln("[UDP] Parse metadata failed: %s", err.Error()) return @@ -242,16 +242,13 @@ func handleUDPConn(packet *inbound.PacketAdapter) { pCtx.InjectPacketConn(rawPc) pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule) - var ruleDetail string - if rule.Payload() != "" { - ruleDetail = fmt.Sprintf("%s(%s)", rule.RuleType().String(), rule.Payload()) - } else { - ruleDetail = rule.RuleType().String() - } - switch true { case rule != nil: - log.Infoln("[UDP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), ruleDetail, rawPc.Chains().String()) + if rule.Payload() != "" { + log.Infoln("[UDP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), fmt.Sprintf("%s(%s)", rule.RuleType().String(), rule.Payload()), rawPc.Chains().String()) + } else { + log.Infoln("[UDP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), rule.Payload(), rawPc.Chains().String()) + } case mode == Script: log.Infoln("[UDP] %s --> %s using SCRIPT %s", metadata.SourceDetail(), metadata.RemoteAddress(), rawPc.Chains().String()) case mode == Global: @@ -283,7 +280,7 @@ func handleTCPConn(connCtx C.ConnContext) { return } - proxy, rule, err := resolveMetadata(connCtx, metadata) + proxy, rule, err := resolveMetadata(metadata) if err != nil { log.Warnln("[Metadata] parse failed: %s", err.Error()) return @@ -303,17 +300,13 @@ func handleTCPConn(connCtx C.ConnContext) { remoteConn = statistic.NewTCPTracker(remoteConn, statistic.DefaultManager, metadata, rule) defer remoteConn.Close() - var ruleDetail string - - if rule.Payload() != "" { - ruleDetail = fmt.Sprintf("%s(%s)", rule.RuleType().String(), rule.Payload()) - } else { - ruleDetail = rule.RuleType().String() - } - switch true { case rule != nil: - log.Infoln("[TCP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), ruleDetail, remoteConn.Chains().String()) + if rule.Payload() != "" { + log.Infoln("[TCP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), fmt.Sprintf("%s(%s)", rule.RuleType().String(), rule.Payload()), remoteConn.Chains().String()) + } else { + log.Infoln("[TCP] %s --> %s match %s using %s", metadata.SourceDetail(), metadata.RemoteAddress(), rule.RuleType().String(), remoteConn.Chains().String()) + } case mode == Script: log.Infoln("[TCP] %s --> %s using SCRIPT %s", metadata.SourceDetail(), metadata.RemoteAddress(), remoteConn.Chains().String()) case mode == Global: