From 0925ec9104f9002d17d4fac65d1175f03e407cf5 Mon Sep 17 00:00:00 2001 From: Aigio Liu Date: Sat, 16 Sep 2023 18:01:30 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20DoH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Net/DnsDohAnalysisService.cs | 67 ++++++++++--------- src/BD.WTTS.UnitTest/DnsDohAnalysisTest.cs | 26 ++++++- 2 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/Net/DnsDohAnalysisService.cs b/src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/Net/DnsDohAnalysisService.cs index 7eb195786..bdc9de329 100644 --- a/src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/Net/DnsDohAnalysisService.cs +++ b/src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/Net/DnsDohAnalysisService.cs @@ -83,10 +83,10 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory return 0; } - /// - /// DNS 解析查询最大递归查询次数 - /// - const byte max_recursion_dns_query = 20; + ///// + ///// DNS 解析查询最大递归查询次数 + ///// + //const byte max_recursion_dns_query = 20; static readonly TimeSpan TTL = TimeSpan.FromMinutes(9.9D); @@ -104,37 +104,37 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory Uri dohAddresUri, string hostNameOrAddress, DnsQueryType queryType = DnsQueryType.A, - byte count = 1, - HashSet? domainHistory = null, + //byte count = 1, + //HashSet? domainHistory = null, CancellationToken cancellationToken = default) { - if (count <= max_recursion_dns_query) - { - domainHistory ??= new(); - var query = DnsQueryFactory.CreateQuery(hostNameOrAddress, queryType); - var dnsClient = GetDnsHttpClient(dohAddresUri); - var answer = await dnsClient.Query(query, cancellationToken); + //if (count <= max_recursion_dns_query) + //{ + // domainHistory ??= new(); + var query = DnsQueryFactory.CreateQuery(hostNameOrAddress, queryType); + var dnsClient = GetDnsHttpClient(dohAddresUri); + var answer = await dnsClient.Query(query, cancellationToken); - var dnsResources = answer.Answers.Select(x => x.Resource); + var dnsResources = answer.Answers.Select(x => x.Resource); - var iPAddresses = dnsResources.OfType().Select(x => x.IPAddress).ToArray(); - if (iPAddresses.Any()) - return iPAddresses; + var iPAddresses = dnsResources.OfType().Select(x => x.IPAddress).ToArray(); + if (iPAddresses.Any()) + return iPAddresses; - var domainRes = dnsResources.OfType().FirstOrDefault(); - if (domainRes != null) - { - var domain = domainRes.Domain; - if (!string.IsNullOrWhiteSpace(domain)) - { - if (domainHistory.Add(domain)) - { - // CNAME 递归解析 - iPAddresses = await Query(dohAddresUri, domain, queryType, ++count, domainHistory, cancellationToken); - } - } - } - } + //var domainRes = dnsResources.OfType().FirstOrDefault(); + //if (domainRes != null) + //{ + // var domain = domainRes.Domain; + // if (!string.IsNullOrWhiteSpace(domain)) + // { + // //if (domainHistory.Add(domain)) + // //{ + // // CNAME 递归解析 + // iPAddresses = await Query(dohAddresUri, domain, queryType,/* ++count, domainHistory,*/ cancellationToken); + // //} + // } + //} + ////} return Array.Empty(); } @@ -181,6 +181,13 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory } var result = await Query(dohAddresUri, hostNameOrAddress, queryType, cancellationToken: cancellationToken); + + if (isIPv6 && !result.Any()) + { + // IPv6 返回空时使用 IPv4 解析 + result = await Query(dohAddresUri, hostNameOrAddress, DnsQueryType.A, cancellationToken: cancellationToken); + } + if (useCache) { Cache[cacheKey] = new() diff --git a/src/BD.WTTS.UnitTest/DnsDohAnalysisTest.cs b/src/BD.WTTS.UnitTest/DnsDohAnalysisTest.cs index 681c7c52f..6f34e3bcb 100644 --- a/src/BD.WTTS.UnitTest/DnsDohAnalysisTest.cs +++ b/src/BD.WTTS.UnitTest/DnsDohAnalysisTest.cs @@ -11,7 +11,8 @@ public sealed class DnsDohAnalysisTest { s.AddLogging(s => s.AddConsole()); s.TryAddClientHttpPlatformHelperService(); - s.AddFusilladeHttpClient(); + FusilladeHttpClientFactory2 factory = new(); + s.AddSingleton(factory); s.AddSingleton(); }); @@ -23,8 +24,8 @@ public sealed class DnsDohAnalysisTest DNS_Ali_DohAddres, DNS_Ali_DohAddres2, DNS_Ali_DohAddres3, - Google_DohAddres, - Cloudflare_DohAddres, + //Google_DohAddres, + //Cloudflare_DohAddres, DohAddres_360, TUNA_DohAddres, }; @@ -62,4 +63,23 @@ public sealed class DnsDohAnalysisTest Console.WriteLine("--------------------"); } } +} + +sealed class FusilladeHttpClientFactory2 : FusilladeHttpClientFactory +{ + protected override HttpClient CreateClient(HttpMessageHandler handler) + { + var client = new HttpClient(handler); + + try + { + client.Timeout = TimeSpan.FromSeconds(14.5D); + } + catch + { + + } + + return client; + } } \ No newline at end of file