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);
+ }
+ }
+}