ipv6客户端

This commit is contained in:
陈国伟 2021-11-17 16:24:55 +08:00
parent 516f04a7d7
commit 909a58a15c
2 changed files with 48 additions and 23 deletions

View File

@ -91,7 +91,10 @@ namespace FastGithub.DomainResolve
foreach (var fallbackDns in this.fastGithubConfig.FallbackDns) 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) ? (IRequestResolver)new TcpRequestResolver(dns)
: new UdpRequestResolver(dns, new TcpRequestResolver(dns), this.resolveTimeout); : new UdpRequestResolver(dns, new TcpRequestResolver(dns), this.resolveTimeout);
var request = new Request var answerRecords = await GetAnswerRecordsAsync(resolver, endPoint.Host, cancellationToken);
{ var addresses = answerRecords
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
.OfType<IPAddressResourceRecord>() .OfType<IPAddressResourceRecord>()
.Where(item => IPAddress.IsLoopback(item.IPAddress) == false) .Where(item => IPAddress.IsLoopback(item.IPAddress) == false)
.Select(item => item.IPAddress) .Select(item => item.IPAddress)
@ -179,7 +173,7 @@ namespace FastGithub.DomainResolve
addresses = await OrderByConnectAnyAsync(addresses, endPoint.Port, cancellationToken); addresses = await OrderByConnectAnyAsync(addresses, endPoint.Port, cancellationToken);
} }
var timeToLive = response.AnswerRecords.First().TimeToLive; var timeToLive = answerRecords.First().TimeToLive;
if (timeToLive <= TimeSpan.Zero) if (timeToLive <= TimeSpan.Zero)
{ {
timeToLive = this.defaultEmptyTtl; timeToLive = this.defaultEmptyTtl;
@ -187,6 +181,43 @@ namespace FastGithub.DomainResolve
return new LookupResult(addresses, timeToLive); return new LookupResult(addresses, timeToLive);
} }
/// <summary>
/// 获取答案
/// </summary>
/// <param name="resolver"></param>
/// <param name="domain"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
private static async Task<IList<IResourceRecord>> 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<IList<IResourceRecord>> 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;
}
}
/// <summary> /// <summary>
/// 连接速度排序 /// 连接速度排序
/// </summary> /// </summary>

View File

@ -142,16 +142,9 @@ namespace FastGithub.PacketIntercept.Dns
// dns响应数据 // dns响应数据
var response = Response.FromRequest(request); var response = Response.FromRequest(request);
if (question.Type == RecordType.A) var loopback = question.Type == RecordType.A ? IPAddress.Loopback : IPAddress.Loopback.MapToIPv6();
{ var record = new IPAddressResourceRecord(domain, loopback, this.ttl);
var record = new IPAddressResourceRecord(domain, IPAddress.Loopback, this.ttl); response.AnswerRecords.Add(record);
response.AnswerRecords.Add(record);
this.logger.LogInformation($"{domain}->{IPAddress.Loopback}");
}
else
{
this.logger.LogInformation($"{domain}->NULL");
}
var responsePayload = response.ToArray(); var responsePayload = response.ToArray();
// 修改payload和包长 // 修改payload和包长
@ -187,6 +180,7 @@ namespace FastGithub.PacketIntercept.Dns
: WinDivertDirection.Inbound; : WinDivertDirection.Inbound;
WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All); WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All);
this.logger.LogInformation($"{domain}->{loopback}");
} }