增加DnsDomainAddressProvider
This commit is contained in:
parent
73b5914136
commit
52b5272c18
@ -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>
|
||||||
|
|||||||
@ -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
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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": {
|
"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" // meta资源uri
|
"MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // meta资源uri
|
||||||
},
|
},
|
||||||
"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": {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user