From b5b06ea49ccf9940e4758bb0924ba0bdf04ca941 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 6 Dec 2022 09:04:30 +0800 Subject: [PATCH] fix: config crash --- config/config.go | 92 +++++++------------------------------ hub/executor/executor.go | 4 +- hub/route/configs.go | 13 +++--- listener/config/tuic.go | 20 ++++---- listener/config/tun.go | 45 +++++++++--------- listener/inbound/tun.go | 12 +---- listener/listener.go | 2 +- listener/sing_tun/server.go | 11 ++++- 8 files changed, 69 insertions(+), 130 deletions(-) diff --git a/config/config.go b/config/config.go index b48d5328f..6d7617097 100644 --- a/config/config.go +++ b/config/config.go @@ -2,7 +2,6 @@ package config import ( "container/list" - "encoding/json" "errors" "fmt" "net" @@ -46,18 +45,18 @@ type General struct { Controller Mode T.TunnelMode `json:"mode"` UnifiedDelay bool - LogLevel log.LogLevel `json:"log-level"` - IPv6 bool `json:"ipv6"` - Interface string `json:"interface-name"` - RoutingMark int `json:"-"` - GeodataMode bool `json:"geodata-mode"` - GeodataLoader string `json:"geodata-loader"` - TCPConcurrent bool `json:"tcp-concurrent"` - EnableProcess bool `json:"enable-process"` - Tun Tun `json:"tun"` - TuicServer TuicServer `json:"tuic-server"` - Sniffing bool `json:"sniffing"` - EBpf EBpf `json:"-"` + LogLevel log.LogLevel `json:"log-level"` + IPv6 bool `json:"ipv6"` + Interface string `json:"interface-name"` + RoutingMark int `json:"-"` + GeodataMode bool `json:"geodata-mode"` + GeodataLoader string `json:"geodata-loader"` + TCPConcurrent bool `json:"tcp-concurrent"` + EnableProcess bool `json:"enable-process"` + Tun LC.Tun `json:"tun"` + TuicServer LC.TuicServer `json:"tuic-server"` + Sniffing bool `json:"sniffing"` + EBpf EBpf `json:"-"` } // Inbound config @@ -115,56 +114,11 @@ type Profile struct { StoreFakeIP bool `yaml:"store-fake-ip"` } -type TuicServer struct { - Enable bool `yaml:"enable" json:"enable"` - Listen string `yaml:"listen" json:"listen"` - Token []string `yaml:"token" json:"token"` - Certificate string `yaml:"certificate" json:"certificate"` - PrivateKey string `yaml:"private-key" json:"private-key"` - CongestionController string `yaml:"congestion-controller" json:"congestion-controller,omitempty"` - MaxIdleTime int `yaml:"max-idle-time" json:"max-idle-time,omitempty"` - AuthenticationTimeout int `yaml:"authentication-timeout" json:"authentication-timeout,omitempty"` - ALPN []string `yaml:"alpn" json:"alpn,omitempty"` - MaxUdpRelayPacketSize int `yaml:"max-udp-relay-packet-size" json:"max-udp-relay-packet-size,omitempty"` -} - type TLS struct { Certificate string `yaml:"certificate"` PrivateKey string `yaml:"private-key"` } -func (t TuicServer) String() string { - b, _ := json.Marshal(t) - return string(b) -} - -// Tun config -type Tun struct { - Enable bool `yaml:"enable" json:"enable"` - Device string `yaml:"device" json:"device"` - Stack C.TUNStack `yaml:"stack" json:"stack"` - DNSHijack []netip.AddrPort `yaml:"dns-hijack" json:"dns-hijack"` - AutoRoute bool `yaml:"auto-route" json:"auto-route"` - AutoDetectInterface bool `yaml:"auto-detect-interface" json:"auto-detect-interface"` - RedirectToTun []string `yaml:"-" json:"-"` - - MTU uint32 `yaml:"mtu" json:"mtu,omitempty"` - Inet4Address []LC.ListenPrefix `yaml:"inet4-address" json:"inet4-address,omitempty"` - Inet6Address []LC.ListenPrefix `yaml:"inet6-address" json:"inet6-address,omitempty"` - StrictRoute bool `yaml:"strict-route" json:"strict-route,omitempty"` - Inet4RouteAddress []LC.ListenPrefix `yaml:"inet4-route-address" json:"inet4-route-address,omitempty"` - Inet6RouteAddress []LC.ListenPrefix `yaml:"inet6-route-address" json:"inet6-route-address,omitempty"` - IncludeUID []uint32 `yaml:"include-uid" json:"include-uid,omitempty"` - IncludeUIDRange []string `yaml:"include-uid-range" json:"include-uid-range,omitempty"` - ExcludeUID []uint32 `yaml:"exclude-uid" json:"exclude-uid,omitempty"` - ExcludeUIDRange []string `yaml:"exclude-uid-range" json:"exclude-uid-range,omitempty"` - IncludeAndroidUser []int `yaml:"include-android-user" json:"include-android-user,omitempty"` - IncludePackage []string `yaml:"include-package" json:"include-package,omitempty"` - ExcludePackage []string `yaml:"exclude-package" json:"exclude-package,omitempty"` - EndpointIndependentNat bool `yaml:"endpoint-independent-nat" json:"endpoint-independent-nat,omitempty"` - UDPTimeout int64 `yaml:"udp-timeout" json:"udp-timeout,omitempty"` -} - // IPTables config type IPTables struct { Enable bool `yaml:"enable" json:"enable"` @@ -734,6 +688,7 @@ func parseRuleProviders(cfg *RawConfig) (ruleProviders map[string]providerTypes. } func parseSubRules(cfg *RawConfig, proxies map[string]C.Proxy) (subRules map[string][]C.Rule, err error) { + subRules = map[string][]C.Rule{} for name, rawRules := range cfg.SubRules { if len(name) == 0 { return nil, fmt.Errorf("sub-rule name is empty") @@ -1162,21 +1117,6 @@ func parseAuthentication(rawRecords []string) []auth.AuthUser { } func parseTun(rawTun RawTun, general *General) error { - var dnsHijack []netip.AddrPort - - for _, d := range rawTun.DNSHijack { - if _, after, ok := strings.Cut(d, "://"); ok { - d = after - } - d = strings.Replace(d, "any", "0.0.0.0", 1) - addrPort, err := netip.ParseAddrPort(d) - if err != nil { - return fmt.Errorf("parse dns-hijack url error: %w", err) - } - - dnsHijack = append(dnsHijack, addrPort) - } - tunAddressPrefix := T.FakeIPRange() if !tunAddressPrefix.IsValid() { tunAddressPrefix = netip.MustParsePrefix("198.18.0.1/16") @@ -1187,11 +1127,11 @@ func parseTun(rawTun RawTun, general *General) error { rawTun.Inet6Address = nil } - general.Tun = Tun{ + general.Tun = LC.Tun{ Enable: rawTun.Enable, Device: rawTun.Device, Stack: rawTun.Stack, - DNSHijack: dnsHijack, + DNSHijack: rawTun.DNSHijack, AutoRoute: rawTun.AutoRoute, AutoDetectInterface: rawTun.AutoDetectInterface, RedirectToTun: rawTun.RedirectToTun, @@ -1217,7 +1157,7 @@ func parseTun(rawTun RawTun, general *General) error { } func parseTuicServer(rawTuic RawTuicServer, general *General) error { - general.TuicServer = TuicServer{ + general.TuicServer = LC.TuicServer{ Enable: rawTuic.Enable, Listen: rawTuic.Listen, Token: rawTuic.Token, diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 32737c02c..9c34ff825 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -125,8 +125,8 @@ func GetGeneral() *config.General { LogLevel: log.Level(), IPv6: !resolver.DisableIPv6, GeodataLoader: G.LoaderName(), - Tun: config.Tun(listener.GetTunConf()), - TuicServer: config.TuicServer(listener.GetTuicConf()), + Tun: listener.GetTunConf(), + TuicServer: listener.GetTuicConf(), Interface: dialer.DefaultInterface.Load(), Sniffing: tunnel.IsSniffing(), TCPConcurrent: dialer.GetDial(), diff --git a/hub/route/configs.go b/hub/route/configs.go index 3699b9d35..37acac5ec 100644 --- a/hub/route/configs.go +++ b/hub/route/configs.go @@ -2,7 +2,6 @@ package route import ( "net/http" - "net/netip" "path/filepath" "sync" @@ -58,12 +57,12 @@ type configSchema struct { } type tunSchema struct { - Enable bool `yaml:"enable" json:"enable"` - Device *string `yaml:"device" json:"device"` - Stack *C.TUNStack `yaml:"stack" json:"stack"` - DNSHijack *[]netip.AddrPort `yaml:"dns-hijack" json:"dns-hijack"` - AutoRoute *bool `yaml:"auto-route" json:"auto-route"` - AutoDetectInterface *bool `yaml:"auto-detect-interface" json:"auto-detect-interface"` + Enable bool `yaml:"enable" json:"enable"` + Device *string `yaml:"device" json:"device"` + Stack *C.TUNStack `yaml:"stack" json:"stack"` + DNSHijack *[]string `yaml:"dns-hijack" json:"dns-hijack"` + AutoRoute *bool `yaml:"auto-route" json:"auto-route"` + AutoDetectInterface *bool `yaml:"auto-detect-interface" json:"auto-detect-interface"` //RedirectToTun []string `yaml:"-" json:"-"` MTU *uint32 `yaml:"mtu" json:"mtu,omitempty"` diff --git a/listener/config/tuic.go b/listener/config/tuic.go index 78252fd31..c584bbf5e 100644 --- a/listener/config/tuic.go +++ b/listener/config/tuic.go @@ -5,16 +5,16 @@ import ( ) type TuicServer struct { - Enable bool - Listen string - Token []string - Certificate string - PrivateKey string - CongestionController string - MaxIdleTime int - AuthenticationTimeout int - ALPN []string - MaxUdpRelayPacketSize int + Enable bool `yaml:"enable" json:"enable"` + Listen string `yaml:"listen" json:"listen"` + Token []string `yaml:"token" json:"token"` + Certificate string `yaml:"certificate" json:"certificate"` + PrivateKey string `yaml:"private-key" json:"private-key"` + CongestionController string `yaml:"congestion-controller" json:"congestion-controller,omitempty"` + MaxIdleTime int `yaml:"max-idle-time" json:"max-idle-time,omitempty"` + AuthenticationTimeout int `yaml:"authentication-timeout" json:"authentication-timeout,omitempty"` + ALPN []string `yaml:"alpn" json:"alpn,omitempty"` + MaxUdpRelayPacketSize int `yaml:"max-udp-relay-packet-size" json:"max-udp-relay-packet-size,omitempty"` } func (t TuicServer) String() string { diff --git a/listener/config/tun.go b/listener/config/tun.go index e7b2c930d..2e1d1a717 100644 --- a/listener/config/tun.go +++ b/listener/config/tun.go @@ -5,6 +5,7 @@ import ( "net/netip" C "github.com/Dreamacro/clash/constant" + "gopkg.in/yaml.v3" ) @@ -71,27 +72,27 @@ func StringSliceToListenPrefixSlice(ss []string) ([]ListenPrefix, error) { } type Tun struct { - Enable bool - Device string - Stack C.TUNStack - DNSHijack []netip.AddrPort - AutoRoute bool - AutoDetectInterface bool - RedirectToTun []string + Enable bool `yaml:"enable" json:"enable"` + Device string `yaml:"device" json:"device"` + Stack C.TUNStack `yaml:"stack" json:"stack"` + DNSHijack []string `yaml:"dns-hijack" json:"dns-hijack"` + AutoRoute bool `yaml:"auto-route" json:"auto-route"` + AutoDetectInterface bool `yaml:"auto-detect-interface" json:"auto-detect-interface"` + RedirectToTun []string `yaml:"-" json:"-"` - MTU uint32 - Inet4Address []ListenPrefix - Inet6Address []ListenPrefix - StrictRoute bool - Inet4RouteAddress []ListenPrefix - Inet6RouteAddress []ListenPrefix - IncludeUID []uint32 - IncludeUIDRange []string - ExcludeUID []uint32 - ExcludeUIDRange []string - IncludeAndroidUser []int - IncludePackage []string - ExcludePackage []string - EndpointIndependentNat bool - UDPTimeout int64 + MTU uint32 `yaml:"mtu" json:"mtu,omitempty"` + Inet4Address []ListenPrefix `yaml:"inet4-address" json:"inet4-address,omitempty"` + Inet6Address []ListenPrefix `yaml:"inet6-address" json:"inet6-address,omitempty"` + StrictRoute bool `yaml:"strict-route" json:"strict-route,omitempty"` + Inet4RouteAddress []ListenPrefix `yaml:"inet4-route-address" json:"inet4-route-address,omitempty"` + Inet6RouteAddress []ListenPrefix `yaml:"inet6-route-address" json:"inet6-route-address,omitempty"` + IncludeUID []uint32 `yaml:"include-uid" json:"include-uid,omitempty"` + IncludeUIDRange []string `yaml:"include-uid-range" json:"include-uid-range,omitempty"` + ExcludeUID []uint32 `yaml:"exclude-uid" json:"exclude-uid,omitempty"` + ExcludeUIDRange []string `yaml:"exclude-uid-range" json:"exclude-uid-range,omitempty"` + IncludeAndroidUser []int `yaml:"include-android-user" json:"include-android-user,omitempty"` + IncludePackage []string `yaml:"include-package" json:"include-package,omitempty"` + ExcludePackage []string `yaml:"exclude-package" json:"exclude-package,omitempty"` + EndpointIndependentNat bool `yaml:"endpoint-independent-nat" json:"endpoint-independent-nat,omitempty"` + UDPTimeout int64 `yaml:"udp-timeout" json:"udp-timeout,omitempty"` } diff --git a/listener/inbound/tun.go b/listener/inbound/tun.go index 3365ed893..997164c2a 100644 --- a/listener/inbound/tun.go +++ b/listener/inbound/tun.go @@ -2,7 +2,6 @@ package inbound import ( "errors" - "net/netip" "strings" C "github.com/Dreamacro/clash/constant" @@ -56,15 +55,6 @@ func NewTun(options *TunOption) (*Tun, error) { if !exist { return nil, errors.New("invalid tun stack") } - dnsHijack := make([]netip.AddrPort, 0, len(options.DNSHijack)) - for _, str := range options.DNSHijack { - var a netip.AddrPort - err = a.UnmarshalText([]byte(str)) - if err != nil { - return nil, err - } - dnsHijack = append(dnsHijack, a) - } inet4Address, err := LC.StringSliceToListenPrefixSlice(options.Inet4Address) if err != nil { return nil, err @@ -88,7 +78,7 @@ func NewTun(options *TunOption) (*Tun, error) { Enable: true, Device: options.Device, Stack: stack, - DNSHijack: dnsHijack, + DNSHijack: options.DNSHijack, AutoRoute: options.AutoRoute, AutoDetectInterface: options.AutoDetectInterface, MTU: options.MTU, diff --git a/listener/listener.go b/listener/listener.go index ab9963b60..26eb117b4 100644 --- a/listener/listener.go +++ b/listener/listener.go @@ -825,7 +825,7 @@ func hasTunConfigChange(tunConf *LC.Tun) bool { } sort.Slice(tunConf.DNSHijack, func(i, j int) bool { - return tunConf.DNSHijack[i].Addr().Less(tunConf.DNSHijack[j].Addr()) + return tunConf.DNSHijack[i] < tunConf.DNSHijack[j] }) sort.Slice(tunConf.Inet4Address, func(i, j int) bool { diff --git a/listener/sing_tun/server.go b/listener/sing_tun/server.go index d74324dab..5c387a8d3 100644 --- a/listener/sing_tun/server.go +++ b/listener/sing_tun/server.go @@ -109,7 +109,16 @@ func New(options LC.Tun, tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapte var dnsAdds []netip.AddrPort for _, d := range options.DNSHijack { - dnsAdds = append(dnsAdds, d) + if _, after, ok := strings.Cut(d, "://"); ok { + d = after + } + d = strings.Replace(d, "any", "0.0.0.0", 1) + addrPort, err := netip.ParseAddrPort(d) + if err != nil { + return nil, fmt.Errorf("parse dns-hijack url error: %w", err) + } + + dnsAdds = append(dnsAdds, addrPort) } for _, a := range options.Inet4Address { addrPort := netip.AddrPortFrom(a.Build().Addr().Next(), 53)