增加DnsDomainAddressProvider

This commit is contained in:
xljiulang 2021-06-17 22:09:05 +08:00
parent 73b5914136
commit 52b5272c18
8 changed files with 114 additions and 153 deletions

View File

@ -6,10 +6,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DNS" Version="6.1.0" /> <ProjectReference Include="..\FastGithub.Scanner\FastGithub.Scanner.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FastGithub.Scanner\FastGithub.Scanner.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,72 @@
using DNS.Client;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class DnsDomainAddressProvider : IDomainAddressProvider
{
private readonly IOptionsMonitor<GithubOptions> options;
private readonly ILogger<DnsDomainAddressProvider> logger;
public DnsDomainAddressProvider(
IOptionsMonitor<GithubOptions> options,
ILogger<DnsDomainAddressProvider> logger)
{
this.options = options;
this.logger = logger;
}
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.DnsDomainAddress;
if (setting.Enable == false)
{
return Enumerable.Empty<DomainAddress>();
}
var result = new List<DomainAddress>();
foreach (var dns in setting.Dnss)
{
var domainAddresses = await this.LookupAsync(dns, setting.Domains);
result.AddRange(domainAddresses);
}
return result;
}
private async Task<List<DomainAddress>> LookupAsync(string dns, IEnumerable<string> domains)
{
var client = new DnsClient(dns);
var result = new List<DomainAddress>();
foreach (var domain in domains)
{
try
{
var addresses = await client.Lookup(domain);
foreach (var address in addresses)
{
if (address.AddressFamily == AddressFamily.InterNetwork)
{
result.Add(new DomainAddress(domain, address));
}
}
}
catch (Exception)
{
this.logger.LogWarning($"dns({dns})无法解析{domain}");
}
}
return result;
}
}
}

View File

@ -1,73 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class LocalDomainAddressProvider : IDomainAddressProvider
{
private readonly IOptionsMonitor<GithubOptions> options;
private readonly ILogger<LocalDomainAddressProvider> logger;
public LocalDomainAddressProvider(
IOptionsMonitor<GithubOptions> options,
ILogger<LocalDomainAddressProvider> logger)
{
this.options = options;
this.logger = logger;
}
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.LocalAddressProvider;
if (setting.Enable == false)
{
return Enumerable.Empty<DomainAddress>();
}
try
{
if (File.Exists(setting.IPRangeFilePath) == true)
{
using var fileStream = File.OpenRead(setting.IPRangeFilePath);
var datas = await JsonSerializer.DeserializeAsync<Dictionary<string, string[]>>(fileStream);
if (datas != null)
{
return this.GetDomainAddresses(datas);
}
}
}
catch (Exception ex)
{
this.logger.LogWarning($"加载本机的ip列表异常{ex.Message}");
}
return Enumerable.Empty<DomainAddress>();
}
private IEnumerable<DomainAddress> GetDomainAddresses(Dictionary<string, string[]> datas)
{
foreach (var kv in datas)
{
var domain = kv.Key;
foreach (var item in kv.Value)
{
if (IPAddressRange.TryParse(item, out var range))
{
foreach (var address in range)
{
yield return new DomainAddress(domain, address);
}
}
}
}
}
}
}

View File

@ -13,14 +13,14 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares namespace FastGithub.Scanner.DomainMiddlewares
{ {
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))] [Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class RemoteDomainAddressProvider : IDomainAddressProvider sealed class MetaDomainAddressProvider : IDomainAddressProvider
{ {
private readonly IOptionsMonitor<GithubOptions> options; private readonly IOptionsMonitor<GithubOptions> options;
private readonly ILogger<RemoteDomainAddressProvider> logger; private readonly ILogger<MetaDomainAddressProvider> logger;
public RemoteDomainAddressProvider( public MetaDomainAddressProvider(
IOptionsMonitor<GithubOptions> options, IOptionsMonitor<GithubOptions> options,
ILogger<RemoteDomainAddressProvider> logger) ILogger<MetaDomainAddressProvider> logger)
{ {
this.options = options; this.options = options;
this.logger = logger; this.logger = logger;
@ -28,7 +28,7 @@ namespace FastGithub.Scanner.DomainMiddlewares
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync() public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{ {
var setting = this.options.CurrentValue.RemoteAddressProvider; var setting = this.options.CurrentValue.MetaDomainAddress;
if (setting.Enable == false) if (setting.Enable == false)
{ {
return Enumerable.Empty<DomainAddress>(); return Enumerable.Empty<DomainAddress>();
@ -56,10 +56,6 @@ namespace FastGithub.Scanner.DomainMiddlewares
[JsonPropertyName("web")] [JsonPropertyName("web")]
public string[] Web { get; set; } = Array.Empty<string>(); public string[] Web { get; set; } = Array.Empty<string>();
[JsonPropertyName("api")]
public string[] Api { get; set; } = Array.Empty<string>();
public IEnumerable<DomainAddress> ToDomainAddresses() public IEnumerable<DomainAddress> ToDomainAddresses()
{ {
foreach (var range in IPAddressRange.From(this.Web).OrderBy(item => item.Size)) foreach (var range in IPAddressRange.From(this.Web).OrderBy(item => item.Size))
@ -72,17 +68,6 @@ namespace FastGithub.Scanner.DomainMiddlewares
} }
} }
} }
foreach (var range in IPAddressRange.From(this.Api).OrderBy(item => item.Size))
{
if (range.AddressFamily == AddressFamily.InterNetwork)
{
foreach (var address in range)
{
yield return new DomainAddress("api.github.com", address);
}
}
}
} }
} }
} }

