From 909a58a15c660f65847df6342aeb2a96eb2e6e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=9B=BD=E4=BC=9F?= <366193849@qq.com> Date: Wed, 17 Nov 2021 16:24:55 +0800 Subject: [PATCH] =?UTF-8?q?ipv6=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.DomainResolve/DnsClient.cs | 57 ++++++++++++++----- .../Dns/DnsInterceptor.cs | 14 ++--- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/FastGithub.DomainResolve/DnsClient.cs b/FastGithub.DomainResolve/DnsClient.cs index 1453fcf..4c736a6 100644 --- a/FastGithub.DomainResolve/DnsClient.cs +++ b/FastGithub.DomainResolve/DnsClient.cs @@ -91,7 +91,10 @@ namespace FastGithub.DomainResolve foreach (var fallbackDns in this.fastGithubConfig.FallbackDns) { - yield return fallbackDns; + if (Socket.OSSupportsIPv6 || fallbackDns.AddressFamily != AddressFamily.InterNetworkV6) + { + yield return fallbackDns; + } } } @@ -153,17 +156,8 @@ namespace FastGithub.DomainResolve ? (IRequestResolver)new TcpRequestResolver(dns) : new UdpRequestResolver(dns, new TcpRequestResolver(dns), this.resolveTimeout); - var request = new Request - { - RecursionDesired = true, - OperationCode = OperationCode.Query - }; - - request.Questions.Add(new Question(new Domain(endPoint.Host), RecordType.A)); - var clientRequest = new ClientRequest(resolver, request); - var response = await clientRequest.Resolve(cancellationToken); - - var addresses = response.AnswerRecords + var answerRecords = await GetAnswerRecordsAsync(resolver, endPoint.Host, cancellationToken); + var addresses = answerRecords .OfType() .Where(item => IPAddress.IsLoopback(item.IPAddress) == false) .Select(item => item.IPAddress) @@ -179,7 +173,7 @@ namespace FastGithub.DomainResolve addresses = await OrderByConnectAnyAsync(addresses, endPoint.Port, cancellationToken); } - var timeToLive = response.AnswerRecords.First().TimeToLive; + var timeToLive = answerRecords.First().TimeToLive; if (timeToLive <= TimeSpan.Zero) { timeToLive = this.defaultEmptyTtl; @@ -187,6 +181,43 @@ namespace FastGithub.DomainResolve return new LookupResult(addresses, timeToLive); } + + /// + /// 获取答案 + /// + /// + /// + /// + /// + private static async Task> GetAnswerRecordsAsync(IRequestResolver resolver, string domain, CancellationToken cancellationToken) + { + var answerRecords = await GetAnswerAsync(RecordType.A); + if (Socket.OSSupportsIPv6 == true) + { + var ipv6Records = await GetAnswerAsync(RecordType.AAAA); + foreach (var record in ipv6Records) + { + answerRecords.Add(record); + } + } + return answerRecords; + + async Task> GetAnswerAsync(RecordType recordType) + { + var request = new Request + { + RecursionDesired = true, + OperationCode = OperationCode.Query + }; + + request.Questions.Add(new Question(new Domain(domain), recordType)); + var clientRequest = new ClientRequest(resolver, request); + var response = await clientRequest.Resolve(cancellationToken); + return response.AnswerRecords; + } + } + + /// /// 连接速度排序 /// diff --git a/FastGithub.PacketIntercept/Dns/DnsInterceptor.cs b/FastGithub.PacketIntercept/Dns/DnsInterceptor.cs index a16d4d9..b3ea53a 100644 --- a/FastGithub.PacketIntercept/Dns/DnsInterceptor.cs +++ b/FastGithub.PacketIntercept/Dns/DnsInterceptor.cs @@ -142,16 +142,9 @@ namespace FastGithub.PacketIntercept.Dns // dns响应数据 var response = Response.FromRequest(request); - if (question.Type == RecordType.A) - { - var record = new IPAddressResourceRecord(domain, IPAddress.Loopback, this.ttl); - response.AnswerRecords.Add(record); - this.logger.LogInformation($"{domain}->{IPAddress.Loopback}"); - } - else - { - this.logger.LogInformation($"{domain}->NULL"); - } + var loopback = question.Type == RecordType.A ? IPAddress.Loopback : IPAddress.Loopback.MapToIPv6(); + var record = new IPAddressResourceRecord(domain, loopback, this.ttl); + response.AnswerRecords.Add(record); var responsePayload = response.ToArray(); // 修改payload和包长 @@ -187,6 +180,7 @@ namespace FastGithub.PacketIntercept.Dns : WinDivertDirection.Inbound; WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All); + this.logger.LogInformation($"{domain}->{loopback}"); }