From c8f28f29f143bb0cae2d2ecca2a093d5c114a055 Mon Sep 17 00:00:00 2001
From: ChsBuffer <33744752+chsbuffer@users.noreply.github.com>
Date: Wed, 8 Jul 2020 22:54:07 +0800
Subject: [PATCH 1/2] =?UTF-8?q?NAT=20=E6=8C=87=E7=A4=BA=E7=81=AF=EF=BC=8C?=
=?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=A0=8F=E8=87=AA=E5=8A=A8=E5=81=9C=E6=AD=A2?=
=?UTF-8?q?=E5=B9=B6=E9=80=80=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Netch/Forms/MainForm.Designer.cs | 29 ++++++++++++-
Netch/Forms/MainForm.MenuStrip.cs | 20 +--------
Netch/Forms/MainForm.Status.cs | 69 +++++++++++++++++++++++++------
Netch/Forms/MainForm.cs | 37 +++++++++++++++--
Netch/Models/STUN.Client.cs | 16 +++++++
5 files changed, 135 insertions(+), 36 deletions(-)
create mode 100644 Netch/Models/STUN.Client.cs
diff --git a/Netch/Forms/MainForm.Designer.cs b/Netch/Forms/MainForm.Designer.cs
index eda41b50..48bafdeb 100644
--- a/Netch/Forms/MainForm.Designer.cs
+++ b/Netch/Forms/MainForm.Designer.cs
@@ -78,7 +78,9 @@ namespace Netch.Forms
this.UsedBandwidthLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.DownloadSpeedLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.UploadSpeedLabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.blankToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.NatTypeStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.NatTypeStatusLightLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.ControlButton = new System.Windows.Forms.Button();
this.NotifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.NotifyMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
@@ -309,7 +311,7 @@ namespace Netch.Forms
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
this.exitToolStripMenuItem.Size = new System.Drawing.Size(40, 22);
this.exitToolStripMenuItem.Text = "Exit";
- this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripButton_Click);
+ this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
// RelyToolStripMenuItem
//
@@ -528,7 +530,9 @@ namespace Netch.Forms
this.UsedBandwidthLabel,
this.DownloadSpeedLabel,
this.UploadSpeedLabel,
- this.NatTypeStatusLabel});
+ this.blankToolStripStatusLabel,
+ this.NatTypeStatusLabel,
+ this.NatTypeStatusLightLabel});
this.StatusStrip.Location = new System.Drawing.Point(0, 250);
this.StatusStrip.Name = "StatusStrip";
this.StatusStrip.Size = new System.Drawing.Size(733, 22);
@@ -563,11 +567,29 @@ namespace Netch.Forms
this.UploadSpeedLabel.Text = "↑: 0 KB/s";
this.UploadSpeedLabel.Visible = false;
//
+ // blankToolStripStatusLabel
+ //
+ this.blankToolStripStatusLabel.Name = "blankToolStripStatusLabel";
+ this.blankToolStripStatusLabel.Size = new System.Drawing.Size(268, 17);
+ this.blankToolStripStatusLabel.Spring = true;
+ //
// NatTypeStatusLabel
//
this.NatTypeStatusLabel.Name = "NatTypeStatusLabel";
this.NatTypeStatusLabel.Size = new System.Drawing.Size(36, 17);
this.NatTypeStatusLabel.Text = "NAT:";
+ this.NatTypeStatusLabel.TextAlign = System.Drawing.ContentAlignment.BottomLeft;
+ //
+ // NatTypeStatusLightLabel
+ //
+ this.NatTypeStatusLightLabel.ActiveLinkColor = System.Drawing.Color.Red;
+ this.NatTypeStatusLightLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.NatTypeStatusLightLabel.ForeColor = System.Drawing.Color.Red;
+ this.NatTypeStatusLightLabel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1);
+ this.NatTypeStatusLightLabel.Name = "NatTypeStatusLightLabel";
+ this.NatTypeStatusLightLabel.Size = new System.Drawing.Size(18, 21);
+ this.NatTypeStatusLightLabel.Text = "⬤";
+ this.NatTypeStatusLightLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
//
// ControlButton
//
@@ -751,5 +773,8 @@ namespace Netch.Forms
private System.Windows.Forms.ToolStripLabel VersionLabel;
#endregion
+
+ private System.Windows.Forms.ToolStripStatusLabel NatTypeStatusLightLabel;
+ private System.Windows.Forms.ToolStripStatusLabel blankToolStripStatusLabel;
}
}
\ No newline at end of file
diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs
index b344ac50..945c5e02 100644
--- a/Netch/Forms/MainForm.MenuStrip.cs
+++ b/Netch/Forms/MainForm.MenuStrip.cs
@@ -403,7 +403,6 @@ namespace Netch.Forms
}
finally
{
-
UpdateStatus(State.Waiting);
MainController.Stop();
}
@@ -413,28 +412,12 @@ namespace Netch.Forms
#endregion
- private void ExitToolStripButton_Click(object sender, EventArgs e)
+ private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
- // 已启动
if (State != State.Waiting && State != State.Stopped)
{
- // 未开启自动停止
- if (!Global.Settings.StopWhenExited)
- {
- MessageBoxX.Show(i18N.Translate("Please press Stop button first"));
-
- Visible = true;
- ShowInTaskbar = true; // 显示在系统任务栏
- WindowState = FormWindowState.Normal; // 还原窗体
- NotifyIcon.Visible = true; // 托盘图标隐藏
-
- return;
- }
- // 自动停止
-
ControlButton_Click(sender, e);
}
-
SaveConfigs();
UpdateStatus(State.Terminating);
@@ -490,6 +473,5 @@ namespace Netch.Forms
}
#endregion
-
}
}
\ No newline at end of file
diff --git a/Netch/Forms/MainForm.Status.cs b/Netch/Forms/MainForm.Status.cs
index fafb44b1..556e3542 100644
--- a/Netch/Forms/MainForm.Status.cs
+++ b/Netch/Forms/MainForm.Status.cs
@@ -1,5 +1,8 @@
-using Netch.Models;
+using System;
+using System.Windows.Media;
+using Netch.Models;
using Netch.Utils;
+using Color = System.Drawing.Color;
namespace Netch.Forms
{
@@ -19,15 +22,57 @@ namespace Netch.Forms
if (State != State.Started)
{
NatTypeStatusLabel.Text = "";
- NatTypeStatusLabel.Visible = true;
+ NatTypeStatusLabel.Visible = false;
+ NatTypeStatusLightLabel.Visible = false;
return;
}
+ if (!string.IsNullOrEmpty(text))
+ {
+ NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") + text.Trim();
+ }
+ else
+ {
+ NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") + i18N.Translate("Test failed");
+ }
- NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") +
- (!string.IsNullOrEmpty(text) ? text.Trim() : i18N.Translate("Test failed"));
+ if (Enum.TryParse(text,false,out STUN_Client.NatType natType))
+ {
+ UpdateNatTypeLight(natType);
+ NatTypeStatusLightLabel.Visible = true;
+ }
+ else
+ {
+ NatTypeStatusLightLabel.Visible = false;
+ }
NatTypeStatusLabel.Visible = true;
}
+ private void UpdateNatTypeLight(STUN_Client.NatType natType)
+ {
+ Color c;
+ switch (natType)
+ {
+ case STUN_Client.NatType.UdpBlocked:
+ case STUN_Client.NatType.SymmetricUdpFirewall:
+ case STUN_Client.NatType.Symmetric:
+ c = Color.Red;
+ break;
+ case STUN_Client.NatType.RestrictedCone:
+ case STUN_Client.NatType.PortRestrictedCone:
+ c = Color.Yellow;
+ break;
+ case STUN_Client.NatType.OpenInternet:
+ case STUN_Client.NatType.FullCone:
+ c = Color.LimeGreen;
+ break;
+ default:
+ c=Color.Red;
+ break;
+ }
+ NatTypeStatusLightLabel.ForeColor=c;
+ }
+
+
public void StatusText(string text)
{
StatusLabel.Text = i18N.Translate("Status", ": ") + text;
@@ -45,17 +90,17 @@ namespace Netch.Forms
switch (state)
{
case State.Waiting:
- ControlButton.Text = i18N.Translate("Start");
ControlButton.Enabled = true;
-
+ ControlButton.Text = i18N.Translate("Start");
+
MenuStrip.Enabled = ConfigurationGroupBox.Enabled = ControlButton.Enabled = SettingsButton.Enabled = true;
updateACLWithProxyToolStripMenuItem.Enabled = true;
-
+
NatTypeStatusText();
break;
case State.Starting:
- ControlButton.Text = "...";
ControlButton.Enabled = false;
+ ControlButton.Text = "...";
ServerComboBox.Enabled = false;
ModeComboBox.Enabled = false;
@@ -66,22 +111,22 @@ namespace Netch.Forms
reinstallTapDriverToolStripMenuItem.Enabled = false;
break;
case State.Started:
- ControlButton.Text = i18N.Translate("Stop");
ControlButton.Enabled = true;
+ ControlButton.Text = i18N.Translate("Stop");
break;
case State.Stopping:
ControlButton.Enabled = false;
ControlButton.Text = "...";
-
+
ProfileGroupBox.Enabled = false;
MenuStrip.Enabled = ConfigurationGroupBox.Enabled = SettingsButton.Enabled = true;
UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = false;
NatTypeStatusText();
break;
case State.Stopped:
- ControlButton.Text = i18N.Translate("Start");
ControlButton.Enabled = true;
-
+ ControlButton.Text = i18N.Translate("Start");
+
LastUploadBandwidth = 0;
LastDownloadBandwidth = 0;
diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs
index 16259004..bdf84468 100644
--- a/Netch/Forms/MainForm.cs
+++ b/Netch/Forms/MainForm.cs
@@ -72,7 +72,7 @@ namespace Netch.Forms
// 加载翻译
InitText();
-
+
//
NatTypeStatusText();
@@ -85,7 +85,7 @@ namespace Netch.Forms
// 为 ComboBox绘制 收集宽度数据
_eWidth = ServerComboBox.Width / 10;
-
+
// 自动检测延迟
Task.Run(() =>
{
@@ -414,6 +414,37 @@ namespace Netch.Forms
Activate();
}
+ private void ExitToolStripButton_Click(object sender, EventArgs e)
+ {
+ // 已启动
+ if (State != State.Waiting && State != State.Stopped)
+ {
+ // 未开启自动停止
+ if (!Global.Settings.StopWhenExited)
+ {
+ MessageBoxX.Show(i18N.Translate("Please press Stop button first"));
+
+ Visible = true;
+ ShowInTaskbar = true; // 显示在系统任务栏
+ WindowState = FormWindowState.Normal; // 还原窗体
+ NotifyIcon.Visible = true; // 托盘图标隐藏
+
+ return;
+ }
+ // 自动停止
+
+ ControlButton_Click(sender, e);
+ }
+
+ SaveConfigs();
+
+ UpdateStatus(State.Terminating);
+ NotifyIcon.Visible = false;
+ Close();
+ Dispose();
+ Environment.Exit(Environment.ExitCode);
+ }
+
private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (WindowState == FormWindowState.Minimized)
@@ -428,7 +459,7 @@ namespace Netch.Forms
}
#endregion
-
+
#endregion
}
}
\ No newline at end of file
diff --git a/Netch/Models/STUN.Client.cs b/Netch/Models/STUN.Client.cs
new file mode 100644
index 00000000..763f12f1
--- /dev/null
+++ b/Netch/Models/STUN.Client.cs
@@ -0,0 +1,16 @@
+namespace Netch.Models
+{
+ public class STUN_Client
+ {
+ public enum NatType
+ {
+ UdpBlocked,
+ OpenInternet,
+ SymmetricUdpFirewall,
+ FullCone,
+ RestrictedCone,
+ PortRestrictedCone,
+ Symmetric
+ }
+ }
+}
\ No newline at end of file
From f605bfa437bd7e2bd2677f0fb978fbea2f4afc31 Mon Sep 17 00:00:00 2001
From: ChsBuffer <33744752+chsbuffer@users.noreply.github.com>
Date: Wed, 8 Jul 2020 23:01:15 +0800
Subject: [PATCH 2/2] =?UTF-8?q?Netch=20=E8=87=AA=E5=8A=A8=E5=8A=A0?=
=?UTF-8?q?=E5=85=A5=E9=98=B2=E7=81=AB=E5=A2=99=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Netch/Forms/MainForm.Control.cs | 2 +
Netch/Netch.csproj | 8 ++
Netch/Utils/Firewall.cs | 128 ++++++++++++++++++++++++++++++++
3 files changed, 138 insertions(+)
create mode 100644 Netch/Utils/Firewall.cs
diff --git a/Netch/Forms/MainForm.Control.cs b/Netch/Forms/MainForm.Control.cs
index 619dfece..6389d78c 100644
--- a/Netch/Forms/MainForm.Control.cs
+++ b/Netch/Forms/MainForm.Control.cs
@@ -36,6 +36,8 @@ namespace Netch.Forms
//MenuStrip.Enabled = ConfigurationGroupBox.Enabled = ControlButton.Enabled = SettingsButton.Enabled = false;
UpdateStatus(State.Starting);
+
+ Firewall.AddNetchFwRules();
Task.Run(() =>
{
diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj
index 5689d44c..d8de9087 100644
--- a/Netch/Netch.csproj
+++ b/Netch/Netch.csproj
@@ -46,6 +46,14 @@
false
false
+
+ 58fbcf7c-e7a9-467c-80b3-fc65e8fcca08
+ 1
+ 0
+ 0
+ tlbimp
+ false
+
diff --git a/Netch/Utils/Firewall.cs b/Netch/Utils/Firewall.cs
new file mode 100644
index 00000000..33adfd18
--- /dev/null
+++ b/Netch/Utils/Firewall.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using NetFwTypeLib;
+
+namespace Netch.Utils
+{
+ public class Firewall
+ {
+ private static readonly string[] ProgramPath =
+ {
+ "bin/NTT.exe",
+ "bin/Privoxy.exe",
+ "bin/Redirector.exe",
+ "bin/Shadowsocks.exe",
+ "bin/ShadowsocksR.exe",
+ "bin/Trojan.exe",
+ "bin/tun2socks.exe",
+ "bin/unbound.exe",
+ "bin/v2ray.exe",
+ "Netch.exe"
+ };
+
+ private const string _netch = "Netch";
+ private const string _netchAutoRule = "NetchAutoRule";
+
+ ///
+ /// 添加防火墙规则 (非 Netch 自带程序)
+ ///
+ ///
+ public static void AddFwRule(string exeFullPath)
+ {
+ AddFwRule(_netchAutoRule, exeFullPath);
+ }
+
+ ///
+ /// 清除防火墙规则 (非 Netch 自带程序)
+ ///
+ public static void RemoveFwRules()
+ {
+ RemoveFwRules(_netchAutoRule);
+ }
+
+ ///
+ /// Netch 自带程序添加防火墙
+ ///
+ public static void AddNetchFwRules()
+ {
+ if (GetFwRulePath(_netch).StartsWith(AppDomain.CurrentDomain.BaseDirectory) && GetFwRulesNumber(_netch) >= ProgramPath.Length) return;
+ RemoveNetchFwRules();
+ foreach (var p in ProgramPath)
+ {
+ var path = Path.GetFullPath(p);
+ if (File.Exists(path))
+ {
+ AddFwRule("Netch", path);
+ }
+ }
+ }
+
+ ///
+ /// 清除防火墙规则 (Netch 自带程序)
+ ///
+ public static void RemoveNetchFwRules()
+ {
+ RemoveFwRules(_netch);
+ }
+
+ #region 封装
+
+ private static readonly INetFwPolicy2 FwPolicy = (INetFwPolicy2) Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
+
+ private static void AddFwRule(string ruleName, string exeFullPath)
+ {
+ var rule = NewFwRule();
+
+ rule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
+ // ApplicationName 大小不敏感
+ rule.ApplicationName = exeFullPath;
+ // rule.Description = "Used to block all internet access.";
+ rule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
+ rule.Enabled = true;
+ rule.InterfaceTypes = "All";
+ rule.Name = ruleName;
+
+ FwPolicy.Rules.Add(rule);
+ }
+
+ private static void RemoveFwRules(string ruleName)
+ {
+ var c = GetFwRulesNumber(ruleName);
+ foreach (var _ in new bool[c])
+ {
+ FwPolicy.Rules.Remove(ruleName);
+ }
+ }
+
+ private static INetFwRule NewFwRule()
+ {
+ return (INetFwRule) Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
+ }
+
+
+ private static string GetFwRulePath(string ruleName)
+ {
+ try
+ {
+ var rule = (INetFwRule2)FwPolicy.Rules.Item(ruleName);
+ return rule.ApplicationName;
+ }
+ catch (Exception e)
+ {
+ return "";
+ }
+ }
+
+ private static int GetFwRulesNumber(string ruleName)
+ {
+ // https://stackoverflow.com/a/53601691
+ return FwPolicy.Rules.Cast().Count(rule => rule.Name == ruleName);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file