View File

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DNS" Version="6.1.0" />
<PackageReference Include="IPNetwork2" Version="2.5.320" /> <PackageReference Include="IPNetwork2" Version="2.5.320" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
</ItemGroup> </ItemGroup>
@ -14,10 +15,4 @@
<ProjectReference Include="..\FastGithub.Core\FastGithub.Core.csproj" /> <ProjectReference Include="..\FastGithub.Core\FastGithub.Core.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="IPRange.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project> </Project>

View File

@ -1,5 +1,7 @@
using System; using System;
namespace FastGithub.Scanner namespace FastGithub.Scanner
{ {
[Options("Github")] [Options("Github")]
@ -7,9 +9,9 @@ namespace FastGithub.Scanner
{ {
public ScanSetting Scan { get; set; } = new ScanSetting(); public ScanSetting Scan { get; set; } = new ScanSetting();
public RemoteAddressProviderSetting RemoteAddressProvider { get; set; } = new RemoteAddressProviderSetting(); public MetaDoaminAddressSetting MetaDomainAddress { get; set; } = new MetaDoaminAddressSetting();
public LocalAddressProviderSetting LocalAddressProvider { get; set; } = new LocalAddressProviderSetting(); public DnsDomainAddressSetting DnsDomainAddress { get; set; } = new DnsDomainAddressSetting();
public class ScanSetting public class ScanSetting
{ {
@ -23,18 +25,20 @@ namespace FastGithub.Scanner
} }
public class RemoteAddressProviderSetting public class MetaDoaminAddressSetting
{ {
public bool Enable { get; set; } = true; public bool Enable { get; set; } = true;
public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json"); public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json");
} }
public class LocalAddressProviderSetting public class DnsDomainAddressSetting
{ {
public bool Enable { get; set; } = true; public bool Enable { get; set; } = true;
public string IPRangeFilePath { get; set; } = "./IPRange.json"; public string[] Dnss { get; set; } = Array.Empty<string>();
public string[] Domains { get; set; } = Array.Empty<string>();
} }
} }
} }

View File

@ -1,36 +0,0 @@
{
"github.com": [
"13.114.40.48/32",
"52.192.72.89/32",
"52.69.186.44/32",
"15.164.81.167/32",
"52.78.231.108/32",
"13.234.176.102/32",
"13.234.210.38/32",
"13.229.188.59/32",
"13.250.177.223/32",
"52.74.223.119/32",
"13.236.229.21/32",
"13.237.44.5/32",
"52.64.108.95/32",
"18.228.52.138/32",
"18.228.67.229/32",
"18.231.5.6/32",
"192.30.252.0/22",
"185.199.108.0/22",
"140.82.112.0/20",
"143.55.64.0/20"
],
"github.githubassets.com": [
"185.199.108.154/32",
"185.199.109.154/32",
"185.199.110.154/32",
"185.199.111.154/32"
],
"avatars.githubusercontent.com": [
"185.199.108.133/32",
"185.199.109.133/32",
"185.199.110.133/32",
"185.199.111.133/32"
]
}

View File

@ -5,18 +5,36 @@
}, },
"Github": { "Github": {
"Scan": { "Scan": {
"FullScanInterval": "02:00:00", // "FullScanInterval": "02:00:00", //
"ResultScanInterval": "00:01:00", // "ResultScanInterval": "00:01:00", //
"TcpScanTimeout": "00:00:01", // tcp "TcpScanTimeout": "00:00:01", // tcp
"HttpsScanTimeout": "00:00:02" // https "HttpsScanTimeout": "00:00:02" // https
}, },
"RemoteAddressProvider": { "MetaDomainAddress": {
"Enable": true, "Enable": true,
"MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // metauri "MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // metauri
}, },
"LocalAddressProvider": { "DnsDomainAddress": {
"Enable": true, "Enable": true,
"IPRangeFilePath": "./IPRange.json" "Dnss": [
"119.29.29.29",
"180.76.76.76",
"8.8.8.8",
"8.8.4.4",
"114.114.114.114",
"114.114.115.115",
"223.5.5.5",
"223.6.6.6",
"1.2.4.8",
"210.2.4.8",
"208.67.220.220",
"208.67.222.222"
],
"Domains": [
"github.com",
"api.github.com",
"github.githubassets.com"
]
} }
}, },
"Logging": { "Logging": {