后台启动dnscryptproxy,以经过fg来下载public-resolvers文件

This commit is contained in:
老九 2021-09-19 17:10:10 +08:00
parent 351be8c207
commit a497058d42
2 changed files with 34 additions and 11 deletions

View File

@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System; using System;
using System.Buffers.Binary; using System.Buffers.Binary;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -101,20 +102,21 @@ namespace FastGithub.Dns
var packet = WinDivert.WinDivertHelperParsePacket(winDivertBuffer, packetLength); var packet = WinDivert.WinDivertHelperParsePacket(winDivertBuffer, packetLength);
var requestPayload = new Span<byte>(packet.PacketPayload, (int)packet.PacketPayloadLength).ToArray(); var requestPayload = new Span<byte>(packet.PacketPayload, (int)packet.PacketPayloadLength).ToArray();
var request = Request.FromArray(requestPayload); if (TryParseRequest(requestPayload, out var request) == false ||
if (request.OperationCode != OperationCode.Query) request.OperationCode != OperationCode.Query ||
request.Questions.Count == 0)
{ {
return; return;
} }
var question = request.Questions.FirstOrDefault(); var question = request.Questions.First();
if (question == null || question.Type != RecordType.A) if (question.Type != RecordType.A)
{ {
return; return;
} }
var domain = question.Name; var domain = question.Name;
if (this.fastGithubConfig.IsMatch(domain.ToString()) == false) if (this.fastGithubConfig.IsMatch(question.Name.ToString()) == false)
{ {
return; return;
} }
@ -164,5 +166,26 @@ namespace FastGithub.Dns
WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All); WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All);
this.logger.LogInformation($"已拦截dns查询{domain}并伪造解析结果为{IPAddress.Loopback}"); this.logger.LogInformation($"已拦截dns查询{domain}并伪造解析结果为{IPAddress.Loopback}");
} }
/// <summary>
/// 尝试解析请求
/// </summary>
/// <param name="payload"></param>
/// <param name="request"></param>
/// <returns></returns>
static bool TryParseRequest(byte[] payload, [MaybeNullWhen(false)] out Request request)
{
try
{
request = Request.FromArray(payload);
return true;
}
catch (Exception)
{
request = null;
return false;
}
}
} }
} }

View File

@ -9,7 +9,7 @@ namespace FastGithub.DomainResolve
/// <summary> /// <summary>
/// DnscryptProxy后台服务 /// DnscryptProxy后台服务
/// </summary> /// </summary>
sealed class DnscryptProxyHostedService : IHostedService sealed class DnscryptProxyHostedService : BackgroundService
{ {
private readonly ILogger<DnscryptProxyHostedService> logger; private readonly ILogger<DnscryptProxyHostedService> logger;
private readonly DnscryptProxy dnscryptProxy; private readonly DnscryptProxy dnscryptProxy;
@ -30,13 +30,13 @@ namespace FastGithub.DomainResolve
/// <summary> /// <summary>
/// 启动dnscrypt-proxy /// 启动dnscrypt-proxy
/// </summary> /// </summary>
/// <param name="cancellationToken"></param> /// <param name="stoppingToken"></param>
/// <returns></returns> /// <returns></returns>
public async Task StartAsync(CancellationToken cancellationToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
try try
{ {
await this.dnscryptProxy.StartAsync(cancellationToken); await this.dnscryptProxy.StartAsync(stoppingToken);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -49,7 +49,7 @@ namespace FastGithub.DomainResolve
/// </summary> /// </summary>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public Task StopAsync(CancellationToken cancellationToken) public override Task StopAsync(CancellationToken cancellationToken)
{ {
try try
{ {
@ -59,7 +59,7 @@ namespace FastGithub.DomainResolve
{ {
this.logger.LogWarning($"{this.dnscryptProxy}停止失败:{ex.Message}"); this.logger.LogWarning($"{this.dnscryptProxy}停止失败:{ex.Message}");
} }
return Task.CompletedTask; return base.StopAsync(cancellationToken);
} }
} }
} }