using FastGithub.Configuration; using System; using System.Linq; using System.Net; using System.Net.NetworkInformation; namespace FastGithub.Dns { /// /// 系统域名服务工具 /// static class SystemDnsUtil { /// /// 设置为主dns /// /// public static void SetAsPrimitiveDns() { var @interface = GetOutboundNetworkInterface(); if (@interface == null) { throw new FastGithubException($"找不到匹配的网络适配器来设置主DNS"); } var dnsAddresses = @interface.GetIPProperties().DnsAddresses; var firstRecord = dnsAddresses.FirstOrDefault(); if (firstRecord == null || LocalMachine.ContainsIPAddress(firstRecord) == false) { var primitive = IPAddress.Loopback; if (OperatingSystem.IsLinux()) { throw new FastGithubException($"不支持自动设置本机DNS,请手工添加{primitive}做为/etc/resolv.conf的第一条记录"); } else if (OperatingSystem.IsMacOS()) { throw new FastGithubException($"不支持自动设置本机DNS,请手工添加{primitive}做为连接网络的DNS的第一条记录"); } } } /// /// 从主dns移除 /// /// public static void RemoveFromPrimitiveDns() { var @interface = GetOutboundNetworkInterface(); if (@interface == null) { throw new FastGithubException($"找不到匹配的网络适配器来移除主DNS"); } var dnsAddresses = @interface.GetIPProperties().DnsAddresses; var firstRecord = dnsAddresses.FirstOrDefault(); if (firstRecord != null && LocalMachine.ContainsIPAddress(firstRecord)) { if (OperatingSystem.IsLinux()) { throw new FastGithubException($"不支持自动移除本机主DNS,请手工移除/etc/resolv.conf的第一条记录"); } else if (OperatingSystem.IsMacOS()) { throw new FastGithubException($"不支持自动移除本机主DNS,请手工移除连接网络的DNS的第一条记录"); } } } /// /// 查找出口的网络适器 /// /// private static NetworkInterface? GetOutboundNetworkInterface() { var remoteEndPoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 53); var address = LocalMachine.GetLocalIPAddress(remoteEndPoint); if (address == null) { return default; } return NetworkInterface .GetAllNetworkInterfaces() .Where(item => item.GetIPProperties().UnicastAddresses.Any(a => a.Address.Equals(address))) .FirstOrDefault(); } } }