From fbcf90e6dc0ef11505c07e40962d1893b96d900d Mon Sep 17 00:00:00 2001 From: Max Lv Date: Mon, 20 May 2013 10:55:36 +0800 Subject: [PATCH] choose vpn's vlan smartly --- .../github/shadowsocks/ShadowVpnService.scala | 31 ++++++++++++++----- .../shadowsocks/ShadowsocksService.scala | 9 ++++-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala index f1f720d9..64183629 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala @@ -81,6 +81,9 @@ class ShadowVpnService extends VpnService { val MSG_STOP_SELF: Int = 5 val VPN_MTU = 1500 + val PRIVATE_VLAN_10 = "10.254.254.%d" + val PRIVATE_VLAN_172 = "172.30.254.%d" + var conn: ParcelFileDescriptor = null var udpgw: String = null var notificationManager: NotificationManager = null @@ -204,6 +207,8 @@ class ShadowVpnService extends VpnService { def run() { handler.sendEmptyMessage(MSG_CONNECT_START) + killProcesses() + // Resolve server address var resolved: Boolean = false if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) { @@ -265,11 +270,16 @@ class ShadowVpnService extends VpnService { val prefix2 = address.slice(0, 2).mkString(".") val prefix3 = address.slice(0, 3).mkString(".") + val localAddress = Utils.getIPv4Address match { + case Some(ip) if ip.split('.')(0) == "172" => PRIVATE_VLAN_10 + case _ => PRIVATE_VLAN_172 + } + val builder = new Builder() builder .setSession(getString(R.string.app_name)) .setMtu(VPN_MTU) - .addAddress("172.16.0.1", 24) + .addAddress(localAddress.format(1), 24) .addDnsServer("8.8.8.8") .addDnsServer("8.8.4.4") @@ -310,10 +320,14 @@ class ShadowVpnService extends VpnService { val fd = conn.getFd val cmd = (BASE + - "tun2socks --netif-ipaddr 172.16.0.2 --udpgw-remote-server-addr %s:7300 " + - "--netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:%d --tunfd %d --tunmtu %d --pid " + - BASE + - "tun2socks.pid").format(udpgw, localPort, fd, VPN_MTU) + "tun2socks --netif-ipaddr %s " + + "--udpgw-remote-server-addr %s:7300 " + + "--netif-netmask 255.255.255.0 " + + "--socks-server-addr 127.0.0.1:%d " + + "--tunfd %d " + + "--tunmtu %d " + + "--pid %stun2socks.pid") + .format(localAddress.format(2), udpgw, localPort, fd, VPN_MTU, BASE) Log.d(TAG, cmd) System.exec(cmd) @@ -321,6 +335,7 @@ class ShadowVpnService extends VpnService { /** Called when the activity is first created. */ def handleConnection: Boolean = { + startShadowsocksDaemon() startVpn() true @@ -391,7 +406,7 @@ class ShadowVpnService extends VpnService { } new Thread { override def run() { - onDisconnect() + killProcesses() } }.start() val ed: SharedPreferences.Editor = settings.edit @@ -412,7 +427,7 @@ class ShadowVpnService extends VpnService { super.onDestroy() } - def onDisconnect() { + def killProcesses() { val sb = new StringBuilder if (!waitForProcess("shadowsocks")) { sb ++= "kill -9 `cat /data/data/com.github.shadowsocks/shadowsocks.pid`" ++= "\n" @@ -437,4 +452,4 @@ class ShadowVpnService extends VpnService { override def onRevoke() { stopSelf() } -} \ No newline at end of file +} diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksService.scala index 5205ea62..93b7d7e2 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksService.scala @@ -201,6 +201,7 @@ class ShadowsocksService extends Service { stopSelf() return } + appHost = settings.getString("proxy", "127.0.0.1") sitekey = settings.getString("sitekey", "default") encMethod = settings.getString("encMethod", "table") @@ -229,6 +230,9 @@ class ShadowsocksService extends Service { new Thread(new Runnable { def run() { handler.sendEmptyMessage(MSG_CONNECT_START) + + killProcesses() + var resolved: Boolean = false if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) { Utils.resolve(appHost, enableIPv6 = true) match { @@ -243,6 +247,7 @@ class ShadowsocksService extends Service { Log.d(TAG, "IPTABLES: " + Utils.getIptables) hasRedirectSupport = Utils.getHasRedirectSupport + if (resolved && handleConnection) { notifyForegroundAlert(getString(R.string.forward_success), getString(R.string.service_running)) @@ -406,7 +411,7 @@ class ShadowsocksService extends Service { stopForegroundCompat(1) new Thread { override def run() { - onDisconnect() + killProcesses() } }.start() @@ -424,7 +429,7 @@ class ShadowsocksService extends Service { super.onDestroy() } - def onDisconnect() { + def killProcesses() { Utils.runRootCommand(Utils.getIptables + " -t nat -F OUTPUT") val sb = new StringBuilder