From ae46b39110d690f4572a28159e8a2a011f9ef37d Mon Sep 17 00:00:00 2001 From: DHR60 Date: Wed, 24 Sep 2025 20:55:41 +0800 Subject: [PATCH] Improves Tun2Socks address handling --- v2rayN/ServiceLib/Handler/ConfigHandler.cs | 39 ++++++++++++++++++- .../CoreConfig/Singbox/SingboxDnsService.cs | 15 ++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 2e59777f..81b0a9ff 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -1253,12 +1253,49 @@ public static class ConfigHandler ProfileItem? itemSocks = null; if (node.ConfigType != EConfigType.Custom && coreType != ECoreType.sing_box && config.TunModeItem.EnableTun) { + var tun2SocksAddress = node.Address; + if (node.ConfigType > EConfigType.Group) + { + static async Task> GetChildNodeAddressesAsync(string parentIndexId) + { + var childAddresses = new List(); + if (!ProfileGroupItemManager.Instance.TryGet(parentIndexId, out var groupItem) || groupItem.ChildItems.IsNullOrEmpty()) + return childAddresses; + + var childIds = Utils.String2List(groupItem.ChildItems); + + foreach (var childId in childIds) + { + var childNode = await AppManager.Instance.GetProfileItem(childId); + if (childNode == null) + continue; + + if (!childNode.IsComplex()) + { + childAddresses.Add(childNode.Address); + } + else if (childNode.ConfigType > EConfigType.Group) + { + var subAddresses = await GetChildNodeAddressesAsync(childNode.IndexId); + childAddresses.AddRange(subAddresses); + } + } + + return childAddresses; + } + + var lstAddresses = await GetChildNodeAddressesAsync(node.IndexId); + if (lstAddresses.Count > 0) + { + tun2SocksAddress = Utils.List2String(lstAddresses); + } + } itemSocks = new ProfileItem() { CoreType = ECoreType.sing_box, ConfigType = EConfigType.SOCKS, Address = Global.Loopback, - SpiderX = node.Address, // Tun2SocksAddress + SpiderX = tun2SocksAddress, // Tun2SocksAddress Port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks) }; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs index 9bd2502d..10c82eed 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs @@ -414,16 +414,19 @@ public partial class CoreConfigSingboxService return 0; } - var domain = string.Empty; + List domain = new(); if (Utils.IsDomain(node.Address)) // normal outbound { - domain = node.Address; + domain.Add(node.Address); } - else if (node.Address == Global.Loopback && node.SpiderX.IsNotEmpty() && Utils.IsDomain(node.SpiderX)) // Tun2SocksAddress + if (node.Address == Global.Loopback && node.SpiderX.IsNotEmpty()) // Tun2SocksAddress { - domain = node.SpiderX; + domain.AddRange(Utils.String2List(node.SpiderX) + .Where(Utils.IsDomain) + .Distinct() + .ToList()); } - if (domain.IsNullOrEmpty()) + if (domain.Count == 0) { return 0; } @@ -432,7 +435,7 @@ public partial class CoreConfigSingboxService singboxConfig.dns.rules.Insert(0, new Rule4Sbox { server = server, - domain = [domain], + domain = domain, }); return await Task.FromResult(0);