Commit fbcf90e6 authored by Max Lv's avatar Max Lv

choose vpn's vlan smartly

parent 2eb0b193
...@@ -81,6 +81,9 @@ class ShadowVpnService extends VpnService { ...@@ -81,6 +81,9 @@ class ShadowVpnService extends VpnService {
val MSG_STOP_SELF: Int = 5 val MSG_STOP_SELF: Int = 5
val VPN_MTU = 1500 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 conn: ParcelFileDescriptor = null
var udpgw: String = null var udpgw: String = null
var notificationManager: NotificationManager = null var notificationManager: NotificationManager = null
...@@ -204,6 +207,8 @@ class ShadowVpnService extends VpnService { ...@@ -204,6 +207,8 @@ class ShadowVpnService extends VpnService {
def run() { def run() {
handler.sendEmptyMessage(MSG_CONNECT_START) handler.sendEmptyMessage(MSG_CONNECT_START)
killProcesses()
// Resolve server address // Resolve server address
var resolved: Boolean = false var resolved: Boolean = false
if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) { if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) {
...@@ -265,11 +270,16 @@ class ShadowVpnService extends VpnService { ...@@ -265,11 +270,16 @@ class ShadowVpnService extends VpnService {
val prefix2 = address.slice(0, 2).mkString(".") val prefix2 = address.slice(0, 2).mkString(".")
val prefix3 = address.slice(0, 3).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() val builder = new Builder()
builder builder
.setSession(getString(R.string.app_name)) .setSession(getString(R.string.app_name))
.setMtu(VPN_MTU) .setMtu(VPN_MTU)
.addAddress("172.16.0.1", 24) .addAddress(localAddress.format(1), 24)
.addDnsServer("8.8.8.8") .addDnsServer("8.8.8.8")
.addDnsServer("8.8.4.4") .addDnsServer("8.8.4.4")
...@@ -310,10 +320,14 @@ class ShadowVpnService extends VpnService { ...@@ -310,10 +320,14 @@ class ShadowVpnService extends VpnService {
val fd = conn.getFd val fd = conn.getFd
val cmd = (BASE + val cmd = (BASE +
"tun2socks --netif-ipaddr 172.16.0.2 --udpgw-remote-server-addr %s:7300 " + "tun2socks --netif-ipaddr %s "
"--netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:%d --tunfd %d --tunmtu %d --pid " + + "--udpgw-remote-server-addr %s:7300 "
BASE + + "--netif-netmask 255.255.255.0 "
"tun2socks.pid").format(udpgw, localPort, fd, VPN_MTU) + "--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) Log.d(TAG, cmd)
System.exec(cmd) System.exec(cmd)
...@@ -321,6 +335,7 @@ class ShadowVpnService extends VpnService { ...@@ -321,6 +335,7 @@ class ShadowVpnService extends VpnService {
/** Called when the activity is first created. */ /** Called when the activity is first created. */
def handleConnection: Boolean = { def handleConnection: Boolean = {
startShadowsocksDaemon() startShadowsocksDaemon()
startVpn() startVpn()
true true
...@@ -391,7 +406,7 @@ class ShadowVpnService extends VpnService { ...@@ -391,7 +406,7 @@ class ShadowVpnService extends VpnService {
} }
new Thread { new Thread {
override def run() { override def run() {
onDisconnect() killProcesses()
} }
}.start() }.start()
val ed: SharedPreferences.Editor = settings.edit val ed: SharedPreferences.Editor = settings.edit
...@@ -412,7 +427,7 @@ class ShadowVpnService extends VpnService { ...@@ -412,7 +427,7 @@ class ShadowVpnService extends VpnService {
super.onDestroy() super.onDestroy()
} }
def onDisconnect() { def killProcesses() {
val sb = new StringBuilder val sb = new StringBuilder
if (!waitForProcess("shadowsocks")) { if (!waitForProcess("shadowsocks")) {
sb ++= "kill -9 `cat /data/data/com.github.shadowsocks/shadowsocks.pid`" ++= "\n" sb ++= "kill -9 `cat /data/data/com.github.shadowsocks/shadowsocks.pid`" ++= "\n"
...@@ -437,4 +452,4 @@ class ShadowVpnService extends VpnService { ...@@ -437,4 +452,4 @@ class ShadowVpnService extends VpnService {
override def onRevoke() { override def onRevoke() {
stopSelf() stopSelf()
} }
} }
\ No newline at end of file
...@@ -201,6 +201,7 @@ class ShadowsocksService extends Service { ...@@ -201,6 +201,7 @@ class ShadowsocksService extends Service {
stopSelf() stopSelf()
return return
} }
appHost = settings.getString("proxy", "127.0.0.1") appHost = settings.getString("proxy", "127.0.0.1")
sitekey = settings.getString("sitekey", "default") sitekey = settings.getString("sitekey", "default")
encMethod = settings.getString("encMethod", "table") encMethod = settings.getString("encMethod", "table")
...@@ -229,6 +230,9 @@ class ShadowsocksService extends Service { ...@@ -229,6 +230,9 @@ class ShadowsocksService extends Service {
new Thread(new Runnable { new Thread(new Runnable {
def run() { def run() {
handler.sendEmptyMessage(MSG_CONNECT_START) handler.sendEmptyMessage(MSG_CONNECT_START)
killProcesses()
var resolved: Boolean = false var resolved: Boolean = false
if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) { if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) {
Utils.resolve(appHost, enableIPv6 = true) match { Utils.resolve(appHost, enableIPv6 = true) match {
...@@ -243,6 +247,7 @@ class ShadowsocksService extends Service { ...@@ -243,6 +247,7 @@ class ShadowsocksService extends Service {
Log.d(TAG, "IPTABLES: " + Utils.getIptables) Log.d(TAG, "IPTABLES: " + Utils.getIptables)
hasRedirectSupport = Utils.getHasRedirectSupport hasRedirectSupport = Utils.getHasRedirectSupport
if (resolved && handleConnection) { if (resolved && handleConnection) {
notifyForegroundAlert(getString(R.string.forward_success), notifyForegroundAlert(getString(R.string.forward_success),
getString(R.string.service_running)) getString(R.string.service_running))
...@@ -406,7 +411,7 @@ class ShadowsocksService extends Service { ...@@ -406,7 +411,7 @@ class ShadowsocksService extends Service {
stopForegroundCompat(1) stopForegroundCompat(1)
new Thread { new Thread {
override def run() { override def run() {
onDisconnect() killProcesses()
} }
}.start() }.start()
...@@ -424,7 +429,7 @@ class ShadowsocksService extends Service { ...@@ -424,7 +429,7 @@ class ShadowsocksService extends Service {
super.onDestroy() super.onDestroy()
} }
def onDisconnect() { def killProcesses() {
Utils.runRootCommand(Utils.getIptables + " -t nat -F OUTPUT") Utils.runRootCommand(Utils.getIptables + " -t nat -F OUTPUT")
val sb = new StringBuilder val sb = new StringBuilder
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment