diff --git a/Netch/Controllers/DNSController.cs b/Netch/Controllers/DNSController.cs new file mode 100644 index 00000000..8f9cbb3c --- /dev/null +++ b/Netch/Controllers/DNSController.cs @@ -0,0 +1,37 @@ +using System; +using System.Net; + +namespace Netch.Controllers +{ + public class DNSController + { + public static DNS.Server.DnsServer Server = new DNS.Server.DnsServer(new Resolver()); + + public bool Start() + { + try + { + _ = Server.Listen(new IPEndPoint(IPAddress.IPv6Any, 53)); + } + catch (Exception e) + { + Utils.Logging.Info(e.ToString()); + return false; + } + + return true; + } + + public void Stop() + { + try + { + Server.Dispose(); + } + catch (Exception e) + { + Utils.Logging.Info(e.ToString()); + } + } + } +} diff --git a/Netch/Controllers/TUNTAPController.cs b/Netch/Controllers/TUNTAPController.cs index 6fcb36a8..82565c52 100644 --- a/Netch/Controllers/TUNTAPController.cs +++ b/Netch/Controllers/TUNTAPController.cs @@ -32,6 +32,11 @@ namespace Netch.Controllers public Models.Server SavedServer = new Models.Server(); public Models.Mode SavedMode = new Models.Mode(); + /// + /// 本地 DNS 服务控制器 + /// + public DNSController pDNSController = new DNSController(); + /// /// 配置 TUNTAP 适配器 /// @@ -292,7 +297,9 @@ namespace Netch.Controllers } else { - dns = "1.1.1.1,1.0.0.1"; + pDNSController.Start(); + dns = "127.0.0.1"; + //dns = "1.1.1.1,1.0.0.1"; } if (server.Type == "Socks5") diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj index a2beaf9c..56858fbb 100644 --- a/Netch/Netch.csproj +++ b/Netch/Netch.csproj @@ -65,6 +65,8 @@ + + diff --git a/Netch/Resolver.cs b/Netch/Resolver.cs new file mode 100644 index 00000000..ef6b46de --- /dev/null +++ b/Netch/Resolver.cs @@ -0,0 +1,59 @@ +using DNS.Protocol; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace Netch +{ + public class Resolver : DNS.Client.RequestResolver.IRequestResolver + { + public Task Resolve(IRequest request) + { + IResponse response = Response.FromRequest(request); + + foreach (var question in response.Questions) + { + if (question.Type == RecordType.A) + { + var client = new DnsClient.LookupClient(DnsClient.NameServer.GooglePublicDns); + client.UseTcpOnly = true; + client.UseCache = true; + + try + { + var result = client.Query(question.Name.ToString(), DnsClient.QueryType.A); + foreach (var item in result.Answers.ARecords()) + { + response.AnswerRecords.Add(new DNS.Protocol.ResourceRecords.IPAddressResourceRecord(question.Name, item.Address)); + } + } + catch (Exception) + { + // 跳过 + } + } + else if (question.Type == RecordType.AAAA) + { + var client = new DnsClient.LookupClient(DnsClient.NameServer.GooglePublicDns); + client.UseTcpOnly = true; + client.UseCache = true; + + try + { + var result = client.Query(question.Name.ToString(), DnsClient.QueryType.AAAA); + foreach (var item in result.Answers.AaaaRecords()) + { + response.AnswerRecords.Add(new DNS.Protocol.ResourceRecords.IPAddressResourceRecord(question.Name, item.Address)); + } + } + catch (Exception) + { + // 跳过 + } + } + } + + return Task.FromResult(response); + } + } +}