From ce6572af3da479b546bc9ea764a4462050ea0ba5 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Sat, 12 Apr 2025 19:03:34 +0800 Subject: [PATCH] Fix xray wireguard chained proxies not working (#7113) * Fix chained proxies not working * Add domain field for WireGuard exit node --- .../CoreConfig/CoreConfigV2rayService.cs | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs index 95511836..7b940d07 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs @@ -1176,20 +1176,70 @@ public class CoreConfigV2rayService private async Task GenDnsDomains(ProfileItem? node, JsonNode dns, DNSItem? dNSItem) { if (node == null) - { return 0; } + { + return 0; + } var servers = dns["servers"]; if (servers != null) { + var domainList = new List(); + string? wireguardEndpointDomain = null; if (Utils.IsDomain(node.Address)) + { + domainList.Add(node.Address); + } + var subItem = await AppHandler.Instance.GetSubItem(node.Subid); + if (subItem is not null) + { + // Previous proxy + var prevNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.PrevProfile); + if (prevNode is not null + && prevNode.ConfigType != EConfigType.Custom + && prevNode.ConfigType != EConfigType.Hysteria2 + && prevNode.ConfigType != EConfigType.TUIC + && Utils.IsDomain(prevNode.Address)) + { + domainList.Add(prevNode.Address); + } + + // Next proxy + var nextNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.NextProfile); + if (nextNode is not null + && nextNode.ConfigType != EConfigType.Custom + && nextNode.ConfigType != EConfigType.Hysteria2 + && nextNode.ConfigType != EConfigType.TUIC + && Utils.IsDomain(nextNode.Address)) + { + if (nextNode.ConfigType == EConfigType.WireGuard) + { + wireguardEndpointDomain = nextNode.Address; + } + else + { + domainList.Add(nextNode.Address); + } + } + } + if (domainList.Count > 0) { var dnsServer = new DnsServer4Ray() { address = string.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.DomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, skipFallback = true, - domains = [node.Address] + domains = domainList }; servers.AsArray().Add(JsonUtils.SerializeToNode(dnsServer)); } + if (wireguardEndpointDomain is not null) + { + var dnsServer = new DnsServer4Ray() + { + address = string.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.DomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, + skipFallback = true, + domains = new() { wireguardEndpointDomain } + }; + servers.AsArray().Insert(0, JsonUtils.SerializeToNode(dnsServer)); + } } return await Task.FromResult(0); }