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 options; private readonly ILogger logger; public DnsDomainAddressProvider( IOptionsMonitor options, ILogger logger) { this.options = options; this.logger = logger; } public async Task> CreateDomainAddressesAsync() { var setting = this.options.CurrentValue.DnsDomainAddress; if (setting.Enable == false) { return Enumerable.Empty(); } var result = new List(); foreach (var dns in setting.Dnss) { var domainAddresses = await this.LookupAsync(dns, setting.Domains); result.AddRange(domainAddresses); } return result; } private async Task> LookupAsync(string dns, IEnumerable domains) { var client = new DnsClient(dns); var result = new List(); 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; } } }