diff --git a/Netch/Controllers/TUNTAPController.cs b/Netch/Controllers/TUNTAPController.cs
index 1a76d84f..ba723d62 100644
--- a/Netch/Controllers/TUNTAPController.cs
+++ b/Netch/Controllers/TUNTAPController.cs
@@ -1,14 +1,12 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
-using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using System.Windows.Forms;
using Netch.Models;
using Netch.Servers.Socks5;
using Netch.Utils;
@@ -17,9 +15,7 @@ namespace Netch.Controllers
{
public class TUNTAPController : Guard, IModeController
{
- private Mode _savedMode = new Mode();
- private Server _savedServer = new Server();
-
+
///
/// 服务器 IP 地址
///
@@ -41,11 +37,9 @@ namespace Netch.Controllers
public bool Start(in Mode mode)
{
- _savedMode = mode;
- _savedServer = MainController.Server;
-
+ var server = MainController.Server;
// 查询服务器 IP 地址
- _serverAddresses = DNS.Lookup(_savedServer.Hostname);
+ _serverAddresses = DNS.Lookup(server.Hostname);
// 查找出口适配器
if (!Utils.Utils.SearchOutboundAdapter())
@@ -66,7 +60,7 @@ namespace Netch.Controllers
}
- SetupRouteTable();
+ SetupRouteTable(mode);
Global.MainForm.StatusText(i18N.TranslateFormat("Starting {0}", Name));
@@ -104,8 +98,8 @@ namespace Netch.Controllers
}
var argument = new StringBuilder();
- if (_savedServer is Socks5 socks5 && !socks5.Auth())
- argument.Append($"-proxyServer {_serverAddresses}:{_savedServer.Port} ");
+ if (server is Socks5 socks5 && !socks5.Auth())
+ argument.Append($"-proxyServer {server.AutoResolveHostname()}:{server.Port} ");
else
argument.Append($"-proxyServer 127.0.0.1:{Global.Settings.Socks5LocalPort} ");
@@ -140,73 +134,75 @@ namespace Netch.Controllers
/// 设置绕行规则
///
/// 是否设置成功
- private void SetupRouteTable()
+ private void SetupRouteTable(Mode mode)
{
Global.MainForm.StatusText(i18N.Translate("SetupBypass"));
Logging.Info("设置路由规则");
#region Rule IPs
- if (_savedMode.Type == 1)
+ switch (mode.Type)
{
- // 代理规则
- Logging.Info("代理 → 规则 IP");
- RouteAction(Action.Create, _savedMode.FullRule, RouteType.TUNTAP);
+ case 1:
+ // 代理规则
+ Logging.Info("代理 → 规则 IP");
+ RouteAction(Action.Create, mode.FullRule, RouteType.TUNTAP);
- //处理 NAT 类型检测,由于协议的原因,无法仅通过域名确定需要代理的 IP,自己记录解析了返回的 IP,仅支持默认检测服务器
- if (Global.Settings.STUN_Server == "stun.stunprotocol.org")
- {
- try
+ //处理 NAT 类型检测,由于协议的原因,无法仅通过域名确定需要代理的 IP,自己记录解析了返回的 IP,仅支持默认检测服务器
+ if (Global.Settings.STUN_Server == "stun.stunprotocol.org")
{
- Logging.Info("代理 → STUN 服务器 IP");
- RouteAction(Action.Create,
- new[]
- {
- Dns.GetHostAddresses(Global.Settings.STUN_Server)[0],
- Dns.GetHostAddresses("stunresponse.coldthunder11.com")[0]
- }.Select(ip => $"{ip}/32"),
- RouteType.TUNTAP);
+ try
+ {
+ Logging.Info("代理 → STUN 服务器 IP");
+ RouteAction(Action.Create,
+ new[]
+ {
+ Dns.GetHostAddresses(Global.Settings.STUN_Server)[0],
+ Dns.GetHostAddresses("stunresponse.coldthunder11.com")[0]
+ }.Select(ip => $"{ip}/32"),
+ RouteType.TUNTAP);
+ }
+ catch
+ {
+ Logging.Info("NAT 类型测试域名解析失败,将不会被添加到代理列表");
+ }
}
- catch
- {
- Logging.Info("NAT 类型测试域名解析失败,将不会被添加到代理列表");
- }
- }
- if (Global.Settings.TUNTAP.ProxyDNS)
- {
- Logging.Info("代理 → 自定义 DNS");
- if (Global.Settings.TUNTAP.UseCustomDNS)
+ if (Global.Settings.TUNTAP.ProxyDNS)
{
- RouteAction(Action.Create,
- Global.Settings.TUNTAP.DNS.Select(ip => $"{ip}/32"),
- RouteType.TUNTAP);
+ Logging.Info("代理 → 自定义 DNS");
+ if (Global.Settings.TUNTAP.UseCustomDNS)
+ {
+ RouteAction(Action.Create,
+ Global.Settings.TUNTAP.DNS.Select(ip => $"{ip}/32"),
+ RouteType.TUNTAP);
+ }
+ else
+ {
+ RouteAction(Action.Create,
+ new[] {"1.1.1.1", "8.8.8.8", "9.9.9.9", "185.222.222.222"}.Select(ip => $"{ip}/32"),
+ RouteType.TUNTAP);
+ }
}
- else
- {
- RouteAction(Action.Create,
- new[] {"1.1.1.1", "8.8.8.8", "9.9.9.9", "185.222.222.222"}.Select(ip => $"{ip}/32"),
- RouteType.TUNTAP);
- }
- }
- }
- else if (_savedMode.Type == 2)
- {
- // 绕过规则
- // 将 TUN/TAP 网卡权重放到最高
- Process.Start(new ProcessStartInfo
- {
- FileName = "netsh",
- Arguments = $"interface ip set interface {Global.TUNTAP.Index} metric=0",
- WindowStyle = ProcessWindowStyle.Hidden,
- UseShellExecute = true,
- CreateNoWindow = true
- }
- );
+ break;
+ case 2:
+ // 绕过规则
- Logging.Info("绕行 → 规则 IP");
- RouteAction(Action.Create, _savedMode.FullRule, RouteType.Outbound);
+ // 将 TUN/TAP 网卡权重放到最高
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = "netsh",
+ Arguments = $"interface ip set interface {Global.TUNTAP.Index} metric=0",
+ WindowStyle = ProcessWindowStyle.Hidden,
+ UseShellExecute = true,
+ CreateNoWindow = true
+ }
+ );
+
+ Logging.Info("绕行 → 规则 IP");
+ RouteAction(Action.Create, mode.FullRule, RouteType.Outbound);
+ break;
}
#endregion
@@ -218,7 +214,7 @@ namespace Netch.Controllers
Logging.Info("绕行 → 全局绕过 IP");
RouteAction(Action.Create, Global.Settings.BypassIPs, RouteType.Outbound);
- if (_savedMode.Type == 2)
+ if (mode.Type == 2)
{
// 绕过规则
Logging.Info("代理 → 全局");