From 85532a6b4826a3fe2803b5a1059b8772f1abf13a Mon Sep 17 00:00:00 2001 From: "V.E.O" Date: Sat, 15 Apr 2017 12:32:14 +0800 Subject: [PATCH] Add multiple remote dns support and remove alternative dns in global mode (#1217) * Add multiple remote dns support. Remove alternative dns in global mode. * Remove a redundant comment --- .../com/github/shadowsocks/BaseService.scala | 22 ++++++++++++------- .../shadowsocks/ShadowsocksNatService.scala | 2 +- .../shadowsocks/ShadowsocksVpnService.scala | 12 +++++----- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala b/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala index e84e7a6a..542d35ad 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -21,7 +21,6 @@ package com.github.shadowsocks import java.io.{File, IOException} -import java.net.InetAddress import java.util import java.util.concurrent.TimeUnit import java.util.{Timer, TimerTask} @@ -365,18 +364,25 @@ trait BaseService extends Service { makeDns("Primary-1", "119.29.29.29", edns = false), makeDns("Primary-2", "114.114.114.114", edns = false) ))) - .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", - buildRemoteDns(profile.remoteDns.trim)))) + .put("AlternativeDNS", new JSONArray( + for (remoteDns <- profile.remoteDns.split(",")) + yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim) + ))) .put("IPNetworkFile", "china_ip_list.txt") .put("DomainFile", "gfwlist.txt") case Acl.CHINALIST => config .put("PrimaryDNS", new JSONArray().put(makeDns("Primary", "119.29.29.29"))) - .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", - buildRemoteDns(profile.remoteDns.trim)))) + .put("AlternativeDNS", new JSONArray( + for (remoteDns <- profile.remoteDns.split(",")) + yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim) + ))) case _ => config - .put("PrimaryDNS", new JSONArray().put(makeDns("Primary", - buildRemoteDns(profile.remoteDns.trim)))) - .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", "208.67.222.222"))) + .put("PrimaryDNS", new JSONArray( + for (remoteDns <- profile.remoteDns.split(",")) + yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim) + ))) + // no need to setup AlternativeDNS in Acl.ALL/BYPASS_LAN mode + .put("OnlyPrimaryDNS", true) } IOUtils.writeString(new File(getFilesDir, file), config.toString) file diff --git a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index ef105f73..faac923d 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -74,7 +74,7 @@ class ShadowsocksNatService extends BaseService { "-t", "10", "-b", "127.0.0.1", "-l", (profile.localPort + 63).toString, - "-L", profile.remoteDns.trim + ":53", + "-L", profile.remoteDns.split(",")(0).trim + ":53", "-c", buildShadowsocksConfig("ss-tunnel-nat.conf")) if (profile.udpdns) cmd.append("-u") diff --git a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 8812c447..e3bbdc47 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -223,11 +223,13 @@ class ShadowsocksVpnService extends VpnService with BaseService { val subnet = Subnet.fromString(cidr) builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize) }) - val addr = InetAddress.getByName(profile.remoteDns.trim) - if (addr.isInstanceOf[Inet6Address]) - builder.addRoute(addr, 128) - else if (addr.isInstanceOf[InetAddress]) - builder.addRoute(addr, 32) + profile.remoteDns.split(",").foreach(remoteDns => { + val addr = InetAddress.getByName(remoteDns.trim) + if (addr.isInstanceOf[Inet6Address]) + builder.addRoute(addr, 128) + else if (addr.isInstanceOf[InetAddress]) + builder.addRoute(addr, 32) + }) } conn = builder.establish()