From 69b0f7478fde2d9fc780adbbf739afad531c0c16 Mon Sep 17 00:00:00 2001 From: dv4mp1r3 Date: Tue, 7 Apr 2026 16:37:32 +0300 Subject: [PATCH] disabled mixed inbound in VPN-mode by default --- .../java/io/nekohasekai/sagernet/Constants.kt | 1 + .../io/nekohasekai/sagernet/bg/VpnService.kt | 2 +- .../sagernet/database/DataStore.kt | 1 + .../nekohasekai/sagernet/fmt/ConfigBuilder.kt | 20 ++++++++++--------- .../sagernet/ui/SettingsPreferenceFragment.kt | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/global_preferences.xml | 5 +++++ 8 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index caf363f6f..bbff1f106 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -42,6 +42,7 @@ object Key { const val SHOW_DIRECT_SPEED = "showDirectSpeed" const val APPEND_HTTP_PROXY = "appendHttpProxy" + const val REQUIRE_PROXY_IN_VPN = "requireProxyInVPN" const val CONNECTION_TEST_URL = "connectionTestURL" diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt index 751c14965..e8e395669 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt @@ -188,7 +188,7 @@ class VpnService : BaseVpnService(), } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && DataStore.appendHttpProxy) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && DataStore.appendHttpProxy && DataStore.requireProxyInVPN) { builder.setHttpProxy(ProxyInfo.buildDirectProxy(LOCALHOST, DataStore.mixedPort)) } diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt index 06bb50133..286d92f5c 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt @@ -155,6 +155,7 @@ object DataStore : OnPreferenceDataStoreChangeListener { val persistAcrossReboot by configurationStore.boolean(Key.PERSIST_ACROSS_REBOOT) { false } var appendHttpProxy by configurationStore.boolean(Key.APPEND_HTTP_PROXY) + var requireProxyInVPN by configurationStore.boolean(Key.REQUIRE_PROXY_IN_VPN) var connectionTestURL by configurationStore.string(Key.CONNECTION_TEST_URL) { CONNECTION_TEST_URL } var connectionTestConcurrent by configurationStore.int("connectionTestConcurrent") { 5 } var alwaysShowAddress by configurationStore.boolean(Key.ALWAYS_SHOW_ADDRESS) diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt index 8fe0a2944..4915e292b 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt @@ -224,15 +224,17 @@ fun buildConfig( } } }) - inbounds.add(Inbound_MixedOptions().apply { - type = "mixed" - tag = TAG_MIXED - listen = bind - listen_port = DataStore.mixedPort - domain_strategy = genDomainStrategy(DataStore.resolveDestination) - sniff = needSniff - sniff_override_destination = needSniffOverride - }) + if (!isVPN || DataStore.requireProxyInVPN) { + inbounds.add(Inbound_MixedOptions().apply { + type = "mixed" + tag = TAG_MIXED + listen = bind + listen_port = DataStore.mixedPort + domain_strategy = genDomainStrategy(DataStore.resolveDestination) + sniff = needSniff + sniff_override_destination = needSniffOverride + }) + } } outbounds = mutableListOf() diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt index 18d645455..5142303ce 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt @@ -61,6 +61,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { Theme.applyNightTheme() true } + val requireProxyInVPN = findPreference(Key.REQUIRE_PROXY_IN_VPN)!! val mixedPort = findPreference(Key.MIXED_PORT)!! val serviceMode = findPreference(Key.SERVICE_MODE)!! val allowAccess = findPreference(Key.ALLOW_ACCESS)!! @@ -148,6 +149,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { true } + requireProxyInVPN.onPreferenceChangeListener = reloadListener mixedPort.onPreferenceChangeListener = reloadListener appendHttpProxy.onPreferenceChangeListener = reloadListener showDirectSpeed.onPreferenceChangeListener = reloadListener diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bc8c4b2ae..da4e87de9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -39,6 +39,8 @@ NekoBox для Android Минимальная версия TLS протокола Версия +Локальный прокси в режиме VPN +Открывает локальный SOCKS/HTTP прокси-порт наряду с TUN-интерфейсом. Отключено по умолчанию для предотвращения обнаружения VPN через открытые порты. Добавить HTTP-прокси к VPN HTTP-прокси будет использоваться напрямую из (браузера / некоторых поддерживаемых приложений), без использования виртуального сетевого интерфейса (Android 10+) Применить diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1995ff051..9aa939d3a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -335,6 +335,8 @@ Connection refused Unreachable Timeout + Enable local proxy in VPN mode + Opens a local SOCKS/HTTP proxy port alongside the TUN interface. Disabled by default to prevent VPN detection via open ports. Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index 64f4f7901..dc9302bb7 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -189,6 +189,11 @@ +