完善dns配置检测

This commit is contained in:
xljiulang 2021-07-17 18:24:56 +08:00
parent 99646b8700
commit 1c693e2282
4 changed files with 40 additions and 9 deletions

View File

@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Net; using System.Net;
using System.Net.NetworkInformation;
namespace FastGithub namespace FastGithub
{ {
@ -29,14 +30,43 @@ namespace FastGithub
} }
/// <summary> /// <summary>
/// 验证 /// 验证dns
/// 防止使用自己使用自己来解析域名造成死循环
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public bool Validate() public bool Validate()
{ {
return System.Net.IPAddress.TryParse(this.IPAddress, out var address) if (System.Net.IPAddress.TryParse(this.IPAddress, out var address) == false)
? !(address.Equals(System.Net.IPAddress.Loopback) && this.Port == 53) {
: false; return false;
}
if (this.Port == 53 && IsLocalMachineIPAddress(address))
{
return false;
}
return true;
}
/// <summary>
/// 是否为本机ip
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
private static bool IsLocalMachineIPAddress(IPAddress address)
{
foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses)
{
if (addressInfo.Address.Equals(address))
{
return true;
}
}
}
return false;
} }
} }
} }

View File

@ -12,7 +12,7 @@ namespace FastGithub.ReverseProxy
/// <summary> /// <summary>
/// 受信任的域名解析器 /// 受信任的域名解析器
/// </summary> /// </summary>
sealed class TrustedResolver sealed class DomainResolver
{ {
private readonly IMemoryCache memoryCache; private readonly IMemoryCache memoryCache;
private readonly TimeSpan cacheTimeSpan = TimeSpan.FromSeconds(10d); private readonly TimeSpan cacheTimeSpan = TimeSpan.FromSeconds(10d);
@ -22,7 +22,7 @@ namespace FastGithub.ReverseProxy
/// 受信任的域名解析器 /// 受信任的域名解析器
/// </summary> /// </summary>
/// <param name="options"></param> /// <param name="options"></param>
public TrustedResolver( public DomainResolver(
IMemoryCache memoryCache, IMemoryCache memoryCache,
IOptionsMonitor<FastGithubOptions> options) IOptionsMonitor<FastGithubOptions> options)
{ {
@ -66,6 +66,7 @@ namespace FastGithub.ReverseProxy
throw new Exception($"解析不到{domain}的ip"); throw new Exception($"解析不到{domain}的ip");
} }
// 受干扰的dns常常返回127.0.0.1来阻断请求
// 如果解析到的ip为本机ip会产生反向代理请求死循环 // 如果解析到的ip为本机ip会产生反向代理请求死循环
if (address.Equals(IPAddress.Loopback)) if (address.Equals(IPAddress.Loopback))
{ {

View File

@ -13,7 +13,7 @@ namespace FastGithub.ReverseProxy
/// </summary> /// </summary>
class NoSniHttpClientHanlder : DelegatingHandler class NoSniHttpClientHanlder : DelegatingHandler
{ {
private readonly TrustedResolver trustedDomainResolver; private readonly DomainResolver trustedDomainResolver;
private readonly ILogger<NoSniHttpClientHanlder> logger; private readonly ILogger<NoSniHttpClientHanlder> logger;
/// <summary> /// <summary>
@ -21,7 +21,7 @@ namespace FastGithub.ReverseProxy
/// </summary> /// </summary>
/// <param name="trustedDomainResolver"></param> /// <param name="trustedDomainResolver"></param>
public NoSniHttpClientHanlder( public NoSniHttpClientHanlder(
TrustedResolver trustedDomainResolver, DomainResolver trustedDomainResolver,
ILogger<NoSniHttpClientHanlder> logger) ILogger<NoSniHttpClientHanlder> logger)
{ {
this.trustedDomainResolver = trustedDomainResolver; this.trustedDomainResolver = trustedDomainResolver;

View File

@ -18,7 +18,7 @@ namespace FastGithub
return services return services
.AddMemoryCache() .AddMemoryCache()
.AddHttpForwarder() .AddHttpForwarder()
.AddSingleton<TrustedResolver>() .AddSingleton<DomainResolver>()
.AddTransient<NoSniHttpClientHanlder>(); .AddTransient<NoSniHttpClientHanlder>();
} }
} }