From 4e694dc9030018dce16a40abe9d1cc1222f00071 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 14 May 2026 23:35:43 +0300 Subject: [PATCH] Fix Android VPN traffic from external apps --- clients/android/app/build.gradle | 4 ++-- .../src/main/java/su/cin/rapvpn/RapVpnService.java | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/clients/android/app/build.gradle b/clients/android/app/build.gradle index 5323438..73ca0bf 100644 --- a/clients/android/app/build.gradle +++ b/clients/android/app/build.gradle @@ -30,8 +30,8 @@ android { applicationId "su.cin.rapvpn" minSdk 26 targetSdk 35 - versionCode 182 - versionName "0.2.182" + versionCode 183 + versionName "0.2.183" buildConfigField "String", "DEFAULT_BACKEND_URL", "\"${normalizeGradleString(defaultBackendUrl)}\"" buildConfigField "String", "DEFAULT_CLUSTER_ID", "\"${normalizeGradleString(defaultClusterId)}\"" buildConfigField "String", "DEFAULT_ORGANIZATION_ID", "\"${normalizeGradleString(defaultOrganizationId)}\"" diff --git a/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java b/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java index 6b8f489..400a489 100644 --- a/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java +++ b/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java @@ -1771,11 +1771,15 @@ public class RapVpnService extends VpnService { byte[] copy = new byte[length]; System.arraycopy(packet, 0, copy, 0, length); if (!hasIPv4Source(copy, length)) { - long mismatch = uplinkSourceMismatchPackets.incrementAndGet(); - Log.w(TAG, "vpn uplink source is not vpn address; dropping " + packetSummary(copy, length)); - writeRuntimeDetail("source_drop", packetSummary(copy, length), "uplink", -1, mismatch, "SOURCE_MISMATCH"); - recordUplinkDrop(length); - return; + String natKey = natKeyForOutboundReturn(copy, length); + if (natKey.isEmpty() || !rewriteIPv4SourceToVPN(copy, length, natKey)) { + long mismatch = uplinkSourceMismatchPackets.incrementAndGet(); + Log.w(TAG, "vpn uplink source is not vpn address; dropping " + packetSummary(copy, length)); + writeRuntimeDetail("source_drop", packetSummary(copy, length), "uplink", -1, mismatch, "SOURCE_MISMATCH"); + recordUplinkDrop(length); + return; + } + writeRuntimeDetail("source_nat", packetSummary(copy, length), "uplink", -1, -1, ""); } if (clampIPv4TCPMSS(copy, length, VPN_TCP_MSS_CLAMP)) { writeRuntimeDetail("tcp_mss_clamp", packetSummary(copy, length), "uplink_tcp", -1, -1, "");