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 驱动