diff --git a/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala b/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala index 2a40349b..e84e7a6a 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -25,6 +25,8 @@ import java.net.InetAddress import java.util import java.util.concurrent.TimeUnit import java.util.{Timer, TimerTask} +import java.net.InetAddress +import java.net.Inet6Address import android.app.Service import android.content.{BroadcastReceiver, Context, Intent, IntentFilter} @@ -330,6 +332,13 @@ trait BaseService extends Service { file } + private final def buildRemoteDns(remoteDns: String): String = { + val addr = InetAddress.getByName(remoteDns) + if (addr.isInstanceOf[Inet6Address]) + return "[" + remoteDns + "]" + remoteDns + } + protected final def buildOvertureConfig(file: String): String = { val config = new JSONObject() .put("BindAddress", ":" + (profile.localPort + 53)) @@ -356,14 +365,17 @@ 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", profile.remoteDns))) + .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", + buildRemoteDns(profile.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", profile.remoteDns))) + .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", + buildRemoteDns(profile.remoteDns.trim)))) case _ => config - .put("PrimaryDNS", new JSONArray().put(makeDns("Primary", profile.remoteDns))) + .put("PrimaryDNS", new JSONArray().put(makeDns("Primary", + buildRemoteDns(profile.remoteDns.trim)))) .put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", "208.67.222.222"))) } IOUtils.writeString(new File(getFilesDir, file), config.toString) diff --git a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 1963fadd..8812c447 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -22,6 +22,8 @@ package com.github.shadowsocks import java.io.File import java.util.Locale +import java.net.InetAddress +import java.net.Inet6Address import android.content._ import android.content.pm.PackageManager.NameNotFoundException @@ -189,7 +191,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { .setMtu(VPN_MTU) .addAddress(PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"), 24) - builder.addDnsServer(profile.remoteDns.trim) + builder.addDnsServer("8.8.8.8") // It's fake DNS for tun2socks, not the real remote DNS if (profile.ipv6) { builder.addAddress(PRIVATE_VLAN6.formatLocal(Locale.ENGLISH, "1"), 126) @@ -221,7 +223,11 @@ class ShadowsocksVpnService extends VpnService with BaseService { val subnet = Subnet.fromString(cidr) builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize) }) - builder.addRoute(profile.remoteDns.trim, 32) + val addr = InetAddress.getByName(profile.remoteDns.trim) + if (addr.isInstanceOf[Inet6Address]) + builder.addRoute(addr, 128) + else if (addr.isInstanceOf[InetAddress]) + builder.addRoute(addr, 32) } conn = builder.establish()