This commit is contained in:
xljiulang 2021-07-15 00:21:11 +08:00
parent a5a5ab6986
commit 6b15437abd
2 changed files with 65 additions and 36 deletions

View File

@ -12,7 +12,7 @@ namespace FastGithub.Dns
/// <summary> /// <summary>
/// dns后台服务 /// dns后台服务
/// </summary> /// </summary>
sealed class DnsHostedService : IHostedService sealed class DnsHostedService : BackgroundService
{ {
private readonly DnsServer dnsServer; private readonly DnsServer dnsServer;
private readonly IOptions<DnsOptions> options; private readonly IOptions<DnsOptions> options;
@ -31,22 +31,51 @@ namespace FastGithub.Dns
ILogger<DnsHostedService> logger) ILogger<DnsHostedService> logger)
{ {
this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream); this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
this.dnsServer.Listening += DnsServer_Listening;
this.dnsServer.Errored += DnsServer_Errored;
this.options = options; this.options = options;
this.logger = logger; this.logger = logger;
} }
/// <summary> /// <summary>
/// 启动dns服务 /// 监听后
/// </summary> /// </summary>
/// <param name="cancellationToken"></param> /// <param name="sender"></param>
/// <returns></returns> /// <param name="e"></param>
public Task StartAsync(CancellationToken cancellationToken) private void DnsServer_Listening(object? sender, EventArgs e)
{ {
this.dnsServer.Listen();
this.logger.LogInformation("dns服务启动成功"); this.logger.LogInformation("dns服务启动成功");
this.dnsAddresses = this.SetNameServers(IPAddress.Loopback, this.options.Value.UpStream); this.dnsAddresses = this.SetNameServers(IPAddress.Loopback, this.options.Value.UpStream);
}
return Task.CompletedTask; /// <summary>
/// dns异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DnsServer_Errored(object? sender, DnsServer.ErroredEventArgs e)
{
if (e.Exception is not OperationCanceledException)
{
this.logger.LogError($"dns服务异常{e.Exception.Message}");
}
}
/// <summary>
/// 启动dns
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
await this.dnsServer.Listen();
}
catch (Exception ex)
{
this.logger.LogWarning($"dns服务启动失败{ex.Message}");
}
} }
/// <summary> /// <summary>
@ -54,7 +83,7 @@ namespace FastGithub.Dns
/// </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)
{ {
this.dnsServer.Dispose(); this.dnsServer.Dispose();
this.logger.LogInformation("dns服务已终止"); this.logger.LogInformation("dns服务已终止");

View File

@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Threading;
namespace FastGithub namespace FastGithub
{ {
@ -14,6 +15,11 @@ namespace FastGithub
/// </summary> /// </summary>
public static class KestrelServerOptionsExtensions public static class KestrelServerOptionsExtensions
{ {
/// <summary>
/// 域名与证书
/// </summary>
private static readonly ConcurrentDictionary<string, Lazy<X509Certificate2>> domainCerts = new();
/// <summary> /// <summary>
/// 监听github的反向代理 /// 监听github的反向代理
/// </summary> /// </summary>
@ -26,8 +32,29 @@ namespace FastGithub
var logger = loggerFactory.CreateLogger($"{nameof(FastGithub)}{nameof(ReverseProxy)}"); var logger = loggerFactory.CreateLogger($"{nameof(FastGithub)}{nameof(ReverseProxy)}");
TryInstallCaCert(caPublicCerPath, logger); TryInstallCaCert(caPublicCerPath, logger);
kestrel.ListenAnyIP(443, listen => listen.UseGithubHttps(caPublicCerPath, caPrivateKeyPath)); kestrel.ListenAnyIP(443, listen =>
listen.UseHttps(https =>
https.ServerCertificateSelector = (ctx, domain) =>
GetOrCreateCert(domain)));
logger.LogInformation("反向代理服务启动成功"); logger.LogInformation("反向代理服务启动成功");
X509Certificate2 GetOrCreateCert(string key)
{
if (key == string.Empty)
{
key = "github.com";
}
return domainCerts.GetOrAdd(key, domain => new Lazy<X509Certificate2>(() =>
{
var domains = new[] { domain };
var validFrom = DateTime.Today.AddYears(-1);
var validTo = DateTime.Today.AddYears(10);
return CertGenerator.Generate(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath);
}, LazyThreadSafetyMode.ExecutionAndPublication)).Value;
}
} }
/// <summary> /// <summary>
@ -57,32 +84,5 @@ namespace FastGithub
} }
} }
/// <summary>
/// 应用fastGihub的https
/// </summary>
/// <param name="listenOptions"></param>
/// <param name="caPublicCerPath"></param>
/// <param name="caPrivateKeyPath"></param>
/// <returns></returns>
private static ListenOptions UseGithubHttps(this ListenOptions listenOptions, string caPublicCerPath, string caPrivateKeyPath)
{
return listenOptions.UseHttps(https =>
{
var certs = new ConcurrentDictionary<string, X509Certificate2>();
https.ServerCertificateSelector = (ctx, domain) => certs.GetOrAdd(domain, CreateCert);
});
X509Certificate2 CreateCert(string domain)
{
if (domain == string.Empty)
{
domain = "github.com";
}
var domains = new[] { domain };
var validFrom = DateTime.Today.AddYears(-1);
var validTo = DateTime.Today.AddYears(10);
return CertGenerator.Generate(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath);
}
}
} }
} }