Compare commits

..

5 Commits

Author SHA1 Message Date
Amazing_DM
658ed3245f Update version 2020-03-06 13:17:27 +08:00
Amazing_DM
d443c6d311 :sparkles:启动时显示详细信息 2020-03-06 13:03:37 +08:00
Amazing_DM
caa6b8fa94 :ambulance:恢复本地DNS服务 2020-03-06 12:37:14 +08:00
Amazing_DM
26af839d01 Update submodule 2020-03-06 12:15:56 +08:00
Amazing_DM
08db39f72b Update submodule 2020-03-05 21:32:43 +08:00
13 changed files with 145 additions and 8 deletions

View File

@@ -0,0 +1,39 @@
using Netch.Forms;
using System;
using System.Net;
namespace Netch.Controllers
{
public class DNSController
{
public static DNS.Server.DnsServer Server = new DNS.Server.DnsServer(new Resolver());
public bool Start()
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting LocalDns service")}");
try
{
_ = Server.Listen(new IPEndPoint(IPAddress.IPv6Any, 53));
}
catch (Exception e)
{
Utils.Logging.Info(e.ToString());
return false;
}
return true;
}
public void Stop()
{
try
{
Server.Dispose();
}
catch (Exception e)
{
Utils.Logging.Info(e.ToString());
}
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using Netch.Forms;
using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
@@ -39,6 +40,7 @@ namespace Netch.Controllers
/// <returns>是否成功</returns>
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Redirector")}");
if (!File.Exists("bin\\Redirector.exe"))
{
return false;
@@ -98,6 +100,7 @@ namespace Netch.Controllers
var service = new ServiceController("netfilter2");
if (service.Status == ServiceControllerStatus.Stopped)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting netfilter2 Service")}");
service.Start();
}
}

View File

@@ -24,6 +24,7 @@ namespace Netch.Controllers
/// <returns></returns>
public (bool, string, string, string) Start()
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting NatTester")}");
try
{
if (!File.Exists("bin\\NTT.exe"))

View File

@@ -1,4 +1,5 @@
using System;
using Netch.Forms;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
@@ -25,6 +26,7 @@ namespace Netch.Controllers
/// <returns>是否启动成功</returns>
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Shadowsocks")}");
if (!File.Exists("bin\\Shadowsocks.exe"))
{
return false;

View File

@@ -1,4 +1,5 @@
using System;
using Netch.Forms;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
@@ -25,6 +26,7 @@ namespace Netch.Controllers
/// <returns>是否启动成功</returns>
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting ShadowsocksR")}");
if (!File.Exists("bin\\ShadowsocksR.exe"))
{
return false;

View File

@@ -4,7 +4,7 @@ using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using Netch.Forms;
using Netch.Utils;
namespace Netch.Controllers
@@ -32,6 +32,11 @@ namespace Netch.Controllers
public Models.Server SavedServer = new Models.Server();
public Models.Mode SavedMode = new Models.Mode();
/// <summary>
/// 本地 DNS 服务控制器
/// </summary>
public DNSController pDNSController = new DNSController();
/// <summary>
/// 配置 TUNTAP 适配器
/// </summary>
@@ -58,6 +63,7 @@ namespace Netch.Controllers
/// </summary>
public bool SetupBypass()
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("SetupBypass")}");
// 让服务器 IP 走直连
foreach (var address in ServerAddresses)
{
@@ -237,6 +243,7 @@ namespace Netch.Controllers
/// <returns>是否成功</returns>
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Tap")}");
foreach (var proc in Process.GetProcessesByName("tun2socks"))
{
try
@@ -292,7 +299,9 @@ namespace Netch.Controllers
}
else
{
dns = "1.1.1.1,1.0.0.1";
pDNSController.Start();
dns = "127.0.0.1";
//dns = "1.1.1.1,1.0.0.1";
}
if (server.Type == "Socks5")

View File

