From f0aba3758dc5a4002ee1d8c17900c284c0aa9606 Mon Sep 17 00:00:00 2001 From: Kr328 <39107975+Kr328@users.noreply.github.com> Date: Tue, 3 Dec 2019 11:32:52 +0800 Subject: [PATCH] rebase "comzyh/add-water" & add dns config fallback --- buildSrc/src/main/java/GolangBuildOptions.kt | 6 +- core/src/main/golang/clash | 2 +- core/src/main/golang/go.mod | 2 +- core/src/main/golang/go.sum | 10 + core/src/main/golang/profile/load.go | 205 +++++++++++------- core/src/main/golang/tun/tun.go | 9 +- .../github/kr328/clash/service/TunService.kt | 4 +- 7 files changed, 142 insertions(+), 96 deletions(-) diff --git a/buildSrc/src/main/java/GolangBuildOptions.kt b/buildSrc/src/main/java/GolangBuildOptions.kt index 5a82609..a3df273 100644 --- a/buildSrc/src/main/java/GolangBuildOptions.kt +++ b/buildSrc/src/main/java/GolangBuildOptions.kt @@ -1,3 +1,3 @@ -import java.io.File - -data class GolangBuildOptions(val sourceDir: File, val outputDir: File, val platform: String) +import java.io.File + +data class GolangBuildOptions(val sourceDir: File, val outputDir: File, val platform: String) diff --git a/core/src/main/golang/clash b/core/src/main/golang/clash index d5d22cc..7767f15 160000 --- a/core/src/main/golang/clash +++ b/core/src/main/golang/clash @@ -1 +1 @@ -Subproject commit d5d22cce0c4b046921d87345e3ca0d38cc7ac917 +Subproject commit 7767f1554c6813b51e165732b85e5820b34ee9e9 diff --git a/core/src/main/golang/go.mod b/core/src/main/golang/go.mod index ad3d1be..236db9d 100644 --- a/core/src/main/golang/go.mod +++ b/core/src/main/golang/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/Dreamacro/clash v0.0.0 // local github.com/google/go-cmp v0.3.1 // indirect - golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe + golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 ) replace github.com/Dreamacro/clash v0.0.0 => ./clash diff --git a/core/src/main/golang/go.sum b/core/src/main/golang/go.sum index a9fc2ba..787076a 100644 --- a/core/src/main/golang/go.sum +++ b/core/src/main/golang/go.sum @@ -30,6 +30,8 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/miekg/dns v1.1.9 h1:OIdC9wT96RzuZMf2PfKRhFgsStHUUBZLM/lo1LqiM9E= github.com/miekg/dns v1.1.9/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22 h1:Jm64b3bO9kP43ddLjL2EY3Io6bmy1qGb9Xxz6TqS6rc= @@ -57,12 +59,16 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191128160524-b544559bb6d1 h1:anGSYQpPhQwXlwsu5wmfq0nWkCNaMEMUwAv13Y92hd8= +golang.org/x/crypto v0.0.0-20191128160524-b544559bb6d1/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191011234655-491137f69257 h1:ry8e2D+cwaV6hk7lb3aRTjjZo24shrbK0e11QEOkTIg= golang.org/x/net v0.0.0-20191011234655-491137f69257/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933 h1:e6HwijUxhDe+hPNjZQQn9bA5PW3vNmnN64U2ZW759Lk= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= @@ -74,6 +80,8 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= @@ -86,3 +94,5 @@ gopkg.in/eapache/channels.v1 v1.1.0 h1:5bGAyKKvyCTWjSj7mhefG6Lc68VyN4MH1v8/7Ooee gopkg.in/eapache/channels.v1 v1.1.0/go.mod h1:BHIBujSvu9yMTrTYbTCjDD43gUhtmaOtTWDe7sTv1js= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/core/src/main/golang/profile/load.go b/core/src/main/golang/profile/load.go index 7e8ea9e..e14530c 100644 --- a/core/src/main/golang/profile/load.go +++ b/core/src/main/golang/profile/load.go @@ -1,82 +1,123 @@ -package profile - -import ( - "net" - - adapters "github.com/Dreamacro/clash/adapters/outbound" - "github.com/Dreamacro/clash/component/auth" - trie "github.com/Dreamacro/clash/component/domain-trie" - "github.com/Dreamacro/clash/config" - "github.com/Dreamacro/clash/constant" - "github.com/Dreamacro/clash/dns" - "github.com/Dreamacro/clash/hub/executor" - "github.com/Dreamacro/clash/log" - "github.com/Dreamacro/clash/tunnel" - - "github.com/kr328/cfa/tun" -) - -// LoadDefault - load default configure -func LoadDefault() { - defaultC := &config.Config{ - General: &config.General{ - Port: 0, - SocksPort: 0, - RedirPort: 0, - Authentication: []string{}, - AllowLan: false, - BindAddress: "*", - Mode: tunnel.Direct, - LogLevel: log.SILENT, - ExternalController: "", - ExternalUI: "", - Secret: "", - }, - DNS: &config.DNS{ - Enable: false, - IPv6: false, - NameServer: []dns.NameServer{}, - Fallback: []dns.NameServer{}, - FallbackFilter: config.FallbackFilter{ - GeoIP: false, - IPCIDR: []*net.IPNet{}, - }, - Listen: "", - EnhancedMode: dns.NORMAL, - FakeIPRange: nil, - }, - Experimental: &config.Experimental{ - IgnoreResolveFail: false, - }, - Hosts: trie.New(), - Rules: []constant.Rule{}, - Users: []auth.AuthUser{}, - Proxies: map[string]constant.Proxy{}, - } - - reject := adapters.NewProxy(adapters.NewReject()) - direct := adapters.NewProxy(adapters.NewDirect()) - global, _ := adapters.NewSelector("GLOBAL", []constant.Proxy{direct}) - - defaultC.Proxies["DIRECT"] = direct - defaultC.Proxies["REJECT"] = reject - defaultC.Proxies["GLOBAL"] = adapters.NewProxy(global) - - tun.ResetDnsRedirect() - - executor.ApplyConfig(defaultC, true) -} - -// LoadFromFile - load file -func LoadFromFile(path string) error { - cfg, err := executor.ParseWithPath(path) - if err != nil { - return err - } - - executor.ApplyConfig(cfg, true) - - tun.ResetDnsRedirect() - - return nil -} +package profile + +import ( + "net" + + adapters "github.com/Dreamacro/clash/adapters/outbound" + "github.com/Dreamacro/clash/component/auth" + trie "github.com/Dreamacro/clash/component/domain-trie" + "github.com/Dreamacro/clash/config" + "github.com/Dreamacro/clash/constant" + "github.com/Dreamacro/clash/dns" + "github.com/Dreamacro/clash/hub/executor" + "github.com/Dreamacro/clash/log" + "github.com/Dreamacro/clash/tunnel" + + "github.com/kr328/cfa/tun" +) + +var defaultDNSResolver = dns.New(dns.Config{ + Main: []dns.NameServer{ + dns.NameServer{Net: "tcp", Addr: "1.1.1.1"}, + dns.NameServer{Net: "tcp", Addr: "8.8.8.8"}, + dns.NameServer{Net: "tcp", Addr: "208.67.222.222"}, + dns.NameServer{Net: "", Addr: "119.29.29.29"}, + dns.NameServer{Net: "", Addr: "223.5.5.5"}, + dns.NameServer{Net: "", Addr: "114.114.114.114"}, + }, + Fallback: make([]dns.NameServer, 0), + IPv6: true, + EnhancedMode: dns.MAPPING, + Pool: nil, + FallbackFilter: dns.FallbackFilter{ + GeoIP: false, + IPCIDR: make([]*net.IPNet, 0), + }, +}) + +// LoadDefault - load default configure +func LoadDefault() { + defaultC := &config.Config{ + General: &config.General{ + Port: 0, + SocksPort: 0, + RedirPort: 0, + Authentication: []string{}, + AllowLan: false, + BindAddress: "*", + Mode: tunnel.Direct, + LogLevel: log.SILENT, + ExternalController: "", + ExternalUI: "", + Secret: "", + }, + DNS: &config.DNS{ + Enable: false, + IPv6: false, + NameServer: []dns.NameServer{}, + Fallback: []dns.NameServer{}, + FallbackFilter: config.FallbackFilter{ + GeoIP: false, + IPCIDR: []*net.IPNet{}, + }, + Listen: "", + EnhancedMode: dns.NORMAL, + FakeIPRange: nil, + }, + Experimental: &config.Experimental{ + IgnoreResolveFail: false, + }, + Hosts: trie.New(), + Rules: []constant.Rule{}, + Users: []auth.AuthUser{}, + Proxies: map[string]constant.Proxy{}, + } + + reject := adapters.NewProxy(adapters.NewReject()) + direct := adapters.NewProxy(adapters.NewDirect()) + global, _ := adapters.NewSelector("GLOBAL", []constant.Proxy{direct}) + + defaultC.Proxies["DIRECT"] = direct + defaultC.Proxies["REJECT"] = reject + defaultC.Proxies["GLOBAL"] = adapters.NewProxy(global) + + tun.ResetDnsRedirect() + + executor.ApplyConfig(defaultC, true) +} + +// LoadFromFile - load file +func LoadFromFile(path string) error { + cfg, err := executor.ParseWithPath(path) + if err != nil { + return err + } + + executor.ApplyConfig(cfg, true) + + if dns.DefaultResolver == nil && cfg.DNS.Enable { + c := cfg.DNS + + r := dns.New(dns.Config{ + Main: c.NameServer, + Fallback: c.Fallback, + IPv6: c.IPv6, + EnhancedMode: c.EnhancedMode, + Pool: c.FakeIPRange, + FallbackFilter: dns.FallbackFilter{ + GeoIP: c.FallbackFilter.GeoIP, + IPCIDR: c.FallbackFilter.IPCIDR, + }, + }) + + dns.DefaultResolver = r + } + + if dns.DefaultResolver == nil { + dns.DefaultResolver = defaultDNSResolver + } + + tun.ResetDnsRedirect() + + return nil +} diff --git a/core/src/main/golang/tun/tun.go b/core/src/main/golang/tun/tun.go index 7f40140..7b14ac4 100644 --- a/core/src/main/golang/tun/tun.go +++ b/core/src/main/golang/tun/tun.go @@ -12,7 +12,7 @@ type handler struct { tunAdapter *T.TunAdapter } -const dnsRedirectAddr = "0.0.0.0" +const dnsServerAddress = "172.19.0.2:53" var ( instance *handler @@ -51,10 +51,5 @@ func ResetDnsRedirect() { return } - resolver := dns.DefaultResolver - if resolver != nil { - (*instance.tunAdapter).CreateDNSServer(resolver, dnsRedirectAddr+":53") - } else { - (*instance.tunAdapter).DestroyDNSSerrvice() - } + (*instance.tunAdapter).ReCreateDNSServer(dns.DefaultResolver, dnsServerAddress) } diff --git a/service/src/main/java/com/github/kr328/clash/service/TunService.kt b/service/src/main/java/com/github/kr328/clash/service/TunService.kt index 1f7dc8c..63bfa56 100644 --- a/service/src/main/java/com/github/kr328/clash/service/TunService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/TunService.kt @@ -15,7 +15,7 @@ class TunService : VpnService(), IClashEventObserver { companion object { // from https://github.com/shadowsocks/shadowsocks-android/blob/master/core/src/main/java/com/github/shadowsocks/bg/VpnService.kt private const val VPN_MTU = 1500 - private const val PRIVATE_DEFAULT_DNS = "119.29.29.29" // sync with tun/tun.go/dnsRedirectAddr + private const val PRIVATE_VLAN_DNS = "172.19.0.2" // sync with tun/tun.go/dnsServerAddress private const val PRIVATE_VLAN4_CLIENT = "172.19.0.1" private const val PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1" } @@ -59,7 +59,7 @@ class TunService : VpnService(), IClashEventObserver { fileDescriptor = Builder() .addAddress() - .addDnsServer(PRIVATE_DEFAULT_DNS) + .addDnsServer(PRIVATE_VLAN_DNS) .addBypassApplications() .addBypassPrivateRoute() .setMtu(VPN_MTU)