From a89471da926f3ecfa790f71991b201c04bebe893 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Fri, 6 Feb 2026 15:20:18 +0800 Subject: [PATCH] Support sing-box 1.11 DNS --- v2rayN/ServiceLib/Models/SingboxConfig.cs | 7 ++++ .../CoreConfig/Singbox/SingboxDnsService.cs | 36 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/v2rayN/ServiceLib/Models/SingboxConfig.cs b/v2rayN/ServiceLib/Models/SingboxConfig.cs index 0d0e3009..c1eaa3c8 100644 --- a/v2rayN/ServiceLib/Models/SingboxConfig.cs +++ b/v2rayN/ServiceLib/Models/SingboxConfig.cs @@ -254,6 +254,13 @@ public class Server4Sbox : BaseServer4Sbox // public List? path { get; set; } // hosts public Dictionary>? predefined { get; set; } + + // Deprecated in sing-box 1.12.0 , kept for backward compatibility + public string? address { get; set; } + public string? address_resolver { get; set; } + public string? address_strategy { get; set; } + public string? strategy { get; set; } + // Deprecated End } public class Experimental4Sbox diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs index dfce64f5..00358a85 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs @@ -378,8 +378,15 @@ public partial class CoreConfigSingboxService return; } _coreConfig.dns = dns4Sbox; - - GenDnsProtectCustom(); + if (dns4Sbox.servers?.Count > 0 && + dns4Sbox.servers.First().address.IsNullOrEmpty()) + { + GenDnsProtectCustom(); + } + else + { + GenDnsProtectCustomLegacy(); + } } catch (Exception ex) { @@ -395,6 +402,16 @@ public partial class CoreConfigSingboxService dns4Sbox.rules ??= []; var tag = Global.SingboxLocalDNSTag; + 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", + clash_mode = ERuleMode.Global.ToString() + }); var finalDnsAddress = string.IsNullOrEmpty(dnsItem?.DomainDNSAddress) ? Global.DomainPureIPDNSAddress.FirstOrDefault() : dnsItem?.DomainDNSAddress; @@ -407,6 +424,21 @@ public partial class CoreConfigSingboxService _coreConfig.dns = dns4Sbox; } + private void GenDnsProtectCustomLegacy() + { + GenDnsProtectCustom(); + + var localDnsServer = _coreConfig.dns?.servers?.FirstOrDefault(s => s.tag == Global.SingboxLocalDNSTag); + if (localDnsServer == null) + { + return; + } + localDnsServer.type = null; + localDnsServer.server = null; + var dnsItem = context.RawDnsItem; + localDnsServer.address = string.IsNullOrEmpty(dnsItem?.DomainDNSAddress) ? Global.DomainPureIPDNSAddress.FirstOrDefault() : dnsItem?.DomainDNSAddress; + } + private Rule4Sbox BuildProtectDomainRule() { return new()