增加DnsDomainAddressProvider
This commit is contained in:
parent
73b5914136
commit
52b5272c18
@ -6,10 +6,6 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DNS" Version="6.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\FastGithub.Scanner\FastGithub.Scanner.csproj" />
|
||||
<ProjectReference Include="..\FastGithub.Scanner\FastGithub.Scanner.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -13,14 +13,14 @@ using System.Threading.Tasks;
|
||||
namespace FastGithub.Scanner.DomainMiddlewares
|
||||
{
|
||||
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
|
||||
sealed class RemoteDomainAddressProvider : IDomainAddressProvider
|
||||
sealed class MetaDomainAddressProvider : IDomainAddressProvider
|
||||
{
|
||||
private readonly IOptionsMonitor<GithubOptions> options;
|
||||
private readonly ILogger<RemoteDomainAddressProvider> logger;
|
||||
private readonly ILogger<MetaDomainAddressProvider> logger;
|
||||
|
||||
public RemoteDomainAddressProvider(
|
||||
public MetaDomainAddressProvider(
|
||||
IOptionsMonitor<GithubOptions> options,
|
||||
ILogger<RemoteDomainAddressProvider> logger)
|
||||
ILogger<MetaDomainAddressProvider> logger)
|
||||
{
|
||||
this.options = options;
|
||||
this.logger = logger;
|
||||
@ -28,7 +28,7 @@ namespace FastGithub.Scanner.DomainMiddlewares
|
||||
|
||||
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
|
||||
{
|
||||
var setting = this.options.CurrentValue.RemoteAddressProvider;
|
||||
var setting = this.options.CurrentValue.MetaDomainAddress;
|
||||
if (setting.Enable == false)
|
||||
{
|
||||
return Enumerable.Empty<DomainAddress>();
|
||||
@ -56,10 +56,6 @@ namespace FastGithub.Scanner.DomainMiddlewares
|
||||
[JsonPropertyName("web")]
|
||||
public string[] Web { get; set; } = Array.Empty<string>();
|
||||
|
||||
[JsonPropertyName("api")]
|
||||
public string[] Api { get; set; } = Array.Empty<string>();
|
||||
|
||||
|
||||
public IEnumerable<DomainAddress> ToDomainAddresses()
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DNS" Version="6.1.0" />
|
||||
<PackageReference Include="IPNetwork2" Version="2.5.320" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
|
||||
</ItemGroup>
|
||||
@ -14,10 +15,4 @@
|
||||
<ProjectReference Include="..\FastGithub.Core\FastGithub.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="IPRange.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
using System;
|
||||
|
||||
|
||||
|
||||
namespace FastGithub.Scanner
|
||||
{
|
||||
[Options("Github")]
|
||||
@ -7,9 +9,9 @@ namespace FastGithub.Scanner
|
||||
{
|
||||
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
|
||||
{
|
||||
@ -23,18 +25,20 @@ namespace FastGithub.Scanner
|
||||
}
|
||||
|
||||
|
||||
public class RemoteAddressProviderSetting
|
||||
public class MetaDoaminAddressSetting
|
||||
{
|
||||
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 class LocalAddressProviderSetting
|
||||
public class DnsDomainAddressSetting
|
||||
{
|
||||
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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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"
|
||||
]
|
||||
}
|
||||
@ -5,18 +5,36 @@
|
||||
},
|
||||
"Github": {
|
||||
"Scan": {
|
||||
"FullScanInterval": "02:00:00", // 完整扫描时间间隔
|
||||
"FullScanInterval": "02:00:00", // 完整扫描时间间隔
|
||||
"ResultScanInterval": "00:01:00", // 结果扫描时间间隔
|
||||
"TcpScanTimeout": "00:00:01", // tcp扫描超时时间
|
||||
"HttpsScanTimeout": "00:00:02" // https扫描超时时间
|
||||
"TcpScanTimeout": "00:00:01", // tcp扫描超时时间
|
||||
"HttpsScanTimeout": "00:00:02" // https扫描超时时间
|
||||
},
|
||||
"RemoteAddressProvider": {
|
||||
"MetaDomainAddress": {
|
||||
"Enable": true,
|
||||
"MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // meta资源uri
|
||||
"MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // meta资源uri
|
||||
},
|
||||
"LocalAddressProvider": {
|
||||
"DnsDomainAddress": {
|
||||
"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": {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user