From ab4b8b505791365e4c03156e9689039efe453a47 Mon Sep 17 00:00:00 2001 From: Kr328 <39107975+Kr328@users.noreply.github.com> Date: Sun, 24 Nov 2019 11:19:06 +0800 Subject: [PATCH] add query proxies --- core/src/main/golang/main.go | 3 + core/src/main/golang/server/profile.go | 4 - core/src/main/golang/server/proxies.go | 34 ++++ core/src/main/golang/server/server.go | 4 + core/src/main/golang/server/tun.go | 6 - core/src/main/golang/tun/tun.go | 2 + .../com/github/kr328/clash/core/BaseClash.kt | 56 ++++++ .../java/com/github/kr328/clash/core/Clash.kt | 60 +------ .../github/kr328/clash/core/ClashProcess.kt | 5 +- .../com/github/kr328/clash/core/Constants.kt | 5 + .../kr328/clash/service/ClashService.kt | 4 +- .../github/kr328/clash/service/TunService.kt | 25 ++- .../service/net/DefaultNetworkObserver.kt | 5 +- .../res/drawable/ic_notification_icon.png | Bin 0 -> 4001 bytes service/src/main/res/values/arrays.xml | 169 ++++++++++++++++++ 15 files changed, 310 insertions(+), 72 deletions(-) create mode 100644 core/src/main/golang/server/proxies.go create mode 100644 core/src/main/java/com/github/kr328/clash/core/BaseClash.kt create mode 100644 core/src/main/java/com/github/kr328/clash/core/Constants.kt create mode 100644 service/src/main/res/drawable/ic_notification_icon.png create mode 100644 service/src/main/res/values/arrays.xml diff --git a/core/src/main/golang/main.go b/core/src/main/golang/main.go index dc46393..1ae3141 100644 --- a/core/src/main/golang/main.go +++ b/core/src/main/golang/main.go @@ -18,6 +18,9 @@ func main() { return } + // Redirect stderr to stdout + os.Stderr = os.Stdout + if cwd, err := os.Getwd(); err == nil { constant.SetHomeDir(cwd) } else { diff --git a/core/src/main/golang/server/profile.go b/core/src/main/golang/server/profile.go index fe1a394..b160552 100644 --- a/core/src/main/golang/server/profile.go +++ b/core/src/main/golang/server/profile.go @@ -13,8 +13,6 @@ func handleProfileDefault(client *net.UnixConn) { profile.LoadDefault() log.Infoln("Profile default loaded") - - client.Close() } func handleProfileReload(client *net.UnixConn) { @@ -49,6 +47,4 @@ func handleProfileReload(client *net.UnixConn) { } log.Infoln("Profile " + payload.Path + " loaded") - - client.Close() } diff --git a/core/src/main/golang/server/proxies.go b/core/src/main/golang/server/proxies.go new file mode 100644 index 0000000..669cdef --- /dev/null +++ b/core/src/main/golang/server/proxies.go @@ -0,0 +1,34 @@ +package server + +import ( + "encoding/json" + "net" + + "github.com/Dreamacro/clash/log" + "github.com/Dreamacro/clash/tunnel" +) + +func handleQueryProxies(client *net.UnixConn) { + proxies := tunnel.Instance().Proxies() + + var root struct { + proxies []map[string]interface{} `json:"proxies"` + } + + root.proxies = make([]map[string]interface{}, len(proxies)) + + for _, p := range proxies { + inner, err := p.MarshalJSON() + + if err != nil { + log.Warnln("MarshalJSON failure %s", err.Error()) + continue + } + + mapping := map[string]interface{}{} + json.Unmarshal(inner, &mapping) + + root.proxies = append(root.proxies, mapping) + } + +} diff --git a/core/src/main/golang/server/server.go b/core/src/main/golang/server/server.go index 96e9bf6..c66a4f1 100644 --- a/core/src/main/golang/server/server.go +++ b/core/src/main/golang/server/server.go @@ -13,6 +13,7 @@ const ( commandTunStop = 2 commandProfileDefault = 3 commandProfileReload = 4 + commandQueryProxies = 5 ) var handlers map[int]func(*net.UnixConn) = make(map[int]func(*net.UnixConn)) @@ -23,6 +24,7 @@ func init() { handlers[commandTunStop] = handleTunStop // tun.go handlers[commandProfileDefault] = handleProfileDefault // profile.go handlers[commandProfileReload] = handleProfileReload // profile.go + handlers[commandQueryProxies] = handleQueryProxies } // Start local control server @@ -64,4 +66,6 @@ func handleConnection(client *net.UnixConn) { } handler(client) + + client.Close() } diff --git a/core/src/main/golang/server/tun.go b/core/src/main/golang/server/tun.go index 929796b..6be593e 100644 --- a/core/src/main/golang/server/tun.go +++ b/core/src/main/golang/server/tun.go @@ -49,11 +49,5 @@ func handleTunStart(client *net.UnixConn) { } func handleTunStop(client *net.UnixConn) { - buf, _ := readCommandPacket(client) - - if tunCommandEnd != binary.BigEndian.Uint32(buf) { - log.Warnln("Invalid tun command end") - } - tun.StopTunProxy() } diff --git a/core/src/main/golang/tun/tun.go b/core/src/main/golang/tun/tun.go index ebe8bfb..c7133cf 100644 --- a/core/src/main/golang/tun/tun.go +++ b/core/src/main/golang/tun/tun.go @@ -52,6 +52,8 @@ func StartTunProxy(fd, mtu int) error { // StopTunProxy - stop func StopTunProxy() { + log.Infoln("Tun Device Stopped") + instance.close() instance = nil } diff --git a/core/src/main/java/com/github/kr328/clash/core/BaseClash.kt b/core/src/main/java/com/github/kr328/clash/core/BaseClash.kt new file mode 100644 index 0000000..02e8642 --- /dev/null +++ b/core/src/main/java/com/github/kr328/clash/core/BaseClash.kt @@ -0,0 +1,56 @@ +package com.github.kr328.clash.core + +import android.net.LocalSocket +import android.net.LocalSocketAddress +import java.io.DataInputStream +import java.io.DataOutputStream +import java.io.File +import java.io.IOException + +abstract class BaseClash(private val controllerPath: File) { + protected fun runControl( + command: Int, + block: (LocalSocket, DataInputStream, DataOutputStream) -> R + ): R { + val socket = LocalSocket() + + socket.connect( + LocalSocketAddress( + controllerPath.absolutePath, + LocalSocketAddress.Namespace.FILESYSTEM + ) + ) + + val input = DataInputStream(socket.inputStream) + val output = DataOutputStream(socket.outputStream) + + output.writeInt(command) + + val result = block(socket, input, output) + + runCatching { + socket.close() + } + + return result + } + + protected fun runControl(command: Int) { + return runControl(command) { _, _, _ -> } + } + + + protected fun DataOutputStream.writeString(string: String) { + this.writeInt(string.length) + this.writeBytes(string) + } + + protected fun DataInputStream.readString(): String { + val len = this.readInt() + val buffer = ByteArray(len) + + this.read(buffer) + + return String(buffer) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/github/kr328/clash/core/Clash.kt b/core/src/main/java/com/github/kr328/clash/core/Clash.kt index 2eff840..5320c98 100644 --- a/core/src/main/java/com/github/kr328/clash/core/Clash.kt +++ b/core/src/main/java/com/github/kr328/clash/core/Clash.kt @@ -1,28 +1,29 @@ package com.github.kr328.clash.core import android.content.Context -import android.net.LocalSocket -import android.net.LocalSocketAddress import android.util.Log +import com.github.kr328.clash.core.Constants.TAG import org.json.JSONObject import java.io.* class Clash( context: Context, clashDir: File, - private val controllerPath: File, + controllerPath: File, listener: (ClashProcessStatus) -> Unit -) : ClashProcess(context, clashDir, controllerPath, listener) { +) : BaseClash(controllerPath) { companion object { const val COMMAND_PING = 0 const val COMMAND_TUN_START = 1 const val COMMAND_TUN_STOP = 2 - const val COMMAND_PROFILE_DEFAULT = 3 const val COMMAND_PROFILE_RELOAD = 4 + const val COMMAND_QUERY_PROXIES = 5 const val PING_REPLY = 233 } + val process = ClashProcess(context, clashDir, controllerPath, listener) + fun ping(): Boolean { try { return runControl(COMMAND_PING) { _, input, _ -> @@ -34,8 +35,6 @@ class Clash( return false } - @Throws(IOException::class) - @Synchronized fun loadProfile(file: File) { runControl(COMMAND_PROFILE_RELOAD) { _, input, output -> output.writeString(JSONObject().apply { @@ -49,7 +48,6 @@ class Clash( } } - @Throws(IOException::class) fun startTunDevice(fd: FileDescriptor, mtu: Int) { runControl(COMMAND_TUN_START) { socket, _, output -> socket.setFileDescriptorsForSend(arrayOf(fd)) @@ -60,49 +58,7 @@ class Clash( } } - private fun runControl( - command: Int, - block: (LocalSocket, DataInputStream, DataOutputStream) -> R - ): R { - val socket = LocalSocket() - - socket.connect( - LocalSocketAddress( - controllerPath.absolutePath, - LocalSocketAddress.Namespace.FILESYSTEM - ) - ) - - val input = DataInputStream(socket.inputStream) - val output = DataOutputStream(socket.outputStream) - - output.writeInt(command) - - val result = block(socket, input, output) - - try { - input.close() - output.close() - - socket.close() - } catch (ignore: IOException) { - - } - - return result - } - - private fun DataOutputStream.writeString(string: String) { - this.writeInt(string.length) - this.writeBytes(string) - } - - private fun DataInputStream.readString(): String { - val len = this.readInt() - val buffer = ByteArray(len) - - this.read(buffer) - - return String(buffer) + fun stopTunDevice() { + runControl(COMMAND_TUN_STOP) } } \ No newline at end of file diff --git a/core/src/main/java/com/github/kr328/clash/core/ClashProcess.kt b/core/src/main/java/com/github/kr328/clash/core/ClashProcess.kt index faedee7..13647f8 100644 --- a/core/src/main/java/com/github/kr328/clash/core/ClashProcess.kt +++ b/core/src/main/java/com/github/kr328/clash/core/ClashProcess.kt @@ -2,19 +2,18 @@ package com.github.kr328.clash.core import android.content.Context import android.util.Log +import com.github.kr328.clash.core.Constants.TAG import java.io.File import java.io.FileOutputStream import java.io.IOException import java.lang.Exception import kotlin.concurrent.thread -abstract class ClashProcess(private val context: Context, +class ClashProcess(private val context: Context, private val clashDir: File, private val controllerPath: File, private val listener: (ClashProcessStatus) -> Unit) { companion object { - const val TAG = "ClashForAndroid" - private const val CONTROLLER_STATUS_PREFIX = "[CONTROLLER]" private val PID_PATTERN = Regex("\\[PID]\\s*(\\d+)") diff --git a/core/src/main/java/com/github/kr328/clash/core/Constants.kt b/core/src/main/java/com/github/kr328/clash/core/Constants.kt new file mode 100644 index 0000000..e12fd69 --- /dev/null +++ b/core/src/main/java/com/github/kr328/clash/core/Constants.kt @@ -0,0 +1,5 @@ +package com.github.kr328.clash.core + +object Constants { + const val TAG = "ClashForAndroid" +} \ No newline at end of file diff --git a/service/src/main/java/com/github/kr328/clash/service/ClashService.kt b/service/src/main/java/com/github/kr328/clash/service/ClashService.kt index ced3413..9d93f9f 100644 --- a/service/src/main/java/com/github/kr328/clash/service/ClashService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/ClashService.kt @@ -22,7 +22,7 @@ import java.util.concurrent.Executors class ClashService : Service() { companion object { - private val TAG = "ClashForAndroid" + private const val TAG = "ClashForAndroid" private const val CLASH_STATUS_NOTIFICATION_CHANNEL = "clash_status_channel" private const val CLASH_STATUS_NOTIFICATION_ID = 413 @@ -100,7 +100,7 @@ class ClashService : Service() { } override fun stopTunDevice() { - clash.stop() + clash.stopTunDevice() handler.post(this@ClashService::updateNotification) } 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 f7e43e5..82e7744 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 @@ -82,8 +82,8 @@ class TunService : VpnService() { .addAddress(PRIVATE_VLAN6_CLIENT, 126) .addDefaultDns() .addDisallowedApplication(packageName) - .addRoute("0.0.0.0", 0) - .addRoute("::", 0) + .addDns() + .addBypassPrivateRoute() .setMtu(VPN_MTU) .setBlocking(false) .setMeteredCompat(false) @@ -129,4 +129,25 @@ class TunService : VpnService() { setMetered(isMetered) return this } + + private fun Builder.addBypassPrivateRoute(): Builder { + // IPv4 + resources.getStringArray(R.array.bypass_private_route).forEach { + val address = it.split("/") + Log.d(TAG, "$address") + addRoute(address[0], address[1].toInt()) + } + + // IPv6 + addRoute("::", 0) + + return this + } + + private fun Builder.addDns(): Builder { + resources.getStringArray(R.array.default_dns).forEach { + addDnsServer(it) + } + return this + } } \ No newline at end of file diff --git a/service/src/main/java/com/github/kr328/clash/service/net/DefaultNetworkObserver.kt b/service/src/main/java/com/github/kr328/clash/service/net/DefaultNetworkObserver.kt index 3ea1e71..877e8cd 100644 --- a/service/src/main/java/com/github/kr328/clash/service/net/DefaultNetworkObserver.kt +++ b/service/src/main/java/com/github/kr328/clash/service/net/DefaultNetworkObserver.kt @@ -48,11 +48,10 @@ class DefaultNetworkObserver(val context: Context, val listener: (Network?) -> U fun register() { connectivity.registerNetworkCallback(NetworkRequest.Builder().build(), callback) - listener(connectivity.activeNetwork) - handler.postDelayed({ blocking = false - }, 1000) + listener(connectivity.activeNetwork) + }, 3000) } fun unregister() { diff --git a/service/src/main/res/drawable/ic_notification_icon.png b/service/src/main/res/drawable/ic_notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9efd87e5869fa120c2b30b450e9faad2a9fee6a4 GIT binary patch literal 4001 zcmV;S4_@$zP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Re3lHq)$0dI0nQ~}STcbWhI4wy+q zK~#9!?OcC!RmGkE%zZzTKoCfP1QLEE5G)8NwGbB-J*};^)}z#FyTx`rd$69}p4PTn zJ?^e-x9hrfk5;=_XlrdNJ@jBL{b5V(R$PlLwiJ*+ARsY>M3R_<{Cq#|+?o0AAMf7# z?!E74lJ^Kb$H|#@--^Mq6HdU=w4E@}<>^#Z>zdu}%>-C`ES-$J853Haxm?vH-gA z3r~ke1a?WVJEf%0-1F%6Ib)$O8c2O3{8sBb0X0&x-(7y^e^yThNN2kAe-(I6Q03t$!8`n-cNDn;o z+se2h8VCf7IRFq+UDMRm`cD@MpxZa^3`XMmw+R#=#}gAmHWE?ZV=oFw$4cJHo9$#}IKst52?QTQJ)z)u|hnQ|G-n?~J#iW8XJQBUqoZAWJ$g%Di z1)_$&?Zz)W9V#Y3H{JWp^wGHSFHSzJt5Ou&*VMgY(m*027UO(%f+3SZax*Fwtvu5i z`BE`KI@>#RpHfuiV9fdgfG|7~Tb*xT1qbOM;E!{$JPC}`97zJD8^*(HKlkK%yk0dV$gz%Xlh^o=wrnIsiXh=eM+h6j+-T~ zCO=$=6-4CAr$2w889Z>Jqd`a&VvM;!aWkAK7gFB7;?8ewY5M5{djX*S#-~HRK>ti( z_!hz^W`VRyB37nI1_|WTG#}T%bTBm}B=rXTT8{>t4TLe={K94q03ZI+wyL*UyEhRL z7(;R*yOtXe*ZKVacy9L$0KFF+q=BK~6(CdLGV_DT_J0Vjr>c#PM4w*x(MR?GSR<)_ zsW4~;AQ_}JLIS|Rz(9&1O?n1E2n7Jr7)Aerk3Mpm0dKaw-BYE6ng+%a3WM2HTFB%)5J%>ED+5i;3{s&)TX4|_oc+g zz))l*fY)=~sh~26h%}vx_faOzmT2TDOXp`&hH__J4*xWbR!w9DfIvjhg^`yTP|%sQ ze}894=e#b#1Y9zKEJj^ZESDpmx1*k!hEji64^bFuIT5j35rKk&^!o#ER&qnymaN50 zLWrj_nJ!tYg0b9D9Lq?}q$8|4Z+k20I$sJP0Dxz^PeGU4k+#lyB~`#}n*ez&4|^c_ z0h9oM*)+NPb?{;?JwwQ8_x$sZYI4yQbS9l2j4X8tZNO4)PIi%fsWHb)V|ml0wzB|K zPNZDl3FLdLt9L1Y)(ZwwJkA?Z>=PF_>AvUNZmcwvp;@w?h!BbJXt;uDx2UeyCu2rlLo#t~T)D^v5CE)RHXj>4v^pbAYRY7!Ca!niw$26!NEn=V z-?|RXX?GMk4uq z8WvQ~G!08He*{CyOD$1RG>`!Jxo#}TWg{JXt0S!(KX$4khmE81wuO$K>P+dM8v-qD z=TgA2cr^^89$7?BK|p%;h5b`?Zp?BTYA&$MeCT*Po_+B(7f>(1ehj~S<#0;d@#g1# zz843Mwb}hkrSSL}0vMELqM zzr-(IIh4?DoxRw9w&3dbH(*Z1G#otEhEwf5Zh`HILJ*PvU~_9d zfUcr})bUPlU1Ci$)53NHkvuD%h;XE(9Y*Tc7_nx^G0(HV)JTR;X{KX z4FL8Q4Wxm=$RbPqdm{jOo80;OvKU9Z6gtN&GM8N3;0>9Y7epq-d2FF26rF#Ca!h?1 z!{=_j8h)QvAV)WqN5c>qL7MPPA|kfx;}6!kmY7vH0q1tcv@%?`W*IuV`thlcH6pGX zcP@UZ$NtkkD|lo`^KYnDRC+#B$Sg&gYZ8ZDcZFhiu1} z28W}F#Nt@dP=oL7d=4xB7!0KlA?e#5{oaihtNO+w|${=)U z5@?cvL1$cv&uePx346ym(V3)iZp=+_Nr+slF2%P@54h)dv1!O58WKPWAwy68czX?i zmV$v~+DLP3L(;j%{widXTf-3%Ywze^G#-#LisR>hwtt2YqTIQ@6JTW^v8DT1#zEdw z4-@ahSq}H?8ji$LY^AgytzW<1e=<7vW>WYJh^+*uKj33u?fCO{S193ld*^H+WXJ}E z2n3d0XphH$^3oKd4-Yt28(r|+AkA;Q>++Tnxs`}MV0XY!S6MOR{&CMHrZ~&5T(P+G{(C<0-`=g@p}~R6kon1bmr*7fr=glpz4zFmm&Wy*990A%j78pPfDO{TwHt5KIp2=Np(X&pl+v)g zYs2-w{qo;`^1&%nf+xIV`M9=`l$}YbWWBe{-YQZ#X>#T9(74;%QA%y^f#wCyv1*@xrZKNc4Ds!DZqb@v+&3hu43nD`Q(69?6|KY$4 zxP8s4OWTnn{bBdvnNrHq#FJxVH1NhHJc>+XxhVu`hy^Z?G^WiWYoGwQVF&;+SC_44 z&sGQ_1I%GaCT>x**LsVTQsdpiFlt>Og+l?@4l00nEH>}Io_{_JAd;=?zTS~}fP(ie zP3KXYbeb!D8OA|l4Q#wL$+DDqw-hx_TS+UQ67F_Nc%2*NKm5_Yt8?K$G&)q38gE91 zYaRl3%ruxFP39~NQ4PR;%}ZOhWMLCLK1_dK@5AfYZ_euca$U|%ka$#a#-lTYu^pwM zJlkbDqCW=rF>g={>uIz2HKoCb2?TntNUNCy`zNqhvvRF z|EGG@C$55LaT5_EC95cDfF&9B9^}fWE?qgsNkbE$ag4w1Oqcy%DEy2u`Nm(GA3gC_ z`?c@(4VHSqSkF1%TeIMRr@7l-4Ny*9>J=MA zgtF4`AG=!*{RuD~T*jCpqHijpDjwVNlY56pBEEF!16 zNc(MYm-b?e#fj*NYu8@(`yIRXd~x@l{U3YdU~}bYB&KEV*wsU#?4o+1BwxJT1wPGZ z{|Af|6>ml#j}p;ACs&{d~SpM78d`N27nXnZOc(%;??e6kxdTTmO!Dd~amLvPAZTVy2(j$I;S<+2wYAp{H|87Zd=V=`?=HSLe& zS*NsKhWmjqjUnLoQ^4;>AmFE9FhIe8pF*J^g@OSU4h3a66qKbUVWXrZ#7j#;(X!I; z=+v^(q3M^D_spxF)v|II9sp`4cmV(*0Hpv*%VF00000NkvXX Hu0mjfBNk`J literal 0 HcmV?d00001 diff --git a/service/src/main/res/values/arrays.xml b/service/src/main/res/values/arrays.xml new file mode 100644 index 0000000..c859349 --- /dev/null +++ b/service/src/main/res/values/arrays.xml @@ -0,0 +1,169 @@ + + + + + 1.0.0.0/8 + 2.0.0.0/7 + 4.0.0.0/6 + 8.0.0.0/7 + 11.0.0.0/8 + 12.0.0.0/6 + 16.0.0.0/4 + 32.0.0.0/3 + 64.0.0.0/3 + 96.0.0.0/6 + 100.0.0.0/10 + 100.128.0.0/9 + 101.0.0.0/8 + 102.0.0.0/7 + 104.0.0.0/5 + 112.0.0.0/10 + 112.64.0.0/11 + 112.96.0.0/12 + 112.112.0.0/13 + 112.120.0.0/14 + 112.124.0.0/19 + 112.124.32.0/21 + 112.124.40.0/22 + 112.124.44.0/23 + 112.124.46.0/24 + 112.124.48.0/20 + 112.124.64.0/18 + 112.124.128.0/17 + 112.125.0.0/16 + 112.126.0.0/15 + 112.128.0.0/9 + 113.0.0.0/8 + 114.0.0.0/10 + 114.64.0.0/11 + 114.96.0.0/12 + 114.112.0.0/15 + 114.114.0.0/18 + 114.114.64.0/19 + 114.114.96.0/20 + 114.114.112.0/23 + 114.114.115.0/24 + 114.114.116.0/22 + 114.114.120.0/21 + 114.114.128.0/17 + 114.115.0.0/16 + 114.116.0.0/14 + 114.120.0.0/13 + 114.128.0.0/9 + 115.0.0.0/8 + 116.0.0.0/6 + 120.0.0.0/6 + 124.0.0.0/7 + 126.0.0.0/8 + 128.0.0.0/3 + 160.0.0.0/5 + 168.0.0.0/8 + 169.0.0.0/9 + 169.128.0.0/10 + 169.192.0.0/11 + 169.224.0.0/12 + 169.240.0.0/13 + 169.248.0.0/14 + 169.252.0.0/15 + 169.255.0.0/16 + 170.0.0.0/7 + 172.0.0.0/12 + 172.32.0.0/11 + 172.64.0.0/10 + 172.128.0.0/9 + 173.0.0.0/8 + 174.0.0.0/7 + 176.0.0.0/4 + 192.0.0.8/29 + 192.0.0.16/28 + 192.0.0.32/27 + 192.0.0.64/26 + 192.0.0.128/25 + 192.0.1.0/24 + 192.0.3.0/24 + 192.0.4.0/22 + 192.0.8.0/21 + 192.0.16.0/20 + 192.0.32.0/19 + 192.0.64.0/18 + 192.0.128.0/17 + 192.1.0.0/16 + 192.2.0.0/15 + 192.4.0.0/14 + 192.8.0.0/13 + 192.16.0.0/12 + 192.32.0.0/11 + 192.64.0.0/12 + 192.80.0.0/13 + 192.88.0.0/18 + 192.88.64.0/19 + 192.88.96.0/23 + 192.88.98.0/24 + 192.88.100.0/22 + 192.88.104.0/21 + 192.88.112.0/20 + 192.88.128.0/17 + 192.89.0.0/16 + 192.90.0.0/15 + 192.92.0.0/14 + 192.96.0.0/11 + 192.128.0.0/11 + 192.160.0.0/13 + 192.169.0.0/16 + 192.170.0.0/15 + 192.172.0.0/14 + 192.176.0.0/12 + 192.192.0.0/10 + 193.0.0.0/8 + 194.0.0.0/7 + 196.0.0.0/7 + 198.0.0.0/12 + 198.16.0.0/15 + 198.18.0.0/16 + 198.20.0.0/14 + 198.24.0.0/13 + 198.32.0.0/12 + 198.48.0.0/15 + 198.50.0.0/16 + 198.51.0.0/18 + 198.51.64.0/19 + 198.51.96.0/22 + 198.51.101.0/24 + 198.51.102.0/23 + 198.51.104.0/21 + 198.51.112.0/20 + 198.51.128.0/17 + 198.52.0.0/14 + 198.56.0.0/13 + 198.64.0.0/10 + 198.128.0.0/9 + 199.0.0.0/8 + 200.0.0.0/7 + 202.0.0.0/8 + 203.0.0.0/18 + 203.0.64.0/19 + 203.0.96.0/20 + 203.0.112.0/24 + 203.0.114.0/23 + 203.0.116.0/22 + 203.0.120.0/21 + 203.0.128.0/17 + 203.1.0.0/16 + 203.2.0.0/15 + 203.4.0.0/14 + 203.8.0.0/13 + 203.16.0.0/12 + 203.32.0.0/11 + 203.64.0.0/10 + 203.128.0.0/9 + 204.0.0.0/6 + 208.0.0.0/4 + + + + 119.29.29.29 + 223.5.5.5 + 1.1.1.1 + 8.8.8.8 + + \ No newline at end of file