diff --git a/Netch/Controllers/Mode/ProcessController.cs b/Netch/Controllers/Mode/ProcessController.cs index 096bde59..641035fa 100644 --- a/Netch/Controllers/Mode/ProcessController.cs +++ b/Netch/Controllers/Mode/ProcessController.cs @@ -12,6 +12,14 @@ namespace Netch.Controllers.Mode AIO_FILTERICMP, AIO_FILTERTCP, AIO_FILTERUDP, + AIO_FILTERDNS, + + AIO_ICMPING, + + AIO_DNSONLY, + AIO_DNSPROX, + AIO_DNSHOST, + AIO_DNSPORT, AIO_TGTHOST, AIO_TGTPORT, @@ -46,10 +54,21 @@ namespace Netch.Controllers.Mode Global.Logger.Info(String.Format("{0:x} Redirector.bin", Utils.FileHelper.Checksum("bin\\Redirector.bin"))); var mode = m as Models.Mode.ProcessMode.ProcessMode; - Methods.aio_dial(NameList.AIO_FILTERLOOPBACK, mode.Loopback ? "true" : "false"); - Methods.aio_dial(NameList.AIO_FILTERINTRANET, mode.Intranet ? "true" : "false"); - Methods.aio_dial(NameList.AIO_FILTERTCP, mode.TCP ? "true" : "false"); - Methods.aio_dial(NameList.AIO_FILTERUDP, mode.UDP ? "true" : "false"); + Methods.aio_dial(NameList.AIO_FILTERLOOPBACK, mode.Loopback.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_FILTERINTRANET, mode.Intranet.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_FILTERTCP, mode.TCP.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_FILTERUDP, mode.UDP.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_FILTERDNS, mode.DNS.ToString().ToLower()); + + Methods.aio_dial(NameList.AIO_ICMPING, Global.Config.ProcessMode.Icmping.ToString()); + + Methods.aio_dial(NameList.AIO_DNSONLY, Global.Config.ProcessMode.DNSOnly.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_DNSPROX, Global.Config.ProcessMode.DNSProx.ToString().ToLower()); + Methods.aio_dial(NameList.AIO_DNSHOST, Global.Config.ProcessMode.DNSHost); + Methods.aio_dial(NameList.AIO_DNSPORT, Global.Config.ProcessMode.DNSPort.ToString()); + + Methods.aio_dial(NameList.AIO_TGTUSER, ""); + Methods.aio_dial(NameList.AIO_TGTPASS, ""); Methods.aio_dial(NameList.AIO_CLRNAME, ""); Methods.aio_dial(NameList.AIO_BYPNAME, AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "\\\\")); @@ -65,14 +84,10 @@ namespace Netch.Controllers.Mode Methods.aio_dial(NameList.AIO_TGTPORT, node.Port.ToString()); if (!String.IsNullOrEmpty(node.Username)) - { Methods.aio_dial(NameList.AIO_TGTUSER, node.Username); - } if (!String.IsNullOrEmpty(node.Password)) - { Methods.aio_dial(NameList.AIO_TGTPASS, node.Password); - } } break; default: diff --git a/Netch/Controllers/Mode/TunController.cs b/Netch/Controllers/Mode/TunController.cs index 86571283..655e817d 100644 --- a/Netch/Controllers/Mode/TunController.cs +++ b/Netch/Controllers/Mode/TunController.cs @@ -60,7 +60,7 @@ namespace Netch.Controllers.Mode public static extern ulong tun_getDL(); } - private Tools.TunTap.Outbound Outbound = new(); + private Tools.Outbound Outbound = new(); private Interface.IController DNSController; private bool AssignInterface() @@ -70,9 +70,7 @@ namespace Netch.Controllers.Mode var address = Global.Config.TunMode.Network.Split('/')[0]; var netmask = byte.Parse(Global.Config.TunMode.Network.Split('/')[1]); if (!Utils.RouteHelper.CreateUnicastIP(AddressFamily.InterNetwork, address, netmask, index)) - { return false; - } NetworkInterface adapter = Utils.RouteHelper.GetInterfaceByIndex(index); if (adapter == null) @@ -197,43 +195,28 @@ namespace Netch.Controllers.Mode } if (!Methods.tun_init()) - { return false; - } if (Global.Config.Generic.AioDNS) - { this.DNSController = new Other.DNS.AioDNSController(); - } else - { this.DNSController = new Other.DNS.DNSProxyController(); - } if (!this.DNSController.Create(s, m)) - { return false; - } if (!this.AssignInterface()) - { return false; - } if (!this.CreateServerRoute(s)) - { return false; - } if (!this.CreateHandleRoute(mode)) - { return false; - } if (File.Exists("ipcidr.txt")) - { File.Delete("ipcidr.txt"); - } + return true; } diff --git a/Netch/Controllers/Server/ShadowsocksController.cs b/Netch/Controllers/Server/ShadowsocksController.cs index 4e0040c6..c31bb3ec 100644 --- a/Netch/Controllers/Server/ShadowsocksController.cs +++ b/Netch/Controllers/Server/ShadowsocksController.cs @@ -12,7 +12,7 @@ namespace Netch.Controllers.Server { StartInfo = new ProcessStartInfo() { - FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\Shadowsocks.exe"), + FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\ss-local.exe"), WorkingDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), CreateNoWindow = true, UseShellExecute = false, diff --git a/Netch/Controllers/Server/ShadowsocksRController.cs b/Netch/Controllers/Server/ShadowsocksRController.cs index f2595a56..06eecd61 100644 --- a/Netch/Controllers/Server/ShadowsocksRController.cs +++ b/Netch/Controllers/Server/ShadowsocksRController.cs @@ -12,7 +12,7 @@ namespace Netch.Controllers.Server { StartInfo = new ProcessStartInfo() { - FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\ShadowsocksR.exe"), + FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\ssr-local.exe"), WorkingDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), CreateNoWindow = true, UseShellExecute = false, diff --git a/Netch/Models/Config/ProcessMode.cs b/Netch/Models/Config/ProcessMode.cs index 1037739b..496750bb 100644 --- a/Netch/Models/Config/ProcessMode.cs +++ b/Netch/Models/Config/ProcessMode.cs @@ -3,9 +3,33 @@ public class ProcessMode { /// - /// DNS + /// 伪造 ICMP 延迟 /// - [Newtonsoft.Json.JsonProperty("dns")] - public string DNS = "1.1.1.1:53"; + [Newtonsoft.Json.JsonProperty("icmping")] + public int Icmping = 1; + + /// + /// 仅劫持规则内进程 + /// + [Newtonsoft.Json.JsonProperty("dnsOnly")] + public bool DNSOnly = false; + + /// + /// 远程 DNS 查询 + /// + [Newtonsoft.Json.JsonProperty("dnsProx")] + public bool DNSProx = true; + + /// + /// DNS 地址 + /// + [Newtonsoft.Json.JsonProperty("dnsHost")] + public string DNSHost = "1.1.1.1"; + + /// + /// DNS 端口 + /// + [Newtonsoft.Json.JsonProperty("dnsPort")] + public ushort DNSPort = 53; } } diff --git a/Netch/Models/Mode/ProcessMode/ProcessMode.cs b/Netch/Models/Mode/ProcessMode/ProcessMode.cs index 297f8a72..968170cb 100644 --- a/Netch/Models/Mode/ProcessMode/ProcessMode.cs +++ b/Netch/Models/Mode/ProcessMode/ProcessMode.cs @@ -39,6 +39,12 @@ namespace Netch.Models.Mode.ProcessMode [Newtonsoft.Json.JsonProperty("filterUDP")] public bool UDP = true; + /// + /// 过滤 DNS 流量 + /// + [Newtonsoft.Json.JsonProperty("filterDNS")] + public bool DNS = true; + /// /// 绕过列表 /// diff --git a/Netch/Models/Server/Server.cs b/Netch/Models/Server/Server.cs index 4e5d07ac..2c6c4790 100644 --- a/Netch/Models/Server/Server.cs +++ b/Netch/Models/Server/Server.cs @@ -45,7 +45,16 @@ namespace Netch.Models.Server /// 解析地址 /// /// - public string Resolve() => (Utils.DNS.Fetch(this.Host) != IPAddress.Any) ? Utils.DNS.Fetch(this.Host).ToString() : this.Host; + public string Resolve() + { + var addr = Utils.DNS.Fetch(this.Host); + while (addr == IPAddress.Any) + { + addr = Utils.DNS.Fetch(this.Host); + } + + return addr.ToString(); + } /// /// 获取备注 diff --git a/Netch/Tools/TunTap/Outbound.cs b/Netch/Tools/Outbound.cs similarity index 68% rename from Netch/Tools/TunTap/Outbound.cs rename to Netch/Tools/Outbound.cs index 754b9d57..8a25c210 100644 --- a/Netch/Tools/TunTap/Outbound.cs +++ b/Netch/Tools/Outbound.cs @@ -4,7 +4,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; -namespace Netch.Tools.TunTap +namespace Netch.Tools { public class Outbound { @@ -39,23 +39,24 @@ namespace Netch.Tools.TunTap /// public bool Get() { - if (Vanara.PInvoke.Win32Error.NO_ERROR != Vanara.PInvoke.IpHlpApi.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0), 0, out var route)) - { + if (Vanara.PInvoke.IpHlpApi.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0), 0, out var route) != Vanara.PInvoke.Win32Error.NO_ERROR) return false; - } this.Index = route.dwForwardIfIndex; - this.Interface = NetworkInterface.GetAllNetworkInterfaces() - .First(nic => - { - var ipp = nic.GetIPProperties(); - if (nic.Supports(NetworkInterfaceComponent.IPv4)) - { - return ipp.GetIPv4Properties().Index == this.Index; - } + this.Interface = NetworkInterface.GetAllNetworkInterfaces().First(nic => + { + var ipp = nic.GetIPProperties(); - return false; - }); + if (nic.Supports(NetworkInterfaceComponent.IPv4)) + { + return ipp.GetIPv4Properties().Index == this.Index; + } + + return false; + }); + + if (this.Interface == null) + return false; var addr = this.Interface.GetIPProperties().UnicastAddresses.First(ipf => { diff --git a/Netch/Utils/DNS.cs b/Netch/Utils/DNS.cs index 8f6f9797..fe307f5c 100644 --- a/Netch/Utils/DNS.cs +++ b/Netch/Utils/DNS.cs @@ -6,6 +6,22 @@ namespace Netch.Utils { public static class DNS { + /// + /// 缓存内容 + /// + private class CacheEntry + { + /// + /// 缓存时间 + /// + public long Unix; + + /// + /// 地址 + /// + public IPAddress IP; + } + /// /// 缓存表 /// @@ -22,21 +38,22 @@ namespace Netch.Utils { if (Cache.Contains(name)) { - return Cache[name] as IPAddress; + var data = Cache[name] as CacheEntry; + + if (DateTimeOffset.Now.ToUnixTimeSeconds() - data.Unix < 120) + return data.IP; + + Cache.Remove(name); } var task = Dns.GetHostAddressesAsync(name); if (!task.Wait(1000)) - { return IPAddress.Any; - } if (task.Result.Length == 0) - { return IPAddress.Any; - } - Cache.Add(name, task.Result[0]); + Cache.Add(name, new CacheEntry() { Unix = DateTimeOffset.Now.ToUnixTimeSeconds(), IP = task.Result[0] }); return task.Result[0]; } catch (Exception e) diff --git a/Netch/Utils/Netfilter.cs b/Netch/Utils/Netfilter.cs index e0ca9966..e75adaad 100644 --- a/Netch/Utils/Netfilter.cs +++ b/Netch/Utils/Netfilter.cs @@ -8,20 +8,11 @@ namespace Netch.Utils { public static class Methods { - public enum NF_STATUS : int - { - NF_STATUS_SUCCESS = 0, - NF_STATUS_FAIL = -1, - NF_STATUS_INVALID_ENDPOINT_ID = -2, - NF_STATUS_NOT_INITIALIZED = -3, - NF_STATUS_IO_ERROR = -4 - } + [DllImport("Redirector.bin", CallingConvention = CallingConvention.Cdecl)] + public static extern bool aio_register([MarshalAs(UnmanagedType.LPWStr)] string name); - [DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)] - public static extern NF_STATUS nf_registerDriver(string name); - - [DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)] - public static extern NF_STATUS nf_unRegisterDriver(string driverName); + [DllImport("Redirector.bin", CallingConvention = CallingConvention.Cdecl)] + public static extern bool aio_unregister([MarshalAs(UnmanagedType.LPWStr)] string driverName); } public static readonly string dName = "netfilter2"; @@ -42,10 +33,9 @@ namespace Netch.Utils } File.Copy(nPath, oPath); - var status = Methods.nf_registerDriver(dName); - if (status != Methods.NF_STATUS.NF_STATUS_SUCCESS) + if (!Methods.aio_register(dName)) { - Global.Logger.Error($"注册 Netfilter 驱动失败:{status}"); + Global.Logger.Error($"注册 Netfilter 驱动失败"); return false; } @@ -88,10 +78,9 @@ namespace Netch.Utils { if (File.Exists(oPath)) { - var status = Methods.nf_unRegisterDriver(dName); - if (status != Methods.NF_STATUS.NF_STATUS_SUCCESS) + if (!Methods.aio_unregister(dName)) { - Global.Logger.Error($"取消注册 Netfilter 驱动失败:{status}"); + Global.Logger.Error($"取消注册 Netfilter 驱动失败"); return false; } diff --git a/Netch/Utils/WinTUN.cs b/Netch/Utils/WinTUN.cs index 4ab5d575..37aa4e4a 100644 --- a/Netch/Utils/WinTUN.cs +++ b/Netch/Utils/WinTUN.cs @@ -6,7 +6,7 @@ namespace Netch.Utils public static class WinTUN { public static string oPath = Path.Combine(Environment.SystemDirectory, "wintun.dll"); - public static string nPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\wintun.bin"); + public static string nPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\wintun.dll"); /// /// 注册 WinTUN 驱动