From 97bd64ee9a917a46497577448a22dd09298cec5f Mon Sep 17 00:00:00 2001 From: DHR60 Date: Sat, 12 Jul 2025 16:59:52 +0800 Subject: [PATCH] fix --- .../CoreConfig/CoreConfigSingboxService.cs | 51 +++++---- .../CoreConfig/CoreConfigV2rayService.cs | 102 +++++++++++++----- .../Views/DNSSettingWindow.axaml.cs | 4 +- v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs | 4 +- 4 files changed, 107 insertions(+), 54 deletions(-) diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs index 7f29ce5d..993d8ad8 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs @@ -245,7 +245,7 @@ public class CoreConfigSingboxService singboxConfig.route.rules.Add(rule); } - await GenDns(singboxConfig); + await GenDnsDomains(singboxConfig, _config.DNSItem); //var dnsServer = singboxConfig.dns?.servers.FirstOrDefault(); //if (dnsServer != null) //{ @@ -317,7 +317,7 @@ public class CoreConfigSingboxService await GenOutbound(node, singboxConfig.outbounds.First()); } await GenMoreOutbounds(node, singboxConfig); - await GenDns(singboxConfig); + await GenDnsDomains(singboxConfig, _config.DNSItem); singboxConfig.route.rules.Clear(); singboxConfig.inbounds.Clear(); @@ -1230,8 +1230,7 @@ public class CoreConfigSingboxService { server = "outbound_resolver", strategy = item.SingboxStrategy4Direct - } - ; + }; if (_config.TunModeItem.EnableTun) { @@ -1582,7 +1581,7 @@ public class CoreConfigSingboxService singboxConfig.dns ??= new Dns4Sbox(); singboxConfig.dns.independent_cache = true; - singboxConfig.dns.final = "dns_remote"; // TODO + singboxConfig.dns.final = "dns_remote"; // TODO: Select fallback DNS server based on routing rules } catch (Exception ex) { @@ -1593,8 +1592,7 @@ public class CoreConfigSingboxService private async Task GenDnsServers(SingboxConfig singboxConfig, DNSItem dNSItem) { - var finalDns = ParseDnsAddress(dNSItem.SingboxFinalResolveDNS); - finalDns.tag = "final_resolver"; + var finalDns = await GenDnsDomains(singboxConfig, dNSItem); var directDns = ParseDnsAddress(dNSItem.DirectDNS); directDns.tag = "dns_direct"; @@ -1668,7 +1666,6 @@ public class CoreConfigSingboxService singboxConfig.dns.servers ??= new List(); singboxConfig.dns.servers.Add(remoteDns); singboxConfig.dns.servers.Add(directDns); - singboxConfig.dns.servers.Add(finalDns); singboxConfig.dns.servers.Add(resolverDns); singboxConfig.dns.servers.Add(hostsDns); @@ -1688,6 +1685,16 @@ public class CoreConfigSingboxService return await Task.FromResult(0); } + private async Task GenDnsDomains(SingboxConfig singboxConfig, DNSItem? dNSItem) + { + var finalDns = ParseDnsAddress(dNSItem.SingboxFinalResolveDNS); + finalDns.tag = "final_resolver"; + singboxConfig.dns ??= new Dns4Sbox(); + singboxConfig.dns.servers ??= new List(); + singboxConfig.dns.servers.Add(finalDns); + return await Task.FromResult(finalDns); + } + private async Task GenDnsRules(SingboxConfig singboxConfig, DNSItem dNSItem) { singboxConfig.dns ??= new Dns4Sbox(); @@ -1778,41 +1785,42 @@ public class CoreConfigSingboxService private static Server4Sbox? ParseDnsAddress(string address) { - if (string.IsNullOrEmpty(address)) + var addressFirst = address?.Split(address.Contains(',') ? ',' : ';').FirstOrDefault()?.Trim(); + if (string.IsNullOrEmpty(addressFirst)) { return null; } var server = new Server4Sbox(); - if (address is "local" or "localhost") + if (addressFirst is "local" or "localhost") { server.type = "local"; return server; } - if (address.StartsWith("dhcp://", StringComparison.OrdinalIgnoreCase)) + if (addressFirst.StartsWith("dhcp://", StringComparison.OrdinalIgnoreCase)) { - var interface_name = address.Substring(7); + var interface_name = addressFirst.Substring(7); server.type = "dhcp"; server.Interface = interface_name == "auto" ? null : interface_name; return server; } - if (!address.Contains("://")) + if (!addressFirst.Contains("://")) { // udp dns server.type = "udp"; - server.server = address; + server.server = addressFirst; return server; } try { - var protocolEndIndex = address.IndexOf("://", StringComparison.Ordinal); - server.type = address.Substring(0, protocolEndIndex).ToLower(); + var protocolEndIndex = addressFirst.IndexOf("://", StringComparison.Ordinal); + server.type = addressFirst.Substring(0, protocolEndIndex).ToLower(); - var uri = new Uri(address); + var uri = new Uri(addressFirst); server.server = uri.Host; if (!uri.IsDefaultPort) @@ -1827,11 +1835,11 @@ public class CoreConfigSingboxService } catch (UriFormatException) { - var protocolEndIndex = address.IndexOf("://", StringComparison.Ordinal); + var protocolEndIndex = addressFirst.IndexOf("://", StringComparison.Ordinal); if (protocolEndIndex > 0) { - server.type = address.Substring(0, protocolEndIndex).ToLower(); - var remaining = address.Substring(protocolEndIndex + 3); + server.type = addressFirst.Substring(0, protocolEndIndex).ToLower(); + var remaining = addressFirst.Substring(protocolEndIndex + 3); var portIndex = remaining.IndexOf(':'); var pathIndex = remaining.IndexOf('/'); @@ -1884,7 +1892,8 @@ public class CoreConfigSingboxService singboxConfig.experimental.cache_file = new CacheFile4Sbox() { enabled = true, - path = Utils.GetBinPath("cache.db") + path = Utils.GetBinPath("cache.db"), + store_fakeip = _config.DNSItem.FakeIP == true }; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs index 9f3c2b65..0374d74e 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs @@ -1164,6 +1164,32 @@ public class CoreConfigV2rayService private async Task GenDnsServers(ProfileItem? node, V2rayConfig v2rayConfig, DNSItem dNSItem) { + var directDNSAddress = dNSItem?.DirectDNS? + .Split(dNSItem.DirectDNS?.Contains(',') == true ? ',' : ';') + .Select(addr => addr.Trim()) + .Where(addr => !string.IsNullOrEmpty(addr)) + .Select(addr => addr.StartsWith("dhcp", StringComparison.OrdinalIgnoreCase) ? "localhost" : addr) + .Distinct() + .ToList(); + + if (directDNSAddress != null && directDNSAddress.Count == 0) + { + directDNSAddress = new() { Global.DomainDirectDNSAddress.FirstOrDefault() }; + } + + var remoteDNSAddress = dNSItem?.RemoteDNS? + .Split(dNSItem.RemoteDNS?.Contains(',') == true ? ',' : ';') + .Select(addr => addr.Trim()) + .Where(addr => !string.IsNullOrEmpty(addr)) + .Select(addr => addr.StartsWith("dhcp", StringComparison.OrdinalIgnoreCase) ? "localhost" : addr) + .Distinct() + .ToList(); + + if (remoteDNSAddress != null && remoteDNSAddress.Count == 0) + { + remoteDNSAddress = new() { Global.DomainRemoteDNSAddress.FirstOrDefault() }; + } + var directDomainList = new List(); var directGeositeList = new List(); var proxyDomainList = new List(); @@ -1258,45 +1284,63 @@ public class CoreConfigV2rayService if (proxyDomainList.Count > 0) { - var dnsServer = new DnsServer4Ray() + foreach (var dnsDomain in remoteDNSAddress) { - address = dNSItem.RemoteDNS, - skipFallback = true, - domains = proxyDomainList - }; - v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); - } - if (proxyGeositeList.Count > 0) - { - var dnsServer = new DnsServer4Ray() - { - address = dNSItem.RemoteDNS, - skipFallback = true, - domains = proxyGeositeList - }; - v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + var dnsServer = new DnsServer4Ray() + { + address = dnsDomain, + skipFallback = true, + domains = proxyDomainList + }; + v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + } } if (directDomainList.Count > 0) { - var dnsServer = new DnsServer4Ray() + foreach (var dnsDomain in directDNSAddress) { - address = dNSItem.DirectDNS, - skipFallback = true, - domains = directDomainList - }; - v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + var dnsServer = new DnsServer4Ray() + { + address = dnsDomain, + skipFallback = true, + domains = directDomainList + }; + v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + } + } + if (proxyGeositeList.Count > 0) + { + foreach (var dnsDomain in remoteDNSAddress) + { + var dnsServer = new DnsServer4Ray() + { + address = dnsDomain, + skipFallback = true, + domains = proxyGeositeList + }; + v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + } } if (directGeositeList.Count > 0) { - var dnsServer = new DnsServer4Ray() + foreach (var dnsDomain in directDNSAddress) { - address = dNSItem.DirectDNS, - skipFallback = true, - domains = directGeositeList - }; - v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + var dnsServer = new DnsServer4Ray() + { + address = dnsDomain, + skipFallback = true, + domains = directGeositeList + }; + v2rayConfig.dns.servers.Add(JsonUtils.SerializeToNode(dnsServer)); + } + } + + // fallback DNS server + // TODO: Select fallback DNS server based on routing rules + foreach (var dnsDomain in remoteDNSAddress) + { + v2rayConfig.dns.servers.Add(dnsDomain); } - v2rayConfig.dns.servers.Add(dNSItem.RemoteDNS); // fallback DNS server return await Task.FromResult(0); } diff --git a/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml.cs index c46d0db4..b1d0eb42 100644 --- a/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml.cs @@ -21,9 +21,9 @@ public partial class DNSSettingWindow : WindowBase cmbSBDirectDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbSBRemoteDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress; - cmbSBResolverDNS.ItemsSource = Global.DomainDirectDNSAddress.Concat(new[] { "dhcp://auto" }); + cmbSBResolverDNS.ItemsSource = Global.DomainDirectDNSAddress.Concat(new[] { "dhcp://auto,localhost" }); cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress; - cmbSBFinalResolverDNS.ItemsSource = Global.DomainPureIPDNSAddress; + cmbSBFinalResolverDNS.ItemsSource = Global.DomainPureIPDNSAddress.Concat(new[] { "dhcp://auto,localhost" }); this.WhenActivated(disposables => { diff --git a/v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs index 44039bd2..b7b107e4 100644 --- a/v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs @@ -21,9 +21,9 @@ public partial class DNSSettingWindow cmbSBDirectDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbSBRemoteDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress; - cmbSBResolverDNS.ItemsSource = Global.DomainDirectDNSAddress.Concat(new[] { "dhcp://auto" }); + cmbSBResolverDNS.ItemsSource = Global.DomainDirectDNSAddress.Concat(new[] { "dhcp://auto,localhost" }); cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress; - cmbSBFinalResolverDNS.ItemsSource = Global.DomainPureIPDNSAddress; + cmbSBFinalResolverDNS.ItemsSource = Global.DomainPureIPDNSAddress.Concat(new[] { "dhcp://auto,localhost" }); this.WhenActivated(disposables => {