From 95c32977fa81cc59a6775a07faac81eb6e038200 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Tue, 17 Jun 2025 21:58:52 +0800 Subject: [PATCH] Adds tag resolver supports --- .../CoreConfig/CoreConfigSingboxService.cs | 58 +++++++++++++------ 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs index 0fe12b8d..ea3bf117 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs @@ -651,9 +651,10 @@ public class CoreConfigSingboxService if (Utils.IsDomain(node.Address)) { var item = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); + var localDnsAddress = string.IsNullOrEmpty(item?.DomainDNSAddress) ? Global.SingboxDomainDNSAddress.FirstOrDefault() : item?.DomainDNSAddress; outbound.domain_resolver = new() { - server = "local_local", + server = localDnsAddress.StartsWith("tag://") ? localDnsAddress.Substring(6) : "local_resolver", strategy = string.IsNullOrEmpty(item?.DomainStrategy4Freedom) ? null : item?.DomainStrategy4Freedom }; } @@ -790,9 +791,10 @@ public class CoreConfigSingboxService if (Utils.IsDomain(node.Address)) { var item = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); + var localDnsAddress = string.IsNullOrEmpty(item?.DomainDNSAddress) ? Global.SingboxDomainDNSAddress.FirstOrDefault() : item?.DomainDNSAddress; endpoint.domain_resolver = new() { - server = "local_local", + server = localDnsAddress.StartsWith("tag://") ? localDnsAddress.Substring(6) : "local_resolver", strategy = string.IsNullOrEmpty(item?.DomainStrategy4Freedom) ? null : item?.DomainStrategy4Freedom }; } @@ -1613,26 +1615,48 @@ public class CoreConfigSingboxService dns4Sbox.servers ??= []; dns4Sbox.rules ??= []; - var tag = "local_local"; + var tag = "local_resolver"; var localDnsAddress = string.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.SingboxDomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress; - var (dnsType, dnsHost, dnsPort, dnsPath) = ParseDnsAddress(localDnsAddress); - - dns4Sbox.servers.Add(new() + if (localDnsAddress.StartsWith("tag://")) { - tag = tag, - type = dnsType, - server = dnsHost, - Interface = dnsType == "dhcp" ? dnsHost : null, - server_port = dnsPort, - path = dnsPath - }); + tag = localDnsAddress.Substring(6); - dns4Sbox.rules.Insert(0, new() + var localDnsTag = "local_local"; + + dns4Sbox.servers.Add(new() + { + tag = localDnsTag, + type = "local" + }); + + dns4Sbox.rules.Insert(0, new() + { + server = localDnsTag, + clash_mode = ERuleMode.Direct.ToString() + }); + } + else { - server = tag, - clash_mode = ERuleMode.Direct.ToString() - }); + var (dnsType, dnsHost, dnsPort, dnsPath) = ParseDnsAddress(localDnsAddress); + + dns4Sbox.servers.Add(new() + { + tag = tag, + type = dnsType, + server = dnsHost, + Interface = dnsType == "dhcp" ? dnsHost : null, + server_port = dnsPort, + path = dnsPath + }); + + dns4Sbox.rules.Insert(0, new() + { + server = tag, + clash_mode = ERuleMode.Direct.ToString() + }); + } + dns4Sbox.rules.Insert(0, new() { server = dns4Sbox.servers.Where(t => t.detour == Global.ProxyTag).Select(t => t.tag).FirstOrDefault() ?? "remote",