From cbd6755aa5b78eb52636612f0f5ef401ff5370d6 Mon Sep 17 00:00:00 2001 From: albexk Date: Sat, 27 Jan 2024 17:30:56 +0300 Subject: [PATCH] Fix OpenVpn over Cloak --- client/android/cloak/src/main/kotlin/Cloak.kt | 10 ++++++++++ .../kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt | 3 +++ .../org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt | 4 +--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/client/android/cloak/src/main/kotlin/Cloak.kt b/client/android/cloak/src/main/kotlin/Cloak.kt index 5a549130..651e353b 100644 --- a/client/android/cloak/src/main/kotlin/Cloak.kt +++ b/client/android/cloak/src/main/kotlin/Cloak.kt @@ -3,6 +3,9 @@ package org.amnezia.vpn.protocol.cloak import android.util.Base64 import net.openvpn.ovpn3.ClientAPI_Config import org.amnezia.vpn.protocol.openvpn.OpenVpn +import org.amnezia.vpn.protocol.openvpn.OpenVpnConfig +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.parseInetAddress import org.json.JSONObject /** @@ -51,6 +54,13 @@ class Cloak : OpenVpn() { return openVpnConfig } + override fun configPluggableTransport(configBuilder: OpenVpnConfig.Builder, config: JSONObject) { + // exclude remote server ip from vpn routes + val remoteServer = config.getString("hostName") + val remoteServerAddress = InetNetwork(parseInetAddress(remoteServer)) + configBuilder.excludeRoute(remoteServerAddress) + } + private fun checkCloakJson(cloakConfigJson: JSONObject): JSONObject { cloakConfigJson.put("NumConn", 1) cloakConfigJson.put("ProxyMethod", "openvpn") diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt index 34f2934b..9e1c62cc 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt @@ -77,6 +77,7 @@ open class OpenVpn : Protocol() { if (evalConfig.error) { throw BadConfigException("OpenVPN config parse error: ${evalConfig.message}") } + configPluggableTransport(configBuilder, config) configBuilder.configSplitTunneling(config) scope.launch { @@ -111,6 +112,8 @@ open class OpenVpn : Protocol() { return openVpnConfig } + protected open fun configPluggableTransport(configBuilder: OpenVpnConfig.Builder, config: JSONObject) {} + private fun makeEstablish(vpnBuilder: Builder): (OpenVpnConfig.Builder) -> Int = { configBuilder -> val openVpnConfig = configBuilder.build() buildVpnInterface(openVpnConfig, vpnBuilder) diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt index f489c980..4f0f1796 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt @@ -91,9 +91,7 @@ class OpenVpnClient( // metric is optional and should be ignored if < 0 override fun tun_builder_exclude_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { Log.d(TAG, "tun_builder_exclude_route: $address, $prefix_length, $metric, $ipv6") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - configBuilder.excludeRoute(InetNetwork(address, prefix_length)) - } + configBuilder.excludeRoute(InetNetwork(address, prefix_length)) return true }