diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreConfigManager.kt index 074c0fbe..ebc200ff 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreConfigManager.kt @@ -583,6 +583,34 @@ object CoreConfigManager { return domain } + /** + * Retrieves domain rules for custom outbound tags. + * + * Searches through all rulesets to find domains targeting any custom outbound tags. + * + * @return ArrayList of domain rules matching custom outbound tags + */ + private fun getCustomOutboundUserRule2Domain(): ArrayList { + val domain = ArrayList() + + val rulesetItems = MmkvManager.decodeRoutingRulesets() + rulesetItems?.forEach { key -> + if (key.enabled && !AppConfig.BUILTIN_OUTBOUND_TAGS.contains(key.outboundTag) + && !key.domain.isNullOrEmpty() + ) { + key.domain?.forEach { + if (it != AppConfig.GEOSITE_PRIVATE + && (it.startsWith("geosite:") || it.startsWith("domain:")) + ) { + domain.add(it) + } + } + } + } + + return domain + } + /** * Configures custom local DNS settings. * @@ -662,7 +690,7 @@ object CoreConfigManager { //remote Dns val remoteDns = SettingsManager.getRemoteDnsServers() - val proxyDomain = getUserRule2Domain(AppConfig.TAG_PROXY) + val proxyDomain = getUserRule2Domain(AppConfig.TAG_PROXY) + getCustomOutboundUserRule2Domain() remoteDns.forEach { servers.add(it) } @@ -678,18 +706,36 @@ object CoreConfigManager { // domestic DNS val domesticDns = SettingsManager.getDomesticDnsServers() val directDomain = getUserRule2Domain(AppConfig.TAG_DIRECT) - val isCnRoutingMode = directDomain.contains(AppConfig.GEOSITE_CN) - val geoipCn = arrayListOf(AppConfig.GEOIP_CN) - if (directDomain.isNotEmpty()) { + val finalDirectDomain = directDomain.filter { it != AppConfig.GEOSITE_CN } + val domesticDnsTags = mutableListOf() + domesticDns.forEachIndexed { index, element -> + val tag = AppConfig.TAG_DOMESTIC_DNS + index servers.add( V2rayConfig.DnsBean.ServersBean( - address = domesticDns.first(), - domains = directDomain, - expectIPs = if (isCnRoutingMode) geoipCn else null, + address = element, + domains = finalDirectDomain, skipFallback = true, - tag = AppConfig.TAG_DOMESTIC_DNS + tag = tag ) ) + domesticDnsTags.add(tag) + } + val isCnRoutingMode = directDomain.contains(AppConfig.GEOSITE_CN) + val geoipCn = arrayListOf(AppConfig.GEOIP_CN) + if (isCnRoutingMode) { + domesticDns.forEachIndexed { index, element -> + val geositeCnDnsTag = AppConfig.TAG_DOMESTIC_DNS + index + "_geosite_cn" + servers.add( + V2rayConfig.DnsBean.ServersBean( + address = element, + domains = arrayListOf(AppConfig.GEOSITE_CN), + expectIPs = geoipCn, + skipFallback = true, + tag = geositeCnDnsTag + ) + ) + domesticDnsTags.add(geositeCnDnsTag) + } } //block dns @@ -736,7 +782,7 @@ object CoreConfigManager { v2rayConfig.routing.rules.add( V2rayConfig.RoutingBean.RulesBean( outboundTag = AppConfig.TAG_DIRECT, - inboundTag = arrayListOf(AppConfig.TAG_DOMESTIC_DNS), + inboundTag = domesticDnsTags, domain = null ) )