Android OpenVPN/Cloak Split tunnel
This commit is contained in:
parent
546d4c1d3d
commit
c14f1b5000
3 changed files with 29 additions and 45 deletions
|
@ -16,6 +16,8 @@ import com.wireguard.crypto.Key
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.util.Base64
|
import java.util.Base64
|
||||||
|
|
||||||
|
import com.wireguard.config.*
|
||||||
|
|
||||||
import net.openvpn.ovpn3.ClientAPI_Config
|
import net.openvpn.ovpn3.ClientAPI_Config
|
||||||
import net.openvpn.ovpn3.ClientAPI_EvalConfig
|
import net.openvpn.ovpn3.ClientAPI_EvalConfig
|
||||||
import net.openvpn.ovpn3.ClientAPI_Event
|
import net.openvpn.ovpn3.ClientAPI_Event
|
||||||
|
@ -147,45 +149,34 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna
|
||||||
|
|
||||||
override fun tun_builder_establish(): Int {
|
override fun tun_builder_establish(): Int {
|
||||||
Log.v(tag, "tun_builder_establish")
|
Log.v(tag, "tun_builder_establish")
|
||||||
val Fd = mService.establish()!!.detachFd()
|
|
||||||
|
|
||||||
val jsonVpnConfig = mService.getVpnConfig()
|
val jsonVpnConfig = mService.getVpnConfig()
|
||||||
|
|
||||||
val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType")
|
val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType")
|
||||||
val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites")
|
val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites")
|
||||||
|
if (splitTunnelType == 1) {
|
||||||
Log.e(tag, "splitTunnelSites $splitTunnelSites")
|
for (i in 0 until splitTunnelSites.length()) {
|
||||||
for (i in 0 until splitTunnelSites.length()) {
|
val site = splitTunnelSites.getString(i)
|
||||||
val site = splitTunnelSites.getString(i)
|
val ipRange = IPRange(site)
|
||||||
if (site.contains("\\/")) {
|
mService.addRoute(ipRange.getFrom().getHostAddress(), ipRange.getPrefix())
|
||||||
Log.e(tag, "site $site rawMask 32")
|
Log.e(tag, "splitTunnelSites $ipRange")
|
||||||
mService.addRoute(site, 32)
|
|
||||||
} else {
|
|
||||||
var slash = site.lastIndexOf('/');
|
|
||||||
var maskString: String = ""
|
|
||||||
var rawMask = 32
|
|
||||||
var rawAddress: String = ""
|
|
||||||
if (slash >= 0) {
|
|
||||||
maskString = site.substring(slash + 1)
|
|
||||||
try {
|
|
||||||
rawMask = Integer.parseInt(maskString, 10)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
|
|
||||||
}
|
|
||||||
rawAddress = site.substring(0, slash)
|
|
||||||
} else {
|
|
||||||
maskString = ""
|
|
||||||
rawMask = 32
|
|
||||||
rawAddress = site
|
|
||||||
}
|
|
||||||
Log.e(tag, "rawAddress $rawAddress rawMask $rawMask")
|
|
||||||
mService.addRoute(rawAddress, rawMask)
|
|
||||||
//val internet = InetNetwork.parse(site)
|
|
||||||
//peerBuilder.addAllowedIp(internet)
|
|
||||||
}
|
}
|
||||||
Log.e(tag, "splitTunnelSites $site")
|
|
||||||
}
|
}
|
||||||
|
if (splitTunnelType == 2) {
|
||||||
|
val ipRangeSet = IPRangeSet.fromString("0.0.0.0/0")
|
||||||
|
ipRangeSet.remove(IPRange("127.0.0.0/8"))
|
||||||
|
for (i in 0 until splitTunnelSites.length()) {
|
||||||
|
val site = splitTunnelSites.getString(i)
|
||||||
|
ipRangeSet.remove(IPRange(site))
|
||||||
|
}
|
||||||
|
ipRangeSet.subnets().forEach {
|
||||||
|
mService.addRoute(it.getFrom().getHostAddress(), it.getPrefix())
|
||||||
|
Thread.sleep(100)
|
||||||
|
Log.e(tag, "splitTunnelSites $it")
|
||||||
|
}
|
||||||
|
mService.addRoute("2000::", 3)
|
||||||
|
}
|
||||||
|
val Fd = mService.establish()!!.detachFd()
|
||||||
|
|
||||||
return Fd
|
return Fd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -612,13 +612,8 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
for (i in 0 until splitTunnelSites.length()) {
|
for (i in 0 until splitTunnelSites.length()) {
|
||||||
val site = splitTunnelSites.getString(i)
|
val site = splitTunnelSites.getString(i)
|
||||||
Log.e(tag, "splitTunnelSites $site")
|
Log.e(tag, "splitTunnelSites $site")
|
||||||
if (site.contains("\\/")) {
|
val internet = InetNetwork.parse(site)
|
||||||
val internet = InetNetwork.parse(site + "\\32")
|
peerBuilder.addAllowedIp(internet)
|
||||||
peerBuilder.addAllowedIp(internet)
|
|
||||||
} else {
|
|
||||||
val internet = InetNetwork.parse(site)
|
|
||||||
peerBuilder.addAllowedIp(internet)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (splitTunnelType == 2) {
|
if (splitTunnelType == 2) {
|
||||||
|
|
|
@ -125,8 +125,6 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig)
|
||||||
config.replace(regex, "");
|
config.replace(regex, "");
|
||||||
|
|
||||||
if (m_settings->routeMode() == Settings::VpnAllSites) {
|
if (m_settings->routeMode() == Settings::VpnAllSites) {
|
||||||
qDebug() << "Settings::VpnAllSites";
|
|
||||||
|
|
||||||
config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n");
|
config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n");
|
||||||
// Prevent ipv6 leak
|
// Prevent ipv6 leak
|
||||||
config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n");
|
config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n");
|
||||||
|
@ -138,9 +136,9 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig)
|
||||||
// no redirect-gateway
|
// no redirect-gateway
|
||||||
}
|
}
|
||||||
if (m_settings->routeMode() == Settings::VpnAllExceptSites) {
|
if (m_settings->routeMode() == Settings::VpnAllExceptSites) {
|
||||||
qDebug() << "Settings::VpnAllExceptSites";
|
#ifndef Q_OS_ANDROID
|
||||||
|
|
||||||
config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n");
|
config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n");
|
||||||
|
#endif
|
||||||
// Prevent ipv6 leak
|
// Prevent ipv6 leak
|
||||||
config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n");
|
config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n");
|
||||||
config.append("block-ipv6\n");
|
config.append("block-ipv6\n");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue