diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index 019a8d2..7372aba 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -18,10 +18,8 @@ object Key { const val REMOTE_DNS = "remoteDns" const val DIRECT_DNS = "directDns" - const val DIRECT_DNS_USE_SYSTEM = "directDnsUseSystem" const val ENABLE_DNS_ROUTING = "enableDnsRouting" const val ENABLE_FAKEDNS = "enableFakeDns" - const val DNS_NETWORK = "dnsNetwork" const val IPV6_MODE = "ipv6Mode" @@ -32,7 +30,6 @@ object Key { const val TRAFFIC_SNIFFING = "trafficSniffing" const val RESOLVE_DESTINATION = "resolveDestination" - const val RESOLVE_SERVER = "resolveServer" const val BYPASS_LAN = "bypassLan" const val BYPASS_LAN_IN_CORE = "bypassLanInCore" 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 2c91fd4..7a188b8 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt @@ -84,7 +84,6 @@ object DataStore : OnPreferenceDataStoreChangeListener { var trafficSniffing by configurationStore.stringToInt(Key.TRAFFIC_SNIFFING) { 1 } var resolveDestination by configurationStore.boolean(Key.RESOLVE_DESTINATION) - var resolveServer by configurationStore.boolean(Key.RESOLVE_SERVER) // var tcpKeepAliveInterval by configurationStore.stringToInt(Key.TCP_KEEP_ALIVE_INTERVAL) { 15 } var mtu by configurationStore.stringToInt(Key.MTU) { 9000 } @@ -98,10 +97,8 @@ object DataStore : OnPreferenceDataStoreChangeListener { var remoteDns by configurationStore.string(Key.REMOTE_DNS) { "https://8.8.8.8/dns-query" } var directDns by configurationStore.string(Key.DIRECT_DNS) { "https://223.5.5.5/dns-query" } - var directDnsUseSystem by configurationStore.boolean(Key.DIRECT_DNS_USE_SYSTEM) var enableDnsRouting by configurationStore.boolean(Key.ENABLE_DNS_ROUTING) { true } var enableFakeDns by configurationStore.boolean(Key.ENABLE_FAKEDNS) - var dnsNetwork by configurationStore.stringSet(Key.DNS_NETWORK) var rulesProvider by configurationStore.stringToInt(Key.RULES_PROVIDER) var logLevel by configurationStore.stringToInt(Key.LOG_LEVEL) 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 91fcc3d..268266d 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt @@ -32,7 +32,7 @@ import io.nekohasekai.sagernet.ktx.mkPort import io.nekohasekai.sagernet.utils.PackageCache import moe.matsuri.nb4a.Protocols import moe.matsuri.nb4a.SingBoxOptions.* -import moe.matsuri.nb4a.applyDNSNetworkSettings +import moe.matsuri.nb4a.SingBoxOptionsUtil import moe.matsuri.nb4a.checkEmpty import moe.matsuri.nb4a.makeSingBoxRule import moe.matsuri.nb4a.plugin.Plugins @@ -146,7 +146,7 @@ fun buildConfig( val bind = if (!forTest && DataStore.allowAccess) "0.0.0.0" else LOCALHOST val remoteDns = DataStore.remoteDns.split("\n") .mapNotNull { dns -> dns.trim().takeIf { it.isNotBlank() && !it.startsWith("#") } } - var directDNS = DataStore.directDns.split("\n") + val directDNS = DataStore.directDns.split("\n") .mapNotNull { dns -> dns.trim().takeIf { it.isNotBlank() && !it.startsWith("#") } } val enableDnsRouting = DataStore.enableDnsRouting val useFakeDns = DataStore.enableFakeDns && !forTest && DataStore.ipv6Mode != IPv6Mode.ONLY @@ -196,15 +196,18 @@ fun buildConfig( servers = mutableListOf() rules = mutableListOf() independent_cache = true + } - when (ipv6Mode) { - IPv6Mode.DISABLE -> { - strategy = "ipv4_only" - } - - IPv6Mode.ONLY -> { - strategy = "ipv6_only" - } + fun autoDnsDomainStrategy(s: String): String? { + if (s.isNotEmpty()) { + return s + } + return when (ipv6Mode) { + IPv6Mode.DISABLE -> "ipv4_only" + IPv6Mode.ENABLE -> "prefer_ipv4" + IPv6Mode.PREFER -> "prefer_ipv6" + IPv6Mode.ONLY -> "ipv6_only" + else -> null } } @@ -298,7 +301,7 @@ fun buildConfig( val chainTag = "c-$chainId" var muxApplied = false - var currentDomainStrategy = genDomainStrategy(DataStore.resolveServer) + val defaultServerDomainStrategy = SingBoxOptionsUtil.domainStrategy("server") profileList.forEachIndexed { index, proxyEntity -> val bean = proxyEntity.requireBean() @@ -427,11 +430,12 @@ fun buildConfig( // domain_strategy pastEntity?.requireBean()?.apply { // don't loopback - if (currentDomainStrategy != "" && !serverAddress.isIpAddress()) { + if (defaultServerDomainStrategy != "" && !serverAddress.isIpAddress()) { domainListDNSDirectForce.add("full:$serverAddress") } } - currentOutbound["domain_strategy"] = if (forTest) "" else currentDomainStrategy + currentOutbound["domain_strategy"] = + if (forTest) "" else defaultServerDomainStrategy // custom JSON merge if (bean.customOutboundJson.isNotBlank()) { @@ -597,12 +601,14 @@ fun buildConfig( } userDNSRuleList += makeDnsRuleObj().apply { server = "dns-remote" - inbound = null } } -2L -> { - userDNSRuleList += makeDnsRuleObj().apply { server = "dns-block" } + userDNSRuleList += makeDnsRuleObj().apply { + server = "dns-block" + disable_cache = true + } } } @@ -653,11 +659,6 @@ fun buildConfig( }.asMap()) } - if (DataStore.directDnsUseSystem) { - // finally able to use "localDns" now... - directDNS = listOf(LOCAL_DNS_SERVER) - } - // Bypass Lookup for the first profile bypassDNSBeans.forEach { var serverAddr = it.serverAddress @@ -695,7 +696,7 @@ fun buildConfig( address = it ?: throw Exception("No remote DNS, check your settings!") tag = "dns-remote" address_resolver = "dns-direct" - applyDNSNetworkSettings(false) + strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag)) }) } @@ -706,7 +707,7 @@ fun buildConfig( tag = "dns-direct" detour = TAG_DIRECT address_resolver = "dns-local" - applyDNSNetworkSettings(true) + strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag)) }) } dns.servers.add(DNSServerOptions().apply { 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 9b409c9..a2fd1a6 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt @@ -90,22 +90,9 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { val remoteDns = findPreference(Key.REMOTE_DNS)!! val directDns = findPreference(Key.DIRECT_DNS)!! - val directDnsUseSystem = findPreference(Key.DIRECT_DNS_USE_SYSTEM)!! val enableDnsRouting = findPreference(Key.ENABLE_DNS_ROUTING)!! val enableFakeDns = findPreference(Key.ENABLE_FAKEDNS)!! - // if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - // DataStore.directDnsUseSystem = false - // directDnsUseSystem.remove() - // } else { - directDns.isEnabled = !directDnsUseSystem.isChecked - directDnsUseSystem.setOnPreferenceChangeListener { _, newValue -> - directDns.isEnabled = !(newValue as Boolean) - needReload() - true - } - // } - val requireTransproxy = findPreference(Key.REQUIRE_TRANSPROXY)!! val transproxyPort = findPreference(Key.TRANSPROXY_PORT)!! val transproxyMode = findPreference(Key.TRANSPROXY_MODE)!! @@ -157,8 +144,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { entryValues = e } - val dnsNetwork = findPreference(Key.DNS_NETWORK)!! - portLocalDns.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) muxConcurrency.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) mixedPort.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) @@ -191,7 +176,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { val tunImplementation = findPreference(Key.TUN_IMPLEMENTATION)!! val resolveDestination = findPreference(Key.RESOLVE_DESTINATION)!! - val resolveServer = findPreference(Key.RESOLVE_SERVER)!! val acquireWakeLock = findPreference(Key.ACQUIRE_WAKE_LOCK)!! val enableClashAPI = findPreference(Key.ENABLE_CLASH_API)!! enableClashAPI.setOnPreferenceChangeListener { _, newValue -> @@ -214,7 +198,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { remoteDns.onPreferenceChangeListener = reloadListener directDns.onPreferenceChangeListener = reloadListener enableDnsRouting.onPreferenceChangeListener = reloadListener - dnsNetwork.onPreferenceChangeListener = reloadListener portLocalDns.onPreferenceChangeListener = reloadListener ipv6Mode.onPreferenceChangeListener = reloadListener @@ -224,7 +207,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { transproxyMode.onPreferenceChangeListener = reloadListener resolveDestination.onPreferenceChangeListener = reloadListener - resolveServer.onPreferenceChangeListener = reloadListener tunImplementation.onPreferenceChangeListener = reloadListener acquireWakeLock.onPreferenceChangeListener = reloadListener diff --git a/app/src/main/java/moe/matsuri/nb4a/SingBoxOptionsUtil.kt b/app/src/main/java/moe/matsuri/nb4a/SingBoxOptionsUtil.kt index e4186d9..872042f 100644 --- a/app/src/main/java/moe/matsuri/nb4a/SingBoxOptionsUtil.kt +++ b/app/src/main/java/moe/matsuri/nb4a/SingBoxOptionsUtil.kt @@ -2,14 +2,28 @@ package moe.matsuri.nb4a import io.nekohasekai.sagernet.database.DataStore -fun SingBoxOptions.DNSServerOptions.applyDNSNetworkSettings(isDirect: Boolean) { - if (isDirect) { - if (DataStore.dnsNetwork.contains("NoDirectIPv4")) this.strategy = "ipv6_only" - if (DataStore.dnsNetwork.contains("NoDirectIPv6")) this.strategy = "ipv4_only" - } else { - if (DataStore.dnsNetwork.contains("NoRemoteIPv4")) this.strategy = "ipv6_only" - if (DataStore.dnsNetwork.contains("NoRemoteIPv6")) this.strategy = "ipv4_only" +object SingBoxOptionsUtil { + + fun domainStrategy(tag: String): String { + fun auto2AsIs(key: String): String { + return (DataStore.configurationStore.getString(key) ?: "").replace("auto", "") + } + return when (tag) { + "dns-remote" -> { + auto2AsIs("domain_strategy_for_remote") + } + + "dns-direct" -> { + auto2AsIs("domain_strategy_for_direct") + } + + // server + else -> { + auto2AsIs("domain_strategy_for_server") + } + } } + } fun SingBoxOptions.DNSRule_DefaultOptions.makeSingBoxRule(list: List) { diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c48c746..5544121 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -80,8 +80,7 @@ Ajustes de DNS DNS remoto DNS directo - Utilizar DNS del sistema como DNS directo - Activar enrutamiento DNS + Activar enrutamiento DNS Resuelve dominios en rutas de omisión con el DNS directo. Tenga en cuenta las posibles fugas de DNS Activar DNS falso Puede hacer que sea necesario reiniciar otras aplicaciones para volver a conectarse a la red después de detener el proxy diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 41a30bd..6e83ecd 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -78,7 +78,6 @@ تنظیمات DNS DNS از راه دور DNS مستقیم - از DNS سیستم به عنوان Direct DNS استفاده کنید مسیریابی DNS را فعال کنید حل دامنه ها در مسیرهای بای پس با Direct DNS. از نشت های احتمالی DNS آگاه باشید FakeDNS را فعال کنید diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 50f05c8..9752488 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -334,7 +334,6 @@ 您确定要清空该分组吗\? 远程 DNS 直连 DNS - 使用系统 DNS 作为直连 DNS 启用 DNS 路由 使用直连 DNS 解析绕过路由中的 domains. 注意潜在的 DNS 泄漏 启用 FakeDNS @@ -442,7 +441,9 @@ 创建快捷方式 订阅最低 TLS 版本 端口跳跃间隔(秒) - DNS 查询类型 + 域名策略(远程) + 域名策略(直连) + 域名策略(服务器地址) 禁用 SNI 启用 0-RTT QUIC 握手 TCP 快速打开 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 119de5f..7975b23 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -445,10 +445,11 @@ - NoRemoteIPv4 - NoRemoteIPv6 - NoDirectIPv4 - NoDirectIPv6 + auto + prefer_ipv6 + prefer_ipv4 + ipv4_only + ipv6_only diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8965473..41d9473 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,7 +84,6 @@ DNS Settings Remote DNS Direct DNS - Use system DNS as Direct DNS Enable DNS Routing Resolve domains in bypass routes with Direct DNS. Be aware of potential DNS leaks Enable FakeDNS @@ -487,7 +486,9 @@ Anyone can write advanced plugins, which can control NekoBox. please download an Create Shortcut Subscription Min TLS Version Port Hopping Interval(second) - DNS query type + Domain strategy for Remote + Domain strategy for Direct + Domain strategy for Server address Show bottom bar like SagerNet uTLS fingerprint Custom outbound JSON diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index e6f5c8d..ac693cc 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -116,9 +116,6 @@ app:key="resolveDestination" app:summary="@string/resolve_destination_summary" app:title="@string/resolve_destination" /> - + - - +