@@ -26,7 +26,7 @@ namespace Netch.Controllers
public const string Name = @"Netch";
public const string Copyright = @"Copyright © 2019 - 2020";
public const string Version = @"1.3.8";
public const string Version = @"1.3.9";
public async void Check(bool notifyNoFound, bool isPreRelease)
{

View File

@@ -1,4 +1,5 @@
using System;
using Netch.Forms;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@@ -26,6 +27,7 @@ namespace Netch.Controllers
/// <returns>是否启动成功</returns>
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting V2ray")}");
if (!File.Exists("bin\\v2ray.exe") || !File.Exists("bin\\v2ctl.exe"))
{
return false;

View File

@@ -41,6 +41,11 @@ namespace Netch.Forms
public List<Button> ProfileButtons = new List<Button>();
/// <summary>
/// 主窗体的静态实例
/// </summary>
public static MainForm Instance = null;
public MainForm()
{
InitializeComponent();
@@ -48,6 +53,7 @@ namespace Netch.Forms
CheckForIllegalCrossThreadCalls = false;
// MenuStrip.Renderer = new Override.ToolStripProfessionalRender();
Instance = this;
}
private void CheckUpdate()
@@ -1214,5 +1220,8 @@ namespace Netch.Forms
MessageBox.Show(Utils.i18N.Translate("Please select a server first"), Utils.i18N.Translate("Information"), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public void StatusText(string text) {
StatusLabel.Text = text;
}
}
}

View File

@@ -65,6 +65,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="DNS" Version="5.0.0" />
<PackageReference Include="DnsClient" Version="1.2.0" />
<PackageReference Include="ini-parser" Version="2.5.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="System.Buffers" Version="4.5.0" />

59
Netch/Resolver.cs Normal file
View File

@@ -0,0 +1,59 @@
using DNS.Protocol;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace Netch
{
public class Resolver : DNS.Client.RequestResolver.IRequestResolver
{
public Task<IResponse> Resolve(IRequest request)
{
IResponse response = Response.FromRequest(request);
foreach (var question in response.Questions)
{
if (question.Type == RecordType.A)
{
var client = new DnsClient.LookupClient(DnsClient.NameServer.GooglePublicDns);
client.UseTcpOnly = true;
client.UseCache = true;
try
{
var result = client.Query(question.Name.ToString(), DnsClient.QueryType.A);
foreach (var item in result.Answers.ARecords())
{
response.AnswerRecords.Add(new DNS.Protocol.ResourceRecords.IPAddressResourceRecord(question.Name, item.Address));
}
}
catch (Exception)
{
// 跳过
}
}
else if (question.Type == RecordType.AAAA)
{
var client = new DnsClient.LookupClient(DnsClient.NameServer.GooglePublicDns);
client.UseTcpOnly = true;
client.UseCache = true;
try
{
var result = client.Query(question.Name.ToString(), DnsClient.QueryType.AAAA);
foreach (var item in result.Answers.AaaaRecords())
{
response.AnswerRecords.Add(new DNS.Protocol.ResourceRecords.IPAddressResourceRecord(question.Name, item.Address));
}
}
catch (Exception)
{
// 跳过
}
}
}
return Task.FromResult(response);
}
}
}

View File

@@ -16,6 +16,15 @@
"Started": "已启动",
"Stopping": "正在停止中",
"Stopped": "已停止",
"Starting Shadowsocks": "正在启动Shadowsocks",
"Starting ShadowsocksR": "正在启动ShadowsocksR",
"Starting V2ray": "正在启动V2ray",
"Starting Tap": "正在启动Tap",
"Starting NatTester": "正在启动Nat测试",
"Starting LocalDns service": "正在启动本地DNS服务",
"Starting Redirector": "正在启动Redirector",
"Starting netfilter2 Service": "正在启动netfilter2服务",
"SetupBypass": "设置绕行规则",
"Server": "服务器",
"Import Servers From Clipboard": "从剪贴板导入服务器",