diff --git a/Netch/Controllers/Mode/NFController.cs b/Netch/Controllers/Mode/NFController.cs index 5fc0ddbc..d5a1aa6f 100644 --- a/Netch/Controllers/Mode/NFController.cs +++ b/Netch/Controllers/Mode/NFController.cs @@ -15,6 +15,7 @@ namespace Netch.Controllers private static readonly string BinDriver = string.Empty; private static readonly string SystemDriver = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys"; + private static string[] _sysDns = { }; static NFController() { @@ -102,7 +103,15 @@ namespace Netch.Controllers { Thread.Sleep(250); - if (State == State.Started) return true; + if (State == State.Started) + { + + //备份并替换系统DNS + _sysDns = DNS.getSystemDns(); + string[] dns = { "1.1.1.1", "8.8.8.8" }; + DNS.SetDNS(dns); + + return true; } } Logging.Error(Name + "启动超时"); @@ -257,6 +266,8 @@ namespace Netch.Controllers public override void Stop() { StopInstance(); + //恢复系统DNS + DNS.SetDNS(_sysDns); } /// diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj index d8de9087..23ffabe8 100644 --- a/Netch/Netch.csproj +++ b/Netch/Netch.csproj @@ -70,6 +70,7 @@ + diff --git a/Netch/Utils/DNS.cs b/Netch/Utils/DNS.cs index b06b4211..22e5a152 100644 --- a/Netch/Utils/DNS.cs +++ b/Netch/Utils/DNS.cs @@ -1,6 +1,9 @@ using System; using System.Collections; +using System.Linq; +using System.Management; using System.Net; +using System.Net.NetworkInformation; namespace Netch.Utils { @@ -45,5 +48,51 @@ namespace Netch.Utils return null; } } + /// + /// 设置DNS + /// + /// + public static void SetDNS(string[] dns) + { + ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration"); + ManagementObjectCollection moc = wmi.GetInstances(); + ManagementBaseObject inPar = null; + ManagementBaseObject outPar = null; + foreach (ManagementObject mo in moc) + { + //如果没有启用IP设置的网络设备则跳过,如果是虚拟机网卡也跳过 + if (!(bool)mo["IPEnabled"] || + mo["Description"].ToString().Contains("Virtual") || + mo["Description"].ToString().Contains("VMware") || + mo["Description"].ToString().Contains("TAP")) + continue; + + //设置DNS地址 + if (dns != null) + { + inPar = mo.GetMethodParameters("SetDNSServerSearchOrder"); + inPar["DNSServerSearchOrder"] = dns; + outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null); + } + } + } + /// + /// 从网卡获取ip设置信息 + /// + public static string[] getSystemDns() + { + var systemDns = new[] { "223.5.5.5", "1.1.1.1" }; + foreach (var network in NetworkInterface.GetAllNetworkInterfaces()) + if (!network.Description.Contains("Virtual") && + !network.Description.Contains("VMware") && + !network.Description.Contains("TAP") && + network.OperationalStatus == OperationalStatus.Up && + network.GetIPProperties()?.GatewayAddresses.Count != 0) + { + systemDns = network.GetIPProperties().DnsAddresses.Select(dns => dns.ToString()).ToArray(); + } + + return systemDns; + } } -} +} \ No newline at end of file diff --git a/binaries b/binaries index 841b75af..2adb17a3 160000 --- a/binaries +++ b/binaries @@ -1 +1 @@ -Subproject commit 841b75af2f5fab0eaabd81c82fc2b322b1854828 +Subproject commit 2adb17a398e498d8c780a16d2619f6a388127969