auto change interface for tproxy

This commit is contained in:
admin 2022-03-21 19:38:36 +08:00
parent 5b7f46bc97
commit 3beb71b6e1
5 changed files with 18 additions and 8 deletions

View file

@ -2,7 +2,7 @@ package executor
import ( import (
"fmt" "fmt"
"github.com/Dreamacro/clash/listener/tun/ipstack/commons"
"net" "net"
"os" "os"
"runtime" "runtime"
@ -75,14 +75,14 @@ func ApplyConfig(cfg *config.Config, force bool) {
defer mux.Unlock() defer mux.Unlock()
updateUsers(cfg.Users) updateUsers(cfg.Users)
updateHosts(cfg.Hosts)
updateProxies(cfg.Proxies, cfg.Providers) updateProxies(cfg.Proxies, cfg.Providers)
updateRules(cfg.Rules, cfg.RuleProviders) updateRules(cfg.Rules, cfg.RuleProviders)
updateGeneral(cfg.General, force) updateGeneral(cfg.General, force)
updateDNS(cfg.DNS, cfg.Tun) updateDNS(cfg.DNS, cfg.Tun)
updateTun(cfg.Tun) updateTun(cfg.Tun)
updateIPTables(cfg.DNS, cfg.General, cfg.Tun) autoUpdateIPTables(cfg.DNS, cfg.General, cfg.Tun)
updateExperimental(cfg) updateExperimental(cfg)
updateHosts(cfg.Hosts)
loadProvider(cfg.RuleProviders, cfg.Providers) loadProvider(cfg.RuleProviders, cfg.Providers)
updateProfile(cfg) updateProfile(cfg)
@ -301,6 +301,13 @@ func patchSelectGroup(proxies map[string]C.Proxy) {
} }
} }
func autoUpdateIPTables(dns *config.DNS, general *config.General, tun *config.Tun) {
updateIPTables(dns, general, tun)
go commons.DefaultInterfaceChangeMonitor(func(_ string) {
updateIPTables(dns, general, tun)
})
}
func updateIPTables(dns *config.DNS, general *config.General, tun *config.Tun) { func updateIPTables(dns *config.DNS, general *config.General, tun *config.Tun) {
tproxy.CleanUpTProxyLinuxIPTables() tproxy.CleanUpTProxyLinuxIPTables()
@ -340,7 +347,7 @@ func updateIPTables(dns *config.DNS, general *config.General, tun *config.Tun) {
dialer.DefaultRoutingMark.Store(2158) dialer.DefaultRoutingMark.Store(2158)
} }
if general.AutoIptables { if general.AutoIptables {
err = tproxy.SetTProxyLinuxIPTables(general.Interface, general.TProxyPort, dnsPort) err = tproxy.SetTProxyLinuxIPTables(dialer.DefaultInterface.Load(), general.TProxyPort, dnsPort)
} }
} }

View file

@ -24,7 +24,7 @@ func ipv4MaskString(bits int) string {
return fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3]) return fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3])
} }
func defaultInterfaceChangeMonitor() { func DefaultInterfaceChangeMonitor(cb func(ifName string)) {
t := time.NewTicker(defaultInterfaceMonitorDuration) t := time.NewTicker(defaultInterfaceMonitorDuration)
defer t.Stop() defer t.Stop()
@ -43,6 +43,9 @@ func defaultInterfaceChangeMonitor() {
} }
dialer.DefaultInterface.Store(interfaceName) dialer.DefaultInterface.Store(interfaceName)
if cb != nil {
cb(interfaceName)
}
log.Warnln("[TUN] default interface changed by monitor, %s => %s", old, interfaceName) log.Warnln("[TUN] default interface changed by monitor, %s => %s", old, interfaceName)
} }

View file

@ -54,7 +54,7 @@ func configInterfaceRouting(interfaceName string, addr netip.Prefix) error {
} }
} }
go defaultInterfaceChangeMonitor() go DefaultInterfaceChangeMonitor(nil)
return execRouterCmd("add", "-inet6", "2000::/3", interfaceName) return execRouterCmd("add", "-inet6", "2000::/3", interfaceName)
} }

View file

@ -42,7 +42,7 @@ func configInterfaceRouting(interfaceName string, addr netip.Prefix) error {
} }
} }
go defaultInterfaceChangeMonitor() go DefaultInterfaceChangeMonitor(nil)
return nil return nil
} }

View file

@ -203,7 +203,7 @@ startOver:
wintunInterfaceName = dev.Name() wintunInterfaceName = dev.Name()
go defaultInterfaceChangeMonitor() go DefaultInterfaceChangeMonitor(nil)
return nil return nil
} }