diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
index a99f4680..e8863c73 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
@@ -1402,7 +1402,7 @@
直连 DNS
- 出站 DNS 解析
+ 出站 DNS 解析(sing-box)
解析出站域名
diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
index 90df8df6..452e1976 100644
--- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
+++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
@@ -1603,7 +1603,20 @@ public class CoreConfigSingboxService
singboxConfig.dns ??= new Dns4Sbox();
singboxConfig.dns.independent_cache = true;
- singboxConfig.dns.final = "dns_remote"; // TODO: Select fallback DNS server based on routing rules
+
+ var routing = await ConfigHandler.GetDefaultRouting(_config);
+ var useDirectDns = false;
+ if (routing != null)
+ {
+ var rules = JsonUtils.Deserialize>(routing.RuleSet) ?? [];
+
+ useDirectDns = rules?.LastOrDefault() is { } lastRule &&
+ lastRule.OutboundTag == Global.DirectTag &&
+ (lastRule.Port == "0-65535" ||
+ lastRule.Network == "tcp,udp" ||
+ lastRule.Ip?.Contains("0.0.0.0/0") == true);
+ }
+ singboxConfig.dns.final = useDirectDns ? "dns_direct" : "dns_remote";
}
catch (Exception ex)
{
diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs
index 6cb570b0..ec570b03 100644
--- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs
+++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs
@@ -1232,9 +1232,10 @@ public class CoreConfigV2rayService
}
var routing = await ConfigHandler.GetDefaultRouting(_config);
+ List? rules = null;
if (routing != null)
{
- var rules = JsonUtils.Deserialize>(routing.RuleSet) ?? [];
+ rules = JsonUtils.Deserialize>(routing.RuleSet) ?? [];
foreach (var item in rules)
{
if (!item.Enabled || item.Domain is null || item.Domain.Count == 0)
@@ -1317,7 +1318,14 @@ public class CoreConfigV2rayService
AddDnsServers(directDNSAddress, directGeositeList);
AddDnsServers(directDNSAddress, expectedDomainList, expectedIPs);
- v2rayConfig.dns.servers.AddRange(remoteDNSAddress);
+ var useDirectDns = rules?.LastOrDefault() is { } lastRule &&
+ lastRule.OutboundTag == Global.DirectTag &&
+ (lastRule.Port == "0-65535" ||
+ lastRule.Network == "tcp,udp" ||
+ lastRule.Ip?.Contains("0.0.0.0/0") == true);
+
+ var defaultDnsServers = useDirectDns ? directDNSAddress : remoteDNSAddress;
+ v2rayConfig.dns.servers.AddRange(defaultDnsServers);
return 0;
}