mirror of
https://github.com/netchx/netch.git
synced 2026-05-11 23:45:06 +08:00
Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99480e99c3 | ||
|
|
c696277b6b | ||
|
|
a7dd83448b | ||
|
|
0aa4a981fc | ||
|
|
2b7483b696 | ||
|
|
585a84321f | ||
|
|
dc7c48b1bb | ||
|
|
95aa3db415 | ||
|
|
276e516396 | ||
|
|
3fa3c1cfcb | ||
|
|
2d848f6708 | ||
|
|
504709b7da | ||
|
|
e37d1f21ba | ||
|
|
e2a20d5bb0 | ||
|
|
01cd51744f | ||
|
|
d3582340b0 | ||
|
|
98ece46832 | ||
|
|
bedafc23d4 | ||
|
|
406135b04b | ||
|
|
c55a5f6418 | ||
|
|
56a1d0d4ce | ||
|
|
a0157b0492 | ||
|
|
87fa016543 | ||
|
|
860b70bfa6 | ||
|
|
32cfe02715 | ||
|
|
8e0722b897 | ||
|
|
a5e750d614 | ||
|
|
5758007506 | ||
|
|
46a5f2e190 | ||
|
|
a1c0a7fcbd | ||
|
|
c1f3bd37ac | ||
|
|
0f59b5bfe2 | ||
|
|
83a3381e72 | ||
|
|
c959f60f4a | ||
|
|
2e721d8501 | ||
|
|
7084d47198 | ||
|
|
ba43ddb7be | ||
|
|
1f28e38a5a | ||
|
|
dcae72f4d3 | ||
|
|
277ebaba1b | ||
|
|
026456e4a1 | ||
|
|
3d764a8bce | ||
|
|
9983ee95d6 | ||
|
|
661e53d553 | ||
|
|
2a1b2bbffc | ||
|
|
47e98dc359 | ||
|
|
d3b3759f48 | ||
|
|
bfc5d9dafb | ||
|
|
979b88de7c | ||
|
|
2af1a4bee0 | ||
|
|
3260e7ce74 | ||
|
|
db28da454b | ||
|
|
b1d4911576 | ||
|
|
dcf83c0113 | ||
|
|
c2393efd10 | ||
|
|
1fe1fda285 | ||
|
|
8f44125856 | ||
|
|
876b18f85e | ||
|
|
740f707a30 | ||
|
|
190f24e7d7 | ||
|
|
a302c97831 | ||
|
|
bf259316bd | ||
|
|
03c9534a02 | ||
|
|
7513b734fc | ||
|
|
3774452751 | ||
|
|
4b68b363f7 | ||
|
|
bfc806b71e | ||
|
|
baed3e07cd | ||
|
|
2969b4420d | ||
|
|
57b438af7c | ||
|
|
2f685a2c6f | ||
|
|
7f38a1ff05 |
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
@@ -52,10 +52,10 @@ jobs:
|
|||||||
files: .\other\release\aiodns.bin
|
files: .\other\release\aiodns.bin
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
if: steps.check_other.outputs.files_exists == 'false'
|
if: steps.check_other.outputs.files_exists == 'false'
|
||||||
with:
|
with:
|
||||||
go-version: 1.17.3
|
go-version: ^1.18.3
|
||||||
|
|
||||||
- name: Setup C++
|
- name: Setup C++
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
.\build.ps1 -Configuration Release -OutputPath release
|
.\build.ps1 -Configuration Release -OutputPath release
|
||||||
|
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: release
|
name: release
|
||||||
path: release
|
path: release
|
||||||
|
|||||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@@ -48,10 +48,10 @@ jobs:
|
|||||||
files: .\other\release\aiodns.bin
|
files: .\other\release\aiodns.bin
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
if: steps.check_other.outputs.files_exists == 'false'
|
if: steps.check_other.outputs.files_exists == 'false'
|
||||||
with:
|
with:
|
||||||
go-version: 1.17.3
|
go-version: ^1.18.3
|
||||||
|
|
||||||
- name: Setup C++
|
- name: Setup C++
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
|
|||||||
20
.github/workflows/stale.yml
vendored
Normal file
20
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: Netch CII
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-issues:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
days-before-issue-stale: 30
|
||||||
|
days-before-issue-close: 14
|
||||||
|
days-before-pr-stale: 30
|
||||||
|
days-before-pr-close: 14
|
||||||
|
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
|
||||||
|
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
|
||||||
@@ -57,7 +57,7 @@ public static class MainController
|
|||||||
// Start Server Controller to get a local socks5 server
|
// Start Server Controller to get a local socks5 server
|
||||||
Log.Debug("Server Information: {Data}", $"{server.Type} {server.MaskedData()}");
|
Log.Debug("Server Information: {Data}", $"{server.Type} {server.MaskedData()}");
|
||||||
|
|
||||||
ServerController = ServerHelper.GetUtilByTypeName(server.Type).GetController();
|
ServerController = new V2rayController();
|
||||||
Global.MainForm.StatusText(i18N.TranslateFormat("Starting {0}", ServerController.Name));
|
Global.MainForm.StatusText(i18N.TranslateFormat("Starting {0}", ServerController.Name));
|
||||||
|
|
||||||
TryReleaseTcpPort(ServerController.Socks5LocalPort(), "Socks5");
|
TryReleaseTcpPort(ServerController.Socks5LocalPort(), "Socks5");
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ namespace Netch.Controllers
|
|||||||
|
|
||||||
if (_tunConfig.UseCustomDNS)
|
if (_tunConfig.UseCustomDNS)
|
||||||
{
|
{
|
||||||
Dial(NameList.TYPE_DNSADDR, _tunConfig.DNS);
|
Dial(NameList.TYPE_DNSADDR, DnsUtils.AppendPort(_tunConfig.DNS));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -175,8 +175,13 @@ namespace Netch.Controllers
|
|||||||
|
|
||||||
if (_tunConfig.UseCustomDNS)
|
if (_tunConfig.UseCustomDNS)
|
||||||
{
|
{
|
||||||
// NOTICE: DNS metric is network interface metric
|
if (_tunConfig.ProxyDNS)
|
||||||
RouteUtils.CreateRoute(_tun.FillTemplate(_tunConfig.DNS, 32));
|
{
|
||||||
|
// NOTICE: DNS metric is network interface metric
|
||||||
|
RouteUtils.CreateRoute(_tun.FillTemplate(_tunConfig.DNS, 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
tunNetworkInterface.SetDns(_tunConfig.DNS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public static class UpdateChecker
|
|||||||
public const string Name = @"Netch";
|
public const string Name = @"Netch";
|
||||||
public const string Copyright = @"Copyright © 2019 - 2022";
|
public const string Copyright = @"Copyright © 2019 - 2022";
|
||||||
|
|
||||||
public const string AssemblyVersion = @"1.9.5";
|
public const string AssemblyVersion = @"1.9.7";
|
||||||
private const string Suffix = @"";
|
private const string Suffix = @"";
|
||||||
|
|
||||||
public static readonly string Version = $"{AssemblyVersion}{(string.IsNullOrEmpty(Suffix) ? "" : $"-{Suffix}")}";
|
public static readonly string Version = $"{AssemblyVersion}{(string.IsNullOrEmpty(Suffix) ? "" : $"-{Suffix}")}";
|
||||||
@@ -103,4 +103,4 @@ public static class UpdateChecker
|
|||||||
var ordered = releases.OrderByDescending(release => release.tag_name, new VersionUtil.VersionComparer());
|
var ordered = releases.OrderByDescending(release => release.tag_name, new VersionUtil.VersionComparer());
|
||||||
return ordered.ElementAt(0);
|
return ordered.ElementAt(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
Netch/Forms/AboutForm.Designer.cs
generated
36
Netch/Forms/AboutForm.Designer.cs
generated
@@ -28,38 +28,11 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm));
|
|
||||||
this.SponsorGroupBox = new System.Windows.Forms.GroupBox();
|
|
||||||
this.SponsorPictureBox = new System.Windows.Forms.PictureBox();
|
|
||||||
this.ChannelLabel = new System.Windows.Forms.LinkLabel();
|
this.ChannelLabel = new System.Windows.Forms.LinkLabel();
|
||||||
this.NetchPictureBox = new System.Windows.Forms.PictureBox();
|
this.NetchPictureBox = new System.Windows.Forms.PictureBox();
|
||||||
this.SponsorGroupBox.SuspendLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.SponsorPictureBox)).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.NetchPictureBox)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.NetchPictureBox)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// SponsorGroupBox
|
|
||||||
//
|
|
||||||
this.SponsorGroupBox.Controls.Add(this.SponsorPictureBox);
|
|
||||||
this.SponsorGroupBox.Location = new System.Drawing.Point(12, 235);
|
|
||||||
this.SponsorGroupBox.Name = "SponsorGroupBox";
|
|
||||||
this.SponsorGroupBox.Size = new System.Drawing.Size(314, 229);
|
|
||||||
this.SponsorGroupBox.TabIndex = 2;
|
|
||||||
this.SponsorGroupBox.TabStop = false;
|
|
||||||
this.SponsorGroupBox.Text = "Sponsor";
|
|
||||||
//
|
|
||||||
// SponsorPictureBox
|
|
||||||
//
|
|
||||||
this.SponsorPictureBox.Cursor = System.Windows.Forms.Cursors.Hand;
|
|
||||||
this.SponsorPictureBox.Image = global::Netch.Properties.Resources.Sponsor;
|
|
||||||
this.SponsorPictureBox.Location = new System.Drawing.Point(6, 22);
|
|
||||||
this.SponsorPictureBox.Name = "SponsorPictureBox";
|
|
||||||
this.SponsorPictureBox.Size = new System.Drawing.Size(300, 200);
|
|
||||||
this.SponsorPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
|
||||||
this.SponsorPictureBox.TabIndex = 1;
|
|
||||||
this.SponsorPictureBox.TabStop = false;
|
|
||||||
this.SponsorPictureBox.Click += new System.EventHandler(this.SponsorPictureBox_Click);
|
|
||||||
//
|
|
||||||
// ChannelLabel
|
// ChannelLabel
|
||||||
//
|
//
|
||||||
this.ChannelLabel.AutoSize = true;
|
this.ChannelLabel.AutoSize = true;
|
||||||
@@ -87,11 +60,10 @@
|
|||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||||
this.ClientSize = new System.Drawing.Size(338, 474);
|
this.ClientSize = new System.Drawing.Size(338, 244);
|
||||||
this.Controls.Add(this.ChannelLabel);
|
this.Controls.Add(this.ChannelLabel);
|
||||||
this.Controls.Add(this.SponsorGroupBox);
|
|
||||||
this.Controls.Add(this.NetchPictureBox);
|
this.Controls.Add(this.NetchPictureBox);
|
||||||
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
|
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
@@ -99,8 +71,6 @@
|
|||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||||
this.Text = "About";
|
this.Text = "About";
|
||||||
this.Load += new System.EventHandler(this.AboutForm_Load);
|
this.Load += new System.EventHandler(this.AboutForm_Load);
|
||||||
this.SponsorGroupBox.ResumeLayout(false);
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.SponsorPictureBox)).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.NetchPictureBox)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.NetchPictureBox)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
this.PerformLayout();
|
||||||
@@ -110,8 +80,6 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.PictureBox NetchPictureBox;
|
private System.Windows.Forms.PictureBox NetchPictureBox;
|
||||||
private System.Windows.Forms.PictureBox SponsorPictureBox;
|
|
||||||
private System.Windows.Forms.GroupBox SponsorGroupBox;
|
|
||||||
private System.Windows.Forms.LinkLabel ChannelLabel;
|
private System.Windows.Forms.LinkLabel ChannelLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
60
Netch/Forms/AboutForm.resx
Normal file
60
Netch/Forms/AboutForm.resx
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<root>
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
13
Netch/Forms/SettingForm.Designer.cs
generated
13
Netch/Forms/SettingForm.Designer.cs
generated
@@ -80,6 +80,7 @@ namespace Netch.Forms
|
|||||||
this.XrayConeCheckBox = new System.Windows.Forms.CheckBox();
|
this.XrayConeCheckBox = new System.Windows.Forms.CheckBox();
|
||||||
this.TLSAllowInsecureCheckBox = new System.Windows.Forms.CheckBox();
|
this.TLSAllowInsecureCheckBox = new System.Windows.Forms.CheckBox();
|
||||||
this.UseMuxCheckBox = new System.Windows.Forms.CheckBox();
|
this.UseMuxCheckBox = new System.Windows.Forms.CheckBox();
|
||||||
|
this.TCPFastOpenBox = new System.Windows.Forms.CheckBox();
|
||||||
this.KCPGroupBox = new System.Windows.Forms.GroupBox();
|
this.KCPGroupBox = new System.Windows.Forms.GroupBox();
|
||||||
this.mtuLabel = new System.Windows.Forms.Label();
|
this.mtuLabel = new System.Windows.Forms.Label();
|
||||||
this.mtuTextBox = new System.Windows.Forms.TextBox();
|
this.mtuTextBox = new System.Windows.Forms.TextBox();
|
||||||
@@ -590,6 +591,7 @@ namespace Netch.Forms
|
|||||||
this.v2rayTabPage.Controls.Add(this.XrayConeCheckBox);
|
this.v2rayTabPage.Controls.Add(this.XrayConeCheckBox);
|
||||||
this.v2rayTabPage.Controls.Add(this.TLSAllowInsecureCheckBox);
|
this.v2rayTabPage.Controls.Add(this.TLSAllowInsecureCheckBox);
|
||||||
this.v2rayTabPage.Controls.Add(this.UseMuxCheckBox);
|
this.v2rayTabPage.Controls.Add(this.UseMuxCheckBox);
|
||||||
|
this.v2rayTabPage.Controls.Add(this.TCPFastOpenBox);
|
||||||
this.v2rayTabPage.Controls.Add(this.KCPGroupBox);
|
this.v2rayTabPage.Controls.Add(this.KCPGroupBox);
|
||||||
this.v2rayTabPage.Location = new System.Drawing.Point(4, 29);
|
this.v2rayTabPage.Location = new System.Drawing.Point(4, 29);
|
||||||
this.v2rayTabPage.Name = "v2rayTabPage";
|
this.v2rayTabPage.Name = "v2rayTabPage";
|
||||||
@@ -628,6 +630,16 @@ namespace Netch.Forms
|
|||||||
this.UseMuxCheckBox.Text = "Use Mux";
|
this.UseMuxCheckBox.Text = "Use Mux";
|
||||||
this.UseMuxCheckBox.UseVisualStyleBackColor = true;
|
this.UseMuxCheckBox.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// TCPFastOpenBox
|
||||||
|
//
|
||||||
|
this.TCPFastOpenBox.AutoSize = true;
|
||||||
|
this.TCPFastOpenBox.Location = new System.Drawing.Point(300, 42);
|
||||||
|
this.TCPFastOpenBox.Name = "TCPFastOpenBox";
|
||||||
|
this.TCPFastOpenBox.Size = new System.Drawing.Size(131, 21);
|
||||||
|
this.TCPFastOpenBox.TabIndex = 3;
|
||||||
|
this.TCPFastOpenBox.Text = "TCP FastOpen";
|
||||||
|
this.TCPFastOpenBox.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// KCPGroupBox
|
// KCPGroupBox
|
||||||
//
|
//
|
||||||
this.KCPGroupBox.Controls.Add(this.mtuLabel);
|
this.KCPGroupBox.Controls.Add(this.mtuLabel);
|
||||||
@@ -1063,6 +1075,7 @@ namespace Netch.Forms
|
|||||||
private System.Windows.Forms.GroupBox KCPGroupBox;
|
private System.Windows.Forms.GroupBox KCPGroupBox;
|
||||||
private System.Windows.Forms.CheckBox congestionCheckBox;
|
private System.Windows.Forms.CheckBox congestionCheckBox;
|
||||||
private System.Windows.Forms.CheckBox TLSAllowInsecureCheckBox;
|
private System.Windows.Forms.CheckBox TLSAllowInsecureCheckBox;
|
||||||
|
private System.Windows.Forms.CheckBox TCPFastOpenBox;
|
||||||
private System.Windows.Forms.Label mtuLabel;
|
private System.Windows.Forms.Label mtuLabel;
|
||||||
private System.Windows.Forms.TextBox mtuTextBox;
|
private System.Windows.Forms.TextBox mtuTextBox;
|
||||||
private System.Windows.Forms.Label writeBufferSizeLabel;
|
private System.Windows.Forms.Label writeBufferSizeLabel;
|
||||||
|
|||||||
@@ -120,11 +120,11 @@ public partial class SettingForm : BindingForm
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region V2Ray
|
#region V2Ray
|
||||||
|
|
||||||
BindCheckBox(XrayConeCheckBox, b => Global.Settings.V2RayConfig.XrayCone = b, Global.Settings.V2RayConfig.XrayCone);
|
BindCheckBox(XrayConeCheckBox, b => Global.Settings.V2RayConfig.XrayCone = b, Global.Settings.V2RayConfig.XrayCone);
|
||||||
|
|
||||||
BindCheckBox(TLSAllowInsecureCheckBox, b => Global.Settings.V2RayConfig.AllowInsecure = b, Global.Settings.V2RayConfig.AllowInsecure);
|
BindCheckBox(TLSAllowInsecureCheckBox, b => Global.Settings.V2RayConfig.AllowInsecure = b, Global.Settings.V2RayConfig.AllowInsecure);
|
||||||
BindCheckBox(UseMuxCheckBox, b => Global.Settings.V2RayConfig.UseMux = b, Global.Settings.V2RayConfig.UseMux);
|
BindCheckBox(UseMuxCheckBox, b => Global.Settings.V2RayConfig.UseMux = b, Global.Settings.V2RayConfig.UseMux);
|
||||||
|
BindCheckBox(TCPFastOpenBox, b => Global.Settings.V2RayConfig.TCPFastOpen = b, Global.Settings.V2RayConfig.TCPFastOpen);
|
||||||
|
|
||||||
BindTextBox<int>(mtuTextBox, i => true, i => Global.Settings.V2RayConfig.KcpConfig.mtu = i, Global.Settings.V2RayConfig.KcpConfig.mtu);
|
BindTextBox<int>(mtuTextBox, i => true, i => Global.Settings.V2RayConfig.KcpConfig.mtu = i, Global.Settings.V2RayConfig.KcpConfig.mtu);
|
||||||
BindTextBox<int>(ttiTextBox, i => true, i => Global.Settings.V2RayConfig.KcpConfig.tti = i, Global.Settings.V2RayConfig.KcpConfig.tti);
|
BindTextBox<int>(ttiTextBox, i => true, i => Global.Settings.V2RayConfig.KcpConfig.tti = i, Global.Settings.V2RayConfig.KcpConfig.tti);
|
||||||
|
|||||||
@@ -11,4 +11,6 @@ public class V2rayConfig
|
|||||||
public bool V2rayNShareLink { get; set; } = true;
|
public bool V2rayNShareLink { get; set; } = true;
|
||||||
|
|
||||||
public bool XrayCone { get; set; } = true;
|
public bool XrayCone { get; set; } = true;
|
||||||
|
|
||||||
|
public bool TCPFastOpen { get; set; } = false;
|
||||||
}
|
}
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<Configurations>Debug;Release</Configurations>
|
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
|
||||||
<ApplicationManifest>App.manifest</ApplicationManifest>
|
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
||||||
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
|
||||||
<ApplicationIcon>Resources\Netch.ico</ApplicationIcon>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<!-- event handler async void Warning -->
|
|
||||||
<NoWarn>VSTHRD100</NoWarn>
|
|
||||||
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
|
||||||
<AnalysisMode>Default</AnalysisMode>
|
|
||||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
|
||||||
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<OutputPath>bin\x64\Release\</OutputPath>
|
|
||||||
<DebugType>none</DebugType>
|
|
||||||
<DebugSymbols>false</DebugSymbols>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Using Include="Serilog" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="ConfigureAwait.Fody" Version="3.3.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="Fody" Version="6.6.0">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="HMBSbige.SingleInstance" Version="6.0.0" />
|
|
||||||
<PackageReference Include="MaxMind.GeoIP2" Version="4.0.1" />
|
|
||||||
<PackageReference Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="2.0.73" GeneratePathProperty="true" />
|
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.0.64" />
|
|
||||||
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.588-beta">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="Nullable.Extended.Analyzer" Version="1.10.4539">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="Serilog" Version="2.10.0" />
|
|
||||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="4.2.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.0" />
|
|
||||||
<PackageReference Include="Stun.Net" Version="6.0.0" />
|
|
||||||
<PackageReference Include="System.Management" Version="6.0.0" />
|
|
||||||
<PackageReference Include="TaskScheduler" Version="2.9.2" />
|
|
||||||
<PackageReference Include="WindowsFirewallHelper" Version="2.1.4.81" />
|
|
||||||
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.0" />
|
|
||||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
|
||||||
<PackageReference Include="WindowsJobAPI" Version="5.0.1" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Update="Properties\Resources.resx">
|
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<Compile Update="Properties\Resources.Designer.cs">
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Update="Forms\SyncGlobalCheckBox.cs">
|
|
||||||
<SubType>UserControl</SubType>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Remove="NativeMethods.txt" />
|
|
||||||
<None Update="NOTICE.txt">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Condition="'$(PublishSingleFile)' == 'true'" AfterTargets="_ComputeFilesToBundle" Name="RemoveDupeAssemblies">
|
|
||||||
<ItemGroup>
|
|
||||||
<_FilesToBundle Remove="$(PkgMicrosoft_Diagnostics_Tracing_TraceEvent)\build\native\x86\**" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -41,14 +41,14 @@
|
|||||||
<PackageReference Include="ConfigureAwait.Fody" Version="3.3.1">
|
<PackageReference Include="ConfigureAwait.Fody" Version="3.3.1">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Fody" Version="6.6.0">
|
<PackageReference Include="Fody" Version="6.6.3">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="HMBSbige.SingleInstance" Version="6.0.0" />
|
<PackageReference Include="HMBSbige.SingleInstance" Version="6.0.0" />
|
||||||
<PackageReference Include="MaxMind.GeoIP2" Version="5.1.0" />
|
<PackageReference Include="MaxMind.GeoIP2" Version="5.1.0" />
|
||||||
<PackageReference Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="2.0.76" GeneratePathProperty="true" />
|
<PackageReference Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="3.0.1" GeneratePathProperty="true" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.1.46" />
|
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.2.32" />
|
||||||
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.588-beta">
|
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.588-beta">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
@@ -57,12 +57,12 @@
|
|||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Serilog" Version="2.10.0" />
|
<PackageReference Include="Serilog" Version="2.11.0" />
|
||||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="4.2.0" />
|
<PackageReference Include="Serilog.Extensions.Hosting" Version="4.2.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
|
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
|
||||||
<PackageReference Include="Stun.Net" Version="6.0.0" />
|
<PackageReference Include="Stun.Net" Version="6.2.0" />
|
||||||
<PackageReference Include="System.Management" Version="6.0.0" />
|
<PackageReference Include="System.Management" Version="6.0.0" />
|
||||||
<PackageReference Include="TaskScheduler" Version="2.10.1" />
|
<PackageReference Include="TaskScheduler" Version="2.10.1" />
|
||||||
<PackageReference Include="WindowsFirewallHelper" Version="2.2.0.86" />
|
<PackageReference Include="WindowsFirewallHelper" Version="2.2.0.86" />
|
||||||
|
|||||||
12
Netch/Properties/Resources.Designer.cs
generated
12
Netch/Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace Netch.Properties {
|
|||||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||||
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
internal class Resources {
|
internal class Resources {
|
||||||
@@ -130,16 +130,6 @@ namespace Netch.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
|
||||||
/// </summary>
|
|
||||||
internal static System.Drawing.Bitmap Sponsor {
|
|
||||||
get {
|
|
||||||
object obj = ResourceManager.GetObject("Sponsor", resourceCulture);
|
|
||||||
return ((System.Drawing.Bitmap)(obj));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Byte[] 类型的本地化资源。
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -138,10 +138,6 @@
|
|||||||
<value>..\Resources\Netch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
|
<value>..\Resources\Netch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
|
||||||
PublicKeyToken=b03f5f7f11d50a3a</value>
|
PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sponsor" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Resources\Sponsor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
|
|
||||||
PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
<data name="CopyLink" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="CopyLink" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\CopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
|
<value>..\Resources\CopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
|
||||||
PublicKeyToken=b03f5f7f11d50a3a</value>
|
PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 37 KiB |
@@ -48,6 +48,7 @@
|
|||||||
"Address": "地址",
|
"Address": "地址",
|
||||||
"Username": "用户名",
|
"Username": "用户名",
|
||||||
"Password": "密码",
|
"Password": "密码",
|
||||||
|
"Version": "版本",
|
||||||
"User ID": "用户 ID",
|
"User ID": "用户 ID",
|
||||||
"Alter ID": "额外 ID",
|
"Alter ID": "额外 ID",
|
||||||
"Transfer Protocol": "传输协议",
|
"Transfer Protocol": "传输协议",
|
||||||
@@ -69,6 +70,10 @@
|
|||||||
"Plugin": "插件",
|
"Plugin": "插件",
|
||||||
"Plugin Options": "插件参数",
|
"Plugin Options": "插件参数",
|
||||||
"Remote Address": "远端地址",
|
"Remote Address": "远端地址",
|
||||||
|
"Local Addresses": "本地地址(可多个)",
|
||||||
|
"Public Key": "节点公钥",
|
||||||
|
"Private Key": "私钥",
|
||||||
|
"PSK": "节点预共享密钥",
|
||||||
|
|
||||||
"Subscription": "订阅",
|
"Subscription": "订阅",
|
||||||
"Manage Subscriptions": "管理订阅",
|
"Manage Subscriptions": "管理订阅",
|
||||||
@@ -178,6 +183,7 @@
|
|||||||
"STUN Server": "STUN 服务器",
|
"STUN Server": "STUN 服务器",
|
||||||
"Language": "语言",
|
"Language": "语言",
|
||||||
"FullCone Support (Required Server Xray-core v1.3.0+)": "FullCone 支持(需服务端 Xray-core v1.3.0+)",
|
"FullCone Support (Required Server Xray-core v1.3.0+)": "FullCone 支持(需服务端 Xray-core v1.3.0+)",
|
||||||
|
"TCP FastOpen": "TCP 快速打开",
|
||||||
"Disable Support Warning": "停用支持警告",
|
"Disable Support Warning": "停用支持警告",
|
||||||
|
|
||||||
"Profile": "配置名",
|
"Profile": "配置名",
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class ShadowsocksServer : Server
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加密方式
|
/// 加密方式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string EncryptMethod { get; set; } = SSGlobal.EncryptMethods[0];
|
public string EncryptMethod { get; set; } = SSGlobal.EncryptMethods[4];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 密码
|
/// 密码
|
||||||
@@ -43,24 +43,50 @@ public static class SSGlobal
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly List<string> EncryptMethods = new()
|
public static readonly List<string> EncryptMethods = new()
|
||||||
{
|
{
|
||||||
"rc4-md5",
|
"none",
|
||||||
|
|
||||||
|
// 2022 edition cipher
|
||||||
|
"2022-blake3-aes-128-gcm",
|
||||||
|
"2022-blake3-aes-256-gcm",
|
||||||
|
"2022-blake3-chacha20-poly1305",
|
||||||
|
|
||||||
|
// AEAD cipher
|
||||||
"aes-128-gcm",
|
"aes-128-gcm",
|
||||||
"aes-192-gcm",
|
"aes-192-gcm",
|
||||||
"aes-256-gcm",
|
"aes-256-gcm",
|
||||||
"aes-128-cfb",
|
"chacha20-ietf-poly1305",
|
||||||
"aes-192-cfb",
|
"xchacha20-ietf-poly1305",
|
||||||
"aes-256-cfb",
|
|
||||||
|
// stream cipher
|
||||||
|
"rc4",
|
||||||
|
"rc4-md5",
|
||||||
"aes-128-ctr",
|
"aes-128-ctr",
|
||||||
"aes-192-ctr",
|
"aes-192-ctr",
|
||||||
"aes-256-ctr",
|
"aes-256-ctr",
|
||||||
|
"aes-128-cfb",
|
||||||
|
"aes-192-cfb",
|
||||||
|
"aes-256-cfb",
|
||||||
|
"aes-128-cfb8",
|
||||||
|
"aes-192-cfb8",
|
||||||
|
"aes-256-cfb8",
|
||||||
|
"aes-128-ofb",
|
||||||
|
"aes-192-ofb",
|
||||||
|
"aes-256-ofb",
|
||||||
|
"bf-cfb",
|
||||||
|
"cast5-cfb",
|
||||||
|
"des-cfb",
|
||||||
|
"idea-cfb",
|
||||||
|
"rc2-cfb",
|
||||||
|
"seed-cfb",
|
||||||
"camellia-128-cfb",
|
"camellia-128-cfb",
|
||||||
"camellia-192-cfb",
|
"camellia-192-cfb",
|
||||||
"camellia-256-cfb",
|
"camellia-256-cfb",
|
||||||
"bf-cfb",
|
"camellia-128-cfb8",
|
||||||
"chacha20-ietf-poly1305",
|
"camellia-192-cfb8",
|
||||||
"xchacha20-ietf-poly1305",
|
"camellia-256-cfb8",
|
||||||
"salsa20",
|
"salsa20",
|
||||||
"chacha20",
|
"chacha20",
|
||||||
"chacha20-ietf"
|
"chacha20-ietf",
|
||||||
|
"xchacha20"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -114,13 +114,13 @@ public class ShadowsocksUtil : IServerUtil
|
|||||||
{
|
{
|
||||||
case "obfs-local":
|
case "obfs-local":
|
||||||
case "simple-obfs":
|
case "simple-obfs":
|
||||||
plugin = "simple-obfs";
|
plugin = "obfs-local";
|
||||||
if (!pluginopts.Contains("obfs="))
|
if (!pluginopts.Contains("obfs="))
|
||||||
pluginopts = "obfs=http;obfs-host=" + pluginopts;
|
pluginopts = "obfs=http;obfs-host=" + pluginopts;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "simple-obfs-tls":
|
case "simple-obfs-tls":
|
||||||
plugin = "simple-obfs";
|
plugin = "obfs-local";
|
||||||
if (!pluginopts.Contains("obfs="))
|
if (!pluginopts.Contains("obfs="))
|
||||||
pluginopts = "obfs=tls;obfs-host=" + pluginopts;
|
pluginopts = "obfs=tls;obfs-host=" + pluginopts;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class ShadowsocksRServer : Server
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加密方式
|
/// 加密方式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string EncryptMethod { get; set; } = SSRGlobal.EncryptMethods[0];
|
public string EncryptMethod { get; set; } = SSRGlobal.EncryptMethods[4];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 协议
|
/// 协议
|
||||||
@@ -49,11 +49,11 @@ public class SSRGlobal
|
|||||||
public static readonly List<string> Protocols = new()
|
public static readonly List<string> Protocols = new()
|
||||||
{
|
{
|
||||||
"origin",
|
"origin",
|
||||||
"verify_deflate",
|
|
||||||
"auth_sha1_v4",
|
"auth_sha1_v4",
|
||||||
"auth_aes128_md5",
|
"auth_aes128_md5",
|
||||||
"auth_aes128_sha1",
|
"auth_aes128_sha1",
|
||||||
"auth_chain_a"
|
"auth_chain_a",
|
||||||
|
"auth_chain_b"
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -64,36 +64,14 @@ public class SSRGlobal
|
|||||||
"plain",
|
"plain",
|
||||||
"http_simple",
|
"http_simple",
|
||||||
"http_post",
|
"http_post",
|
||||||
"tls1.2_ticket_auth"
|
"tls_simple",
|
||||||
|
"tls1.2_ticket_auth",
|
||||||
|
"tls1.2_ticket_fastauth",
|
||||||
|
"random_head"
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// SS/SSR 加密方式
|
/// SS/SSR 加密方式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly List<string> EncryptMethods = new()
|
public static readonly List<string> EncryptMethods = SSGlobal.EncryptMethods;
|
||||||
{
|
|
||||||
"none",
|
|
||||||
"table",
|
|
||||||
"rc4",
|
|
||||||
"rc4-md5",
|
|
||||||
"rc4-md5-6",
|
|
||||||
"aes-128-cfb",
|
|
||||||
"aes-192-cfb",
|
|
||||||
"aes-256-cfb",
|
|
||||||
"aes-128-ctr",
|
|
||||||
"aes-192-ctr",
|
|
||||||
"aes-256-ctr",
|
|
||||||
"bf-cfb",
|
|
||||||
"camellia-128-cfb",
|
|
||||||
"camellia-192-cfb",
|
|
||||||
"camellia-256-cfb",
|
|
||||||
"cast5-cfb",
|
|
||||||
"des-cfb",
|
|
||||||
"idea-cfb",
|
|
||||||
"rc2-cfb",
|
|
||||||
"seed-cfb",
|
|
||||||
"salsa20",
|
|
||||||
"chacha20",
|
|
||||||
"chacha20-ietf"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,11 @@ public class Socks5Form : ServerForm
|
|||||||
Server = server;
|
Server = server;
|
||||||
CreateTextBox("Username", "Username", s => true, s => server.Username = s, server.Username.ValueOrDefault());
|
CreateTextBox("Username", "Username", s => true, s => server.Username = s, server.Username.ValueOrDefault());
|
||||||
CreateTextBox("Password", "Password", s => true, s => server.Password = s, server.Password.ValueOrDefault());
|
CreateTextBox("Password", "Password", s => true, s => server.Password = s, server.Password.ValueOrDefault());
|
||||||
|
CreateComboBox("Version",
|
||||||
|
"Version",
|
||||||
|
SOCKSGlobal.Versions,
|
||||||
|
s => server.Version = s,
|
||||||
|
server.Version);
|
||||||
(_remoteHostnameLabel, _remoteHostnameTextBox) = CreateTextBox("RemoteHostname",
|
(_remoteHostnameLabel, _remoteHostnameTextBox) = CreateTextBox("RemoteHostname",
|
||||||
"Remote Address",
|
"Remote Address",
|
||||||
s => true,
|
s => true,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace Netch.Servers;
|
|||||||
|
|
||||||
public class Socks5Server : Server
|
public class Socks5Server : Server
|
||||||
{
|
{
|
||||||
public override string Type { get; } = "Socks5";
|
public override string Type { get; } = "SOCKS";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 密码
|
/// 密码
|
||||||
@@ -18,6 +18,11 @@ public class Socks5Server : Server
|
|||||||
|
|
||||||
public string? RemoteHostname { get; set; }
|
public string? RemoteHostname { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 版本
|
||||||
|
/// </summary>
|
||||||
|
public string Version { get; set; } = SOCKSGlobal.Versions[0];
|
||||||
|
|
||||||
public override string MaskedData()
|
public override string MaskedData()
|
||||||
{
|
{
|
||||||
return $"Auth: {Auth()}";
|
return $"Auth: {Auth()}";
|
||||||
@@ -48,4 +53,14 @@ public class Socks5Server : Server
|
|||||||
{
|
{
|
||||||
return !string.IsNullOrWhiteSpace(Username) && !string.IsNullOrWhiteSpace(Password);
|
return !string.IsNullOrWhiteSpace(Username) && !string.IsNullOrWhiteSpace(Password);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SOCKSGlobal
|
||||||
|
{
|
||||||
|
public static readonly List<string> Versions = new()
|
||||||
|
{
|
||||||
|
"5",
|
||||||
|
"4a",
|
||||||
|
"4"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
@@ -7,11 +7,11 @@ public class Socks5Util : IServerUtil
|
|||||||
{
|
{
|
||||||
public ushort Priority { get; } = 0;
|
public ushort Priority { get; } = 0;
|
||||||
|
|
||||||
public string TypeName { get; } = "Socks5";
|
public string TypeName { get; } = "SOCKS";
|
||||||
|
|
||||||
public string FullName { get; } = "Socks5";
|
public string FullName { get; } = "SOCKS";
|
||||||
|
|
||||||
public string ShortName { get; } = "S5";
|
public string ShortName { get; } = "SOCKS";
|
||||||
|
|
||||||
public string[] UriScheme { get; } = { };
|
public string[] UriScheme { get; } = { };
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ public class TrojanForm : ServerForm
|
|||||||
Server = server;
|
Server = server;
|
||||||
CreateTextBox("Password", "Password", s => true, s => server.Password = s, server.Password);
|
CreateTextBox("Password", "Password", s => true, s => server.Password = s, server.Password);
|
||||||
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
||||||
|
CreateComboBox("TLSSecure", "TLS Secure", VLESSGlobal.TLSSecure, s => server.TLSSecureType = s, server.TLSSecureType);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string TypeName { get; } = "Trojan";
|
protected override string TypeName { get; } = "Trojan";
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ namespace Netch.Servers;
|
|||||||
|
|
||||||
public class TrojanServer : Server
|
public class TrojanServer : Server
|
||||||
{
|
{
|
||||||
|
private string _tlsSecureType = VLESSGlobal.TLSSecure[1];
|
||||||
|
|
||||||
public override string Type { get; } = "Trojan";
|
public override string Type { get; } = "Trojan";
|
||||||
|
|
||||||
public override string MaskedData()
|
public override string MaskedData()
|
||||||
@@ -20,4 +22,19 @@ public class TrojanServer : Server
|
|||||||
/// 伪装域名
|
/// 伪装域名
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? Host { get; set; }
|
public string? Host { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TLS 底层传输安全
|
||||||
|
/// </summary>
|
||||||
|
public string TLSSecureType
|
||||||
|
{
|
||||||
|
get => _tlsSecureType;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == "")
|
||||||
|
value = VLESSGlobal.TLSSecure[1];
|
||||||
|
|
||||||
|
_tlsSecureType = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ public class TrojanUtil : IServerUtil
|
|||||||
public string GetShareLink(Server s)
|
public string GetShareLink(Server s)
|
||||||
{
|
{
|
||||||
var server = (TrojanServer)s;
|
var server = (TrojanServer)s;
|
||||||
return $"trojan://{HttpUtility.UrlEncode(server.Password)}@{server.Hostname}:{server.Port}#{server.Remark}";
|
return $"trojan://{HttpUtility.UrlEncode(server.Password)}@{server.Hostname}:{server.Port}?sni={server.Host}#{server.Remark}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public IServerController GetController()
|
public IServerController GetController()
|
||||||
@@ -61,8 +61,13 @@ public class TrojanUtil : IServerUtil
|
|||||||
|
|
||||||
var peer = HttpUtility.UrlDecode(HttpUtility.ParseQueryString(new Uri(text).Query).Get("peer"));
|
var peer = HttpUtility.UrlDecode(HttpUtility.ParseQueryString(new Uri(text).Query).Get("peer"));
|
||||||
|
|
||||||
if (peer != null)
|
if (peer != null) {
|
||||||
data.Host = peer;
|
data.Host = peer;
|
||||||
|
} else {
|
||||||
|
peer = HttpUtility.UrlDecode(HttpUtility.ParseQueryString(new Uri(text).Query).Get("sni"));
|
||||||
|
if (peer != null)
|
||||||
|
data.Host = peer;
|
||||||
|
}
|
||||||
|
|
||||||
text = regmatch.Groups["data"].Value;
|
text = regmatch.Groups["data"].Value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ public class Outbound
|
|||||||
|
|
||||||
public OutboundConfiguration settings { get; set; }
|
public OutboundConfiguration settings { get; set; }
|
||||||
|
|
||||||
public StreamSettings streamSettings { get; set; }
|
public StreamSettings? streamSettings { get; set; }
|
||||||
|
|
||||||
public Mux mux { get; set; }
|
public Mux? mux { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OutboundConfiguration
|
public class OutboundConfiguration
|
||||||
@@ -39,6 +39,30 @@ public class OutboundConfiguration
|
|||||||
public VnextItem[] vnext { get; set; }
|
public VnextItem[] vnext { get; set; }
|
||||||
|
|
||||||
public object[] servers { get; set; }
|
public object[] servers { get; set; }
|
||||||
|
|
||||||
|
public string version { get; set; }
|
||||||
|
|
||||||
|
public string address { get; set; }
|
||||||
|
|
||||||
|
public ushort port { get; set; }
|
||||||
|
|
||||||
|
public string packetEncoding { get; set; }
|
||||||
|
|
||||||
|
public string plugin { get; set; }
|
||||||
|
|
||||||
|
public string pluginOpts { get; set; }
|
||||||
|
|
||||||
|
public string[] pluginArgs { get; set; }
|
||||||
|
|
||||||
|
public string[] localAddresses { get; set; }
|
||||||
|
|
||||||
|
public string peerPublicKey { get; set; }
|
||||||
|
|
||||||
|
public string privateKey { get; set; }
|
||||||
|
|
||||||
|
public string preSharedKey { get; set; }
|
||||||
|
|
||||||
|
public int mtu { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VnextItem
|
public class VnextItem
|
||||||
@@ -50,10 +74,25 @@ public class VnextItem
|
|||||||
public User[] users { get; set; }
|
public User[] users { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ShadowsocksServerItem
|
||||||
|
{
|
||||||
|
public string address { get; set; }
|
||||||
|
|
||||||
|
public ushort port { get; set; }
|
||||||
|
|
||||||
|
public string method { get; set; }
|
||||||
|
|
||||||
|
public string password { get; set; }
|
||||||
|
|
||||||
|
public string flow { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class Mux
|
public class Mux
|
||||||
{
|
{
|
||||||
public bool enabled { get; set; }
|
public bool enabled { get; set; }
|
||||||
|
|
||||||
|
public string packetEncoding { get; set; }
|
||||||
|
|
||||||
public int concurrency { get; set; }
|
public int concurrency { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +117,8 @@ public class StreamSettings
|
|||||||
public TlsSettings xtlsSettings { get; set; }
|
public TlsSettings xtlsSettings { get; set; }
|
||||||
|
|
||||||
public GrpcSettings grpcSettings { get; set; }
|
public GrpcSettings grpcSettings { get; set; }
|
||||||
|
|
||||||
|
public Sockopt sockopt { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Transport
|
#region Transport
|
||||||
@@ -145,4 +186,9 @@ public class GrpcSettings
|
|||||||
public bool multiMode { get; set; }
|
public bool multiMode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Sockopt
|
||||||
|
{
|
||||||
|
public bool tcpFastOpen { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -20,6 +20,7 @@ public static class V2rayConfigUtils
|
|||||||
listen = Global.Settings.LocalAddress,
|
listen = Global.Settings.LocalAddress,
|
||||||
settings = new
|
settings = new
|
||||||
{
|
{
|
||||||
|
auth = "noauth",
|
||||||
udp = true
|
udp = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,7 +42,7 @@ public static class V2rayConfigUtils
|
|||||||
|
|
||||||
switch (server)
|
switch (server)
|
||||||
{
|
{
|
||||||
case Socks5Server socks5:
|
case Socks5Server socks:
|
||||||
{
|
{
|
||||||
outbound.protocol = "socks";
|
outbound.protocol = "socks";
|
||||||
outbound.settings.servers = new object[]
|
outbound.settings.servers = new object[]
|
||||||
@@ -50,19 +51,20 @@ public static class V2rayConfigUtils
|
|||||||
{
|
{
|
||||||
address = await server.AutoResolveHostnameAsync(),
|
address = await server.AutoResolveHostnameAsync(),
|
||||||
port = server.Port,
|
port = server.Port,
|
||||||
users = socks5.Auth()
|
users = socks.Auth()
|
||||||
? new[]
|
? new[]
|
||||||
{
|
{
|
||||||
new
|
new
|
||||||
{
|
{
|
||||||
user = socks5.Username,
|
user = socks.Username,
|
||||||
pass = socks5.Password,
|
pass = socks.Password,
|
||||||
level = 1
|
level = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
: null
|
: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
outbound.settings.version = socks.Version;
|
||||||
|
|
||||||
outbound.mux.enabled = false;
|
outbound.mux.enabled = false;
|
||||||
outbound.mux.concurrency = -1;
|
outbound.mux.concurrency = -1;
|
||||||
@@ -81,14 +83,17 @@ public static class V2rayConfigUtils
|
|||||||
{
|
{
|
||||||
new User
|
new User
|
||||||
{
|
{
|
||||||
id = vless.UserID,
|
id = getUUID(vless.UserID),
|
||||||
flow = vless.Flow.ValueOrDefault(),
|
flow = vless.TLSSecureType == "xtls" ? "xtls-rprx-direct" : "",
|
||||||
encryption = vless.EncryptMethod
|
encryption = vless.EncryptMethod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
outbound.settings.packetEncoding = Global.Settings.V2RayConfig.XrayCone ? vless.PacketEncoding : "none";
|
||||||
|
outbound.mux.packetEncoding = Global.Settings.V2RayConfig.XrayCone ? vless.PacketEncoding : "none";
|
||||||
|
|
||||||
outbound.streamSettings = boundStreamSettings(vless);
|
outbound.streamSettings = boundStreamSettings(vless);
|
||||||
|
|
||||||
if (vless.TLSSecureType == "xtls")
|
if (vless.TLSSecureType == "xtls")
|
||||||
@@ -107,6 +112,10 @@ public static class V2rayConfigUtils
|
|||||||
case VMessServer vmess:
|
case VMessServer vmess:
|
||||||
{
|
{
|
||||||
outbound.protocol = "vmess";
|
outbound.protocol = "vmess";
|
||||||
|
if (vmess.EncryptMethod == "auto" && vmess.TLSSecureType != "none" && !Global.Settings.V2RayConfig.AllowInsecure)
|
||||||
|
{
|
||||||
|
vmess.EncryptMethod = "zero";
|
||||||
|
}
|
||||||
outbound.settings.vnext = new[]
|
outbound.settings.vnext = new[]
|
||||||
{
|
{
|
||||||
new VnextItem
|
new VnextItem
|
||||||
@@ -117,7 +126,7 @@ public static class V2rayConfigUtils
|
|||||||
{
|
{
|
||||||
new User
|
new User
|
||||||
{
|
{
|
||||||
id = vmess.UserID,
|
id = getUUID(vmess.UserID),
|
||||||
alterId = vmess.AlterID,
|
alterId = vmess.AlterID,
|
||||||
security = vmess.EncryptMethod
|
security = vmess.EncryptMethod
|
||||||
}
|
}
|
||||||
@@ -125,12 +134,153 @@ public static class V2rayConfigUtils
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
outbound.settings.packetEncoding = Global.Settings.V2RayConfig.XrayCone ? vmess.PacketEncoding : "none";
|
||||||
|
outbound.mux.packetEncoding = Global.Settings.V2RayConfig.XrayCone ? vmess.PacketEncoding : "none";
|
||||||
|
|
||||||
outbound.streamSettings = boundStreamSettings(vmess);
|
outbound.streamSettings = boundStreamSettings(vmess);
|
||||||
|
|
||||||
outbound.mux.enabled = vmess.UseMux ?? Global.Settings.V2RayConfig.UseMux;
|
outbound.mux.enabled = vmess.UseMux ?? Global.Settings.V2RayConfig.UseMux;
|
||||||
outbound.mux.concurrency = vmess.UseMux ?? Global.Settings.V2RayConfig.UseMux ? 8 : -1;
|
outbound.mux.concurrency = vmess.UseMux ?? Global.Settings.V2RayConfig.UseMux ? 8 : -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ShadowsocksServer ss:
|
||||||
|
outbound.protocol = "shadowsocks";
|
||||||
|
outbound.settings = new OutboundConfiguration
|
||||||
|
{
|
||||||
|
servers = new[]
|
||||||
|
{
|
||||||
|
new ShadowsocksServerItem
|
||||||
|
{
|
||||||
|
address = await server.AutoResolveHostnameAsync(),
|
||||||
|
port = server.Port,
|
||||||
|
method = ss.EncryptMethod,
|
||||||
|
password = ss.Password,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugin = ss.Plugin ?? "",
|
||||||
|
pluginOpts = ss.PluginOption ?? ""
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Global.Settings.V2RayConfig.TCPFastOpen)
|
||||||
|
{
|
||||||
|
outbound.streamSettings = new StreamSettings
|
||||||
|
{
|
||||||
|
sockopt = new Sockopt
|
||||||
|
{
|
||||||
|
tcpFastOpen = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ShadowsocksRServer ssr:
|
||||||
|
outbound.protocol = "shadowsocks";
|
||||||
|
outbound.settings = new OutboundConfiguration
|
||||||
|
{
|
||||||
|
servers = new[]
|
||||||
|
{
|
||||||
|
new ShadowsocksServerItem
|
||||||
|
{
|
||||||
|
address = await server.AutoResolveHostnameAsync(),
|
||||||
|
port = server.Port,
|
||||||
|
method = ssr.EncryptMethod,
|
||||||
|
password = ssr.Password,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugin = "shadowsocksr",
|
||||||
|
pluginArgs = new string[]
|
||||||
|
{
|
||||||
|
"--obfs=" + ssr.OBFS,
|
||||||
|
"--obfs-param=" + ssr.OBFSParam ?? "",
|
||||||
|
"--protocol=" + ssr.Protocol,
|
||||||
|
"--protocol-param=" + ssr.ProtocolParam ?? ""
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Global.Settings.V2RayConfig.TCPFastOpen)
|
||||||
|
{
|
||||||
|
outbound.streamSettings = new StreamSettings
|
||||||
|
{
|
||||||
|
sockopt = new Sockopt
|
||||||
|
{
|
||||||
|
tcpFastOpen = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TrojanServer trojan:
|
||||||
|
outbound.protocol = "trojan";
|
||||||
|
outbound.settings = new OutboundConfiguration
|
||||||
|
{
|
||||||
|
servers = new[]
|
||||||
|
{
|
||||||
|
new ShadowsocksServerItem // I'm not serious
|
||||||
|
{
|
||||||
|
address = await server.AutoResolveHostnameAsync(),
|
||||||
|
port = server.Port,
|
||||||
|
method = "",
|
||||||
|
password = trojan.Password,
|
||||||
|
flow = trojan.TLSSecureType == "xtls" ? "xtls-rprx-direct" : ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
outbound.streamSettings = new StreamSettings
|
||||||
|
{
|
||||||
|
network = "tcp",
|
||||||
|
security = trojan.TLSSecureType
|
||||||
|
};
|
||||||
|
if (trojan.TLSSecureType != "none")
|
||||||
|
{
|
||||||
|
var tlsSettings = new TlsSettings
|
||||||
|
{
|
||||||
|
allowInsecure = Global.Settings.V2RayConfig.AllowInsecure,
|
||||||
|
serverName = trojan.Host ?? ""
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (trojan.TLSSecureType)
|
||||||
|
{
|
||||||
|
case "tls":
|
||||||
|
outbound.streamSettings.tlsSettings = tlsSettings;
|
||||||
|
break;
|
||||||
|
case "xtls":
|
||||||
|
outbound.streamSettings.xtlsSettings = tlsSettings;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Global.Settings.V2RayConfig.TCPFastOpen)
|
||||||
|
{
|
||||||
|
outbound.streamSettings.sockopt = new Sockopt
|
||||||
|
{
|
||||||
|
tcpFastOpen = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WireGuardServer wg:
|
||||||
|
outbound.protocol = "wireguard";
|
||||||
|
outbound.settings = new OutboundConfiguration
|
||||||
|
{
|
||||||
|
address = await server.AutoResolveHostnameAsync(),
|
||||||
|
port = server.Port,
|
||||||
|
localAddresses = wg.LocalAddresses.SplitOrDefault(),
|
||||||
|
peerPublicKey = wg.PeerPublicKey,
|
||||||
|
privateKey = wg.PrivateKey,
|
||||||
|
preSharedKey = wg.PreSharedKey,
|
||||||
|
mtu = wg.MTU
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Global.Settings.V2RayConfig.TCPFastOpen)
|
||||||
|
{
|
||||||
|
outbound.streamSettings = new StreamSettings
|
||||||
|
{
|
||||||
|
sockopt = new Sockopt
|
||||||
|
{
|
||||||
|
tcpFastOpen = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return outbound;
|
return outbound;
|
||||||
@@ -257,6 +407,23 @@ public static class V2rayConfigUtils
|
|||||||
throw new MessageException($"transfer protocol \"{server.TransferProtocol}\" not implemented yet");
|
throw new MessageException($"transfer protocol \"{server.TransferProtocol}\" not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Global.Settings.V2RayConfig.TCPFastOpen)
|
||||||
|
{
|
||||||
|
streamSettings.sockopt = new Sockopt
|
||||||
|
{
|
||||||
|
tcpFastOpen = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return streamSettings;
|
return streamSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string getUUID(string uuid)
|
||||||
|
{
|
||||||
|
if (uuid.Length == 36 || uuid.Length == 32)
|
||||||
|
{
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
return uuid.GenerateUUIDv5();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,17 +8,17 @@ namespace Netch.Servers;
|
|||||||
|
|
||||||
public class V2rayController : Guard, IServerController
|
public class V2rayController : Guard, IServerController
|
||||||
{
|
{
|
||||||
public V2rayController() : base("xray.exe")
|
public V2rayController() : base("v2ray-sn.exe")
|
||||||
{
|
{
|
||||||
if (!Global.Settings.V2RayConfig.XrayCone)
|
//if (!Global.Settings.V2RayConfig.XrayCone)
|
||||||
Instance.StartInfo.Environment["XRAY_CONE_DISABLED"] = "true";
|
// Instance.StartInfo.Environment["XRAY_CONE_DISABLED"] = "true";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IEnumerable<string> StartedKeywords => new[] { "started" };
|
protected override IEnumerable<string> StartedKeywords => new[] { "started" };
|
||||||
|
|
||||||
protected override IEnumerable<string> FailedKeywords => new[] { "config file not readable", "failed to" };
|
protected override IEnumerable<string> FailedKeywords => new[] { "config file not readable", "failed to" };
|
||||||
|
|
||||||
public override string Name => "Xray";
|
public override string Name => "V2Ray (SagerNet)";
|
||||||
|
|
||||||
public ushort? Socks5LocalPort { get; set; }
|
public ushort? Socks5LocalPort { get; set; }
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ public class V2rayController : Guard, IServerController
|
|||||||
await JsonSerializer.SerializeAsync(fileStream, await V2rayConfigUtils.GenerateClientConfigAsync(s), Global.NewCustomJsonSerializerOptions());
|
await JsonSerializer.SerializeAsync(fileStream, await V2rayConfigUtils.GenerateClientConfigAsync(s), Global.NewCustomJsonSerializerOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
await StartGuardAsync("-config ..\\data\\last.json");
|
await StartGuardAsync("run -c ..\\data\\last.json");
|
||||||
return new Socks5Server(IPAddress.Loopback.ToString(), this.Socks5LocalPort(), s.Hostname);
|
return new Socks5Server(IPAddress.Loopback.ToString(), this.Socks5LocalPort(), s.Hostname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@ public static class V2rayUtils
|
|||||||
var parameter = HttpUtility.ParseQueryString(text.Split('?')[1]);
|
var parameter = HttpUtility.ParseQueryString(text.Split('?')[1]);
|
||||||
text = text.Substring(0, text.IndexOf("?", StringComparison.Ordinal));
|
text = text.Substring(0, text.IndexOf("?", StringComparison.Ordinal));
|
||||||
server.TransferProtocol = parameter.Get("type") ?? "tcp";
|
server.TransferProtocol = parameter.Get("type") ?? "tcp";
|
||||||
|
server.PacketEncoding = parameter.Get("packetEncoding") ?? "xudp";
|
||||||
server.EncryptMethod = parameter.Get("encryption") ?? scheme switch { "vless" => "none", _ => "auto" };
|
server.EncryptMethod = parameter.Get("encryption") ?? scheme switch { "vless" => "none", _ => "auto" };
|
||||||
switch (server.TransferProtocol)
|
switch (server.TransferProtocol)
|
||||||
{
|
{
|
||||||
@@ -54,8 +55,6 @@ public static class V2rayUtils
|
|||||||
if (server.TLSSecureType != "none")
|
if (server.TLSSecureType != "none")
|
||||||
{
|
{
|
||||||
server.ServerName = parameter.Get("sni") ?? "";
|
server.ServerName = parameter.Get("sni") ?? "";
|
||||||
if (server.TLSSecureType == "xtls")
|
|
||||||
((VLESSServer)server).Flow = parameter.Get("flow") ?? "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +78,7 @@ public static class V2rayUtils
|
|||||||
// protocol-specific fields
|
// protocol-specific fields
|
||||||
parameter.Add("type", server.TransferProtocol);
|
parameter.Add("type", server.TransferProtocol);
|
||||||
parameter.Add("encryption", server.EncryptMethod);
|
parameter.Add("encryption", server.EncryptMethod);
|
||||||
|
parameter.Add("packetEncoding", server.PacketEncoding);
|
||||||
|
|
||||||
// transport-specific fields
|
// transport-specific fields
|
||||||
switch (server.TransferProtocol)
|
switch (server.TransferProtocol)
|
||||||
@@ -135,9 +135,7 @@ public static class V2rayUtils
|
|||||||
|
|
||||||
if (server.TLSSecureType == "xtls")
|
if (server.TLSSecureType == "xtls")
|
||||||
{
|
{
|
||||||
var flow = ((VLESSServer)server).Flow;
|
parameter.Add("flow", "xtls-rprx-direct");
|
||||||
if (!flow.IsNullOrWhiteSpace())
|
|
||||||
parameter.Add("flow", flow!.Replace("-udp443", ""));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,16 @@ internal class VLESSForm : ServerForm
|
|||||||
s => server.EncryptMethod = !string.IsNullOrWhiteSpace(s) ? s : "none",
|
s => server.EncryptMethod = !string.IsNullOrWhiteSpace(s) ? s : "none",
|
||||||
server.EncryptMethod);
|
server.EncryptMethod);
|
||||||
|
|
||||||
CreateTextBox("Flow", "Flow", s => true, s => server.Flow = s, server.Flow);
|
|
||||||
CreateComboBox("TransferProtocol",
|
CreateComboBox("TransferProtocol",
|
||||||
"Transfer Protocol",
|
"Transfer Protocol",
|
||||||
VLESSGlobal.TransferProtocols,
|
VLESSGlobal.TransferProtocols,
|
||||||
s => server.TransferProtocol = s,
|
s => server.TransferProtocol = s,
|
||||||
server.TransferProtocol);
|
server.TransferProtocol);
|
||||||
|
CreateComboBox("PacketEncoding",
|
||||||
|
"Packet Encoding",
|
||||||
|
VMessGlobal.PacketEncodings,
|
||||||
|
s => server.PacketEncoding = s,
|
||||||
|
server.PacketEncoding);
|
||||||
|
|
||||||
CreateComboBox("FakeType", "Fake Type", VLESSGlobal.FakeTypes, s => server.FakeType = s, server.FakeType);
|
CreateComboBox("FakeType", "Fake Type", VLESSGlobal.FakeTypes, s => server.FakeType = s, server.FakeType);
|
||||||
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
||||||
|
|||||||
@@ -18,10 +18,6 @@ public class VLESSServer : VMessServer
|
|||||||
/// 伪装类型
|
/// 伪装类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override string FakeType { get; set; } = VLESSGlobal.FakeTypes[0];
|
public override string FakeType { get; set; } = VLESSGlobal.FakeTypes[0];
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// </summary>
|
|
||||||
public string? Flow { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VLESSGlobal
|
public class VLESSGlobal
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ public class VMessForm : ServerForm
|
|||||||
VMessGlobal.TransferProtocols,
|
VMessGlobal.TransferProtocols,
|
||||||
s => server.TransferProtocol = s,
|
s => server.TransferProtocol = s,
|
||||||
server.TransferProtocol);
|
server.TransferProtocol);
|
||||||
|
CreateComboBox("PacketEncoding",
|
||||||
|
"Packet Encoding",
|
||||||
|
VMessGlobal.PacketEncodings,
|
||||||
|
s => server.PacketEncoding = s,
|
||||||
|
server.PacketEncoding);
|
||||||
|
|
||||||
|
|
||||||
CreateComboBox("FakeType", "Fake Type", VMessGlobal.FakeTypes, s => server.FakeType = s, server.FakeType);
|
CreateComboBox("FakeType", "Fake Type", VMessGlobal.FakeTypes, s => server.FakeType = s, server.FakeType);
|
||||||
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
CreateTextBox("Host", "Host", s => true, s => server.Host = s, server.Host);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public class VMessServer : Server
|
|||||||
|
|
||||||
public override string MaskedData()
|
public override string MaskedData()
|
||||||
{
|
{
|
||||||
var maskedData = $"{EncryptMethod} + {TransferProtocol} + {FakeType}";
|
var maskedData = $"{EncryptMethod} + {TransferProtocol} + {PacketEncoding} + {FakeType}";
|
||||||
switch (TransferProtocol)
|
switch (TransferProtocol)
|
||||||
{
|
{
|
||||||
case "tcp":
|
case "tcp":
|
||||||
@@ -49,6 +49,11 @@ public class VMessServer : Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual string TransferProtocol { get; set; } = VMessGlobal.TransferProtocols[0];
|
public virtual string TransferProtocol { get; set; } = VMessGlobal.TransferProtocols[0];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 包传输格式
|
||||||
|
/// </summary>
|
||||||
|
public virtual string PacketEncoding { get; set; } = VMessGlobal.PacketEncodings[2];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 伪装类型
|
/// 伪装类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -104,7 +109,8 @@ public class VMessGlobal
|
|||||||
"auto",
|
"auto",
|
||||||
"none",
|
"none",
|
||||||
"aes-128-gcm",
|
"aes-128-gcm",
|
||||||
"chacha20-poly1305"
|
"chacha20-poly1305",
|
||||||
|
"zero"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static readonly List<string> QUIC = new()
|
public static readonly List<string> QUIC = new()
|
||||||
@@ -114,6 +120,13 @@ public class VMessGlobal
|
|||||||
"chacha20-poly1305"
|
"chacha20-poly1305"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static readonly List<string> PacketEncodings = new()
|
||||||
|
{
|
||||||
|
"none",
|
||||||
|
"packet", // requires v2fly/v2ray-core v5.0.2+ or SagerNet/v2ray-core
|
||||||
|
"xudp" // requires XTLS/Xray-core or SagerNet/v2ray-core
|
||||||
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// V2Ray 传输协议
|
/// V2Ray 传输协议
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
20
Netch/Servers/WireGuard/WireGuardForm.cs
Normal file
20
Netch/Servers/WireGuard/WireGuardForm.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Netch.Forms;
|
||||||
|
|
||||||
|
namespace Netch.Servers;
|
||||||
|
|
||||||
|
[Fody.ConfigureAwait(true)]
|
||||||
|
public class WireGuardForm : ServerForm
|
||||||
|
{
|
||||||
|
public WireGuardForm(WireGuardServer? server = default)
|
||||||
|
{
|
||||||
|
server ??= new WireGuardServer();
|
||||||
|
Server = server;
|
||||||
|
CreateTextBox("LocalAddresses", "Local Addresses", s => true, s => server.LocalAddresses = s, server.LocalAddresses);
|
||||||
|
CreateTextBox("PeerPublicKey", "Public Key", s => true, s => server.PeerPublicKey = s, server.PeerPublicKey);
|
||||||
|
CreateTextBox("PrivateKey", "Private Key", s => true, s => server.PrivateKey = s, server.PrivateKey);
|
||||||
|
CreateTextBox("PreSharedKey", "PSK", s => true, s => server.PreSharedKey = s, server.PreSharedKey);
|
||||||
|
CreateTextBox("MTU", "MTU", s => int.TryParse(s, out _), s => server.MTU = int.Parse(s), server.MTU.ToString(), 76);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string TypeName { get; } = "WireGuard";
|
||||||
|
}
|
||||||
38
Netch/Servers/WireGuard/WireGuardServer.cs
Normal file
38
Netch/Servers/WireGuard/WireGuardServer.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
using Netch.Models;
|
||||||
|
|
||||||
|
namespace Netch.Servers;
|
||||||
|
|
||||||
|
public class WireGuardServer : Server
|
||||||
|
{
|
||||||
|
public override string Type { get; } = "WireGuard";
|
||||||
|
|
||||||
|
public override string MaskedData()
|
||||||
|
{
|
||||||
|
return $"{LocalAddresses} + {MTU}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 本地地址
|
||||||
|
/// </summary>
|
||||||
|
public string LocalAddresses { get; set; } = "172.16.0.2";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 节点公钥
|
||||||
|
/// </summary>
|
||||||
|
public string PeerPublicKey { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 私钥
|
||||||
|
/// </summary>
|
||||||
|
public string PrivateKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 节点预共享密钥
|
||||||
|
/// </summary>
|
||||||
|
public string? PreSharedKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MTU
|
||||||
|
/// </summary>
|
||||||
|
public int MTU { get; set; } = 1420;
|
||||||
|
}
|
||||||
53
Netch/Servers/WireGuard/WireGuardUtil.cs
Normal file
53
Netch/Servers/WireGuard/WireGuardUtil.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System.Text.Encodings.Web;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using Netch.Interfaces;
|
||||||
|
using Netch.Models;
|
||||||
|
using Netch.Utils;
|
||||||
|
|
||||||
|
namespace Netch.Servers;
|
||||||
|
|
||||||
|
public class WireGuardUtil : IServerUtil
|
||||||
|
{
|
||||||
|
public ushort Priority { get; } = 4;
|
||||||
|
|
||||||
|
public string TypeName { get; } = "WireGuard";
|
||||||
|
|
||||||
|
public string FullName { get; } = "WireGuard";
|
||||||
|
|
||||||
|
public string ShortName { get; } = "WG";
|
||||||
|
|
||||||
|
public string[] UriScheme { get; } = { "wireguard" };
|
||||||
|
|
||||||
|
public Type ServerType { get; } = typeof(WireGuardServer);
|
||||||
|
|
||||||
|
public void Edit(Server s)
|
||||||
|
{
|
||||||
|
new WireGuardForm((WireGuardServer)s).ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Create()
|
||||||
|
{
|
||||||
|
new WireGuardForm().ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetShareLink(Server s)
|
||||||
|
{
|
||||||
|
return V2rayUtils.GetVShareLink(s, "wireguard");
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServerController GetController()
|
||||||
|
{
|
||||||
|
return new V2rayController();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Server> ParseUri(string text)
|
||||||
|
{
|
||||||
|
return V2rayUtils.ParseVUri(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CheckServer(Server s)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Text;
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace Netch.Utils;
|
namespace Netch.Utils;
|
||||||
|
|
||||||
@@ -78,4 +79,30 @@ public static class StringExtension
|
|||||||
{
|
{
|
||||||
return !string.IsNullOrWhiteSpace(value) ? value.Split(',') : default;
|
return !string.IsNullOrWhiteSpace(value) ? value.Split(',') : default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GenerateUUIDv5(this string str)
|
||||||
|
{
|
||||||
|
// https://github.com/XTLS/Xray-core/discussions/715
|
||||||
|
// https://xray-uuid.ducksoft.site/
|
||||||
|
|
||||||
|
SHA1 sha1 = new SHA1CryptoServiceProvider();
|
||||||
|
|
||||||
|
// example string: "example"
|
||||||
|
List<byte> byteSource = new List<byte>();
|
||||||
|
byteSource.AddRange(new byte[16]);
|
||||||
|
byteSource.AddRange(Encoding.UTF8.GetBytes(str));
|
||||||
|
|
||||||
|
byte[] Sha1Bytes = sha1.ComputeHash(byteSource.ToArray()).Skip(0).Take(16).ToArray();
|
||||||
|
sha1.Dispose();
|
||||||
|
|
||||||
|
//UUIDv5: [254 181 68 49 48 27 82 187 166 221 225 233 62 129 187 158]
|
||||||
|
|
||||||
|
Sha1Bytes[6] = (byte)((Sha1Bytes[6] & 0x0f) | (5 << 4));
|
||||||
|
Sha1Bytes[8] = (byte)(Sha1Bytes[8] & (0xff >> 2) | (0x02 << 6));
|
||||||
|
|
||||||
|
return BitConverter.ToString(Sha1Bytes).Replace("-", "")
|
||||||
|
.Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-")
|
||||||
|
.ToLower();
|
||||||
|
//UUIDv5: feb54431-301b-52bb-a6dd-e1e93e81bb9e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/shadowsocks/libev -b 'mingw' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
msys2 ..\build.sh
|
|
||||||
exit $lastExitCode
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
mkdir -p "${PWD}/../../build"
|
|
||||||
|
|
||||||
./configure --prefix="${PWD}/../../build" || exit $?
|
|
||||||
|
|
||||||
make install -j2
|
|
||||||
exit $?
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/shadowsocks/shadowsocks-rust -b 'v1.12.0' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
cargo build --features logging,trust-dns,local,utility,local-http,local-tunnel,local-socks4,multi-threaded,stream-cipher --release
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
|
|
||||||
cp -Force '.\target\release\sslocal.exe' '..\..\release\Shadowsocks.exe'
|
|
||||||
exit 0
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/shadowsocksrr/shadowsocksr-libev -b 'Akkariiin/develop' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
msys2 ..\build.sh
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
|
|
||||||
cp -Force '.\ss-local.exe' '..\..\release\ShadowsocksR.exe'
|
|
||||||
exit 0
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
git submodule update --init || exit $?
|
|
||||||
|
|
||||||
cd libudns
|
|
||||||
./autogen.sh || exit $?
|
|
||||||
./configure || exit $?
|
|
||||||
make -j2 || exit $?
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
./autogen.sh || exit $?
|
|
||||||
CFLAGS+="-fstack-protector" ./configure --disable-documentation --with-ev="${PWD}/../../build" || exit $?
|
|
||||||
|
|
||||||
sed -i "s/%I/%z/g" src/utils.h
|
|
||||||
sed -i "s/^const/extern const/g" src/tls.h
|
|
||||||
sed -i "s/^const/extern const/g" src/http.h
|
|
||||||
|
|
||||||
make -j2 || exit $?
|
|
||||||
|
|
||||||
gcc $(find src/ -name "ss_local-*.o") $(find . -name "*.a" ! -name "*.dll.a") "${PWD}/../../build/lib/libev.a" -o ss-local -fstack-protector -static -lpcre -lssl -lcrypto -lws2_32 -s
|
|
||||||
exit $?
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/shadowsocks/simple-obfs src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
msys2 ..\build.sh
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
|
|
||||||
cp -Force '.\obfs-local.exe' '..\..\release\simple-obfs.exe'
|
|
||||||
exit 0
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
git submodule update --init || exit $?
|
|
||||||
|
|
||||||
./autogen.sh || exit $?
|
|
||||||
./configure --disable-documentation --with-ev="${PWD}/../../build" || exit $?
|
|
||||||
|
|
||||||
make -j2 || exit $?
|
|
||||||
|
|
||||||
gcc $(find src/ -name "obfs_local-*.o") $(find . -name "*.a" ! -name "*.dll.a") "${PWD}/../../build/lib/libev.a" -o obfs-local -fstack-protector -static -lws2_32 -s
|
|
||||||
exit $?
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/p4gefau1t/trojan-go -b 'v0.10.6' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
$Env:CGO_ENABLED='0'
|
|
||||||
$Env:GOROOT_FINAL='/usr'
|
|
||||||
|
|
||||||
$Env:GOOS='windows'
|
|
||||||
$Env:GOARCH='amd64'
|
|
||||||
go build -a -trimpath -asmflags '-s -w' -ldflags '-s -w' -tags 'full' -o '..\..\release\Trojan.exe'
|
|
||||||
exit $lastExitCode
|
|
||||||
56
Other/v2ray-sn/README.md
Normal file
56
Other/v2ray-sn/README.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Project V for SagerNet for Netch
|
||||||
|
This is not a joke.
|
||||||
|
Modified from [SagerNet/v2ray-core](https://github.com/SagerNet/v2ray-core).
|
||||||
|
#### Extends all features of SagerNet/v2ray-core
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- embed ShadowsocksR plugin for shadowsocks
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "shadowsocks",
|
||||||
|
"settings": {
|
||||||
|
...
|
||||||
|
"plugin": "shadowsocksr",
|
||||||
|
"pluginArgs": [
|
||||||
|
"--obfs=<OBFS_TYPE>",
|
||||||
|
"--obfs-param=<OBFS_PARAMETERS>",
|
||||||
|
"--protocol=<PROTOCOL_TYPE>",
|
||||||
|
"--protocol-param=<PROTOCOL_PARAMETERS>"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- embed simple-obfs plugin for shadowsocks
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "shadowsocks",
|
||||||
|
"settings": {
|
||||||
|
...
|
||||||
|
"plugin": "obfs-local",
|
||||||
|
"pluginOpts": "<SIMPLE_OBFS_OPTIONS>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Re-enable ReadV
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
GPL v3
|
||||||
|
|
||||||
|
### Credits
|
||||||
|
|
||||||
|
This repo relies on the following projects:
|
||||||
|
- [SagerNet/LibSagerNetCore](https://github.com/SagerNet/LibSagerNetCore)
|
||||||
28
Other/v2ray-sn/build.ps1
Normal file
28
Other/v2ray-sn/build.ps1
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
||||||
|
|
||||||
|
git clone https://github.com/SagerNet/v2ray-core.git -b 'v5.0.14' src
|
||||||
|
if ( -Not $? ) {
|
||||||
|
exit $lastExitCode
|
||||||
|
}
|
||||||
|
Set-Location src
|
||||||
|
|
||||||
|
# Download SSR plugin
|
||||||
|
Invoke-WebRequest -Uri 'https://gist.githubusercontent.com/H1JK/b3165a99b635dcc06101690e4c43b5fd/raw/691b471f3b395a949d03a3d064d93d319d4997b7/ssr.go' -OutFile '.\proxy\shadowsocks\plugin\self\ssr.go'
|
||||||
|
|
||||||
|
# Download Simple-Obfs plugin
|
||||||
|
Invoke-WebRequest -Uri 'https://gist.githubusercontent.com/H1JK/b3165a99b635dcc06101690e4c43b5fd/raw/691b471f3b395a949d03a3d064d93d319d4997b7/obfs.go' -OutFile '.\proxy\shadowsocks\plugin\self\obfs.go'
|
||||||
|
|
||||||
|
# Enable ReadV (Use old ReadV code)
|
||||||
|
Remove-Item '.\common\buf\io.go'
|
||||||
|
Remove-Item '.\common\buf\readv_reader.go'
|
||||||
|
Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/SagerNet/v2ray-core/2711fd1/common/buf/io.go' -OutFile '.\common\buf\io.go'
|
||||||
|
Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/SagerNet/v2ray-core/2711fd1/common/buf/readv_reader.go' -OutFile '.\common\buf\readv_reader.go'
|
||||||
|
|
||||||
|
$Env:CGO_ENABLED='0'
|
||||||
|
$Env:GOROOT_FINAL='/usr'
|
||||||
|
|
||||||
|
$Env:GOOS='windows'
|
||||||
|
$Env:GOARCH='amd64'
|
||||||
|
go mod tidy # necessary
|
||||||
|
go build -a -trimpath -asmflags '-s -w' -ldflags '-s -w -buildid=' -o '..\..\release\v2ray-sn.exe' '.\main'
|
||||||
|
exit $lastExitCode
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/xtls/xray-core -b 'v1.4.5' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
$Env:CGO_ENABLED='0'
|
|
||||||
$Env:GOROOT_FINAL='/usr'
|
|
||||||
|
|
||||||
$Env:GOOS='windows'
|
|
||||||
$Env:GOARCH='amd64'
|
|
||||||
go build -a -trimpath -asmflags '-s -w' -ldflags '-s -w -buildid=' -o '..\..\release\xray.exe' '.\main'
|
|
||||||
exit $lastExitCode
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
|
|
||||||
|
|
||||||
git clone https://github.com/teddysun/xray-plugin -b 'v1.4.5' src
|
|
||||||
if ( -Not $? ) {
|
|
||||||
exit $lastExitCode
|
|
||||||
}
|
|
||||||
Set-Location src
|
|
||||||
|
|
||||||
$Env:CGO_ENABLED='0'
|
|
||||||
$Env:GOROOT_FINAL='/usr'
|
|
||||||
|
|
||||||
$Env:GOOS='windows'
|
|
||||||
$Env:GOARCH='amd64'
|
|
||||||
go build -a -trimpath -asmflags '-s -w' -ldflags '-s -w' -o '..\..\release\xray-plugin.exe'
|
|
||||||
exit $lastExitCode
|
|
||||||
@@ -27,7 +27,7 @@ Some features may not be implemented in version 1
|
|||||||
- [`WireGuard`](https://www.wireguard.com)
|
- [`WireGuard`](https://www.wireguard.com)
|
||||||
- [`Trojan`](https://trojan-gfw.github.io/trojan)
|
- [`Trojan`](https://trojan-gfw.github.io/trojan)
|
||||||
- [`VMess`](https://www.v2fly.org)
|
- [`VMess`](https://www.v2fly.org)
|
||||||
- [`VLess`](https://xtls.github.io)
|
- [`VLESS`](https://xtls.github.io)
|
||||||
|
|
||||||
### Others
|
### Others
|
||||||
- UDP NAT FullCone (Limited by your server)
|
- UDP NAT FullCone (Limited by your server)
|
||||||
|
|||||||
@@ -89,10 +89,10 @@ bool SocksHelper::Handshake(SOCKET client)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Password */
|
/* Password */
|
||||||
buffer[1 + plength] = 0x00;
|
buffer[1 + 1 + ulength] = 0x00;
|
||||||
if (plength != 0)
|
if (plength != 0)
|
||||||
{
|
{
|
||||||
buffer[1 + ulength] = plength;
|
buffer[1 + 1 + ulength] = plength;
|
||||||
memcpy(buffer + 1 + 1 + ulength + 1, tgtPassword.c_str(), plength);
|
memcpy(buffer + 1 + 1 + ulength + 1, tgtPassword.c_str(), plength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1,5 +1,9 @@
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace Tests
|
namespace Tests
|
||||||
{
|
{
|
||||||
@@ -11,5 +15,32 @@ namespace Tests
|
|||||||
{
|
{
|
||||||
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
|
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
|
||||||
}
|
}
|
||||||
|
[TestMethod]
|
||||||
|
public void VLESS_UUID5()
|
||||||
|
{
|
||||||
|
//https://github.com/XTLS/Xray-core/discussions/715
|
||||||
|
|
||||||
|
byte[] bytes = new byte[16];
|
||||||
|
var str = "example";
|
||||||
|
|
||||||
|
SHA1 sha1 = new SHA1CryptoServiceProvider();
|
||||||
|
byte[] StrBytes = Encoding.UTF8.GetBytes(str);
|
||||||
|
|
||||||
|
List<byte> byteSource = new List<byte>();
|
||||||
|
byteSource.AddRange(bytes);
|
||||||
|
byteSource.AddRange(StrBytes);
|
||||||
|
|
||||||
|
byte[] Sha1Bytes = sha1.ComputeHash(byteSource.ToArray()).Skip(0).Take(16).ToArray();
|
||||||
|
sha1.Dispose();
|
||||||
|
|
||||||
|
//UUIDv5: [254 181 68 49 48 27 82 187 166 221 225 233 62 129 187 158]
|
||||||
|
|
||||||
|
Sha1Bytes[6] = (byte)((Sha1Bytes[6] & 0x0f) | (5 << 4));
|
||||||
|
Sha1Bytes[8] = (byte)(Sha1Bytes[8] & (0xff >> 2) | (0x02 << 6));
|
||||||
|
|
||||||
|
var result = BitConverter.ToString(Sha1Bytes).Replace("-", "").Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-").ToLower();
|
||||||
|
Console.WriteLine(result);
|
||||||
|
//UUIDv5: feb54431-301b-52bb-a6dd-e1e93e81bb9e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
|
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
|
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||||
<PackageReference Include="coverlet.collector" Version="3.1.2" />
|
<PackageReference Include="coverlet.collector" Version="3.1.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ cp -Recurse -Force '..\Storage\mode' '.' | Out-Null
|
|||||||
cp -Recurse -Force '..\Storage\stun.txt' 'bin' | Out-Null
|
cp -Recurse -Force '..\Storage\stun.txt' 'bin' | Out-Null
|
||||||
cp -Recurse -Force '..\Storage\nfdriver.sys' 'bin' | Out-Null
|
cp -Recurse -Force '..\Storage\nfdriver.sys' 'bin' | Out-Null
|
||||||
cp -Recurse -Force '..\Storage\aiodns.conf' 'bin' | Out-Null
|
cp -Recurse -Force '..\Storage\aiodns.conf' 'bin' | Out-Null
|
||||||
cp -Recurse -Force '..\Storage\GeoLite2-Country.mmdb' 'bin' | Out-Null
|
Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb' -OutFile 'bin\GeoLite2-Country.mmdb'
|
||||||
|
#cp -Recurse -Force '..\Storage\GeoLite2-Country.mmdb' 'bin' | Out-Null
|
||||||
cp -Recurse -Force '..\Storage\tun2socks.bin' 'bin' | Out-Null
|
cp -Recurse -Force '..\Storage\tun2socks.bin' 'bin' | Out-Null
|
||||||
cp -Recurse -Force '..\Storage\README.md' 'bin' | Out-Null
|
cp -Recurse -Force '..\Storage\README.md' 'bin' | Out-Null
|
||||||
Pop-Location
|
Pop-Location
|
||||||
@@ -102,4 +103,4 @@ if ( $Configuration.Equals('Release') ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Pop-Location
|
Pop-Location
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
Reference in New Issue
Block a user