From db1ccfed9bae47949a677bb32dd369cd4a10a6ea Mon Sep 17 00:00:00 2001 From: ProxySU Date: Fri, 5 Jun 2020 23:27:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Trojan-Go=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProxySU/MainWindow.xaml | 30 +- ProxySU/MainWindow.xaml.cs | 518 +++++++++++++----- ProxySU/Properties/AssemblyInfo.cs | 4 +- ProxySU/ProxySU.csproj | 14 + ProxySU/ResultClientInformation.xaml | 2 +- ProxySU/ResultClientInformation.xaml.cs | 5 +- ProxySU/TrojanGoResultClientInfoWindow.xaml | 72 +++ .../TrojanGoResultClientInfoWindow.xaml.cs | 161 ++++++ ProxySU/TrojanGoTemplateWindow.xaml | 115 ++++ ProxySU/TrojanGoTemplateWindow.xaml.cs | 119 ++++ ProxySU/TrojanResultClientInfoWindow.xaml | 3 + ProxySU/TrojanResultClientInfoWindow.xaml.cs | 14 +- ProxySU/TrojanTemplateWindow.xaml | 13 +- ProxySU/TrojanTemplateWindow.xaml.cs | 16 +- ProxySU/bin/Beta/Beta.zip | Bin 490383 -> 493757 bytes TemplateConfg/trojan-go_all_config.json | 113 ++++ 16 files changed, 1033 insertions(+), 166 deletions(-) create mode 100644 ProxySU/TrojanGoResultClientInfoWindow.xaml create mode 100644 ProxySU/TrojanGoResultClientInfoWindow.xaml.cs create mode 100644 ProxySU/TrojanGoTemplateWindow.xaml create mode 100644 ProxySU/TrojanGoTemplateWindow.xaml.cs create mode 100644 TemplateConfg/trojan-go_all_config.json diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml index 9cdc911..08988a8 100644 --- a/ProxySU/MainWindow.xaml +++ b/ProxySU/MainWindow.xaml @@ -134,7 +134,7 @@ - + @@ -152,7 +152,7 @@ + + + + + + + + + + + + + + + + + + + + @@ -387,7 +411,7 @@ - + diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs index 9752945..51275ac 100644 --- a/ProxySU/MainWindow.xaml.cs +++ b/ProxySU/MainWindow.xaml.cs @@ -951,8 +951,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) { - client.RunCommand(@"bash - c 'echo ""net.core.default_qdisc = fq"" >> /etc/sysctl.conf'"); - client.RunCommand(@"bash - c 'echo ""net.ipv4.tcp_congestion_control = bbr"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); client.RunCommand(@"sysctl -p"); } @@ -1363,7 +1363,6 @@ namespace ProxySU thread.SetApartmentState(ApartmentState.STA); thread.Start(); } - //登录远程主机布署Trojan程序 private void StartSetUpTrojan(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar, string serverConfig, string clientConfig, string upLoadPath) { @@ -1827,8 +1826,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) { - client.RunCommand(@"bash - c 'echo ""net.core.default_qdisc = fq"" >> /etc/sysctl.conf'"); - client.RunCommand(@"bash - c 'echo ""net.ipv4.tcp_congestion_control = bbr"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); client.RunCommand(@"sysctl -p"); } @@ -1907,7 +1906,8 @@ namespace ProxySU } - //打开设置TrojanGo的窗口 + + //打开设置TrojanGo参数窗口 private void ButtonTrojanGoTemplate_Click(object sender, RoutedEventArgs e) { for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) @@ -1915,10 +1915,9 @@ namespace ProxySU { ReceiveConfigurationParameters[i] = ""; } - TrojanTemplateWindow windowTrojanTemplateConfiguration = new TrojanTemplateWindow(); - windowTrojanTemplateConfiguration.ShowDialog(); + TrojanGoTemplateWindow windowTrojanGoTemplateConfiguration = new TrojanGoTemplateWindow(); + windowTrojanGoTemplateConfiguration.ShowDialog(); } - //Trojan一键安装 private void ButtonTrojanGoSetUp_Click(object sender, RoutedEventArgs e) { ConnectionInfo connectionInfo = GenerateConnectionInfo(); @@ -1927,29 +1926,48 @@ namespace ProxySU MessageBox.Show("远程主机连接信息有误,请检查"); return; } - string serverConfig = ""; //服务端配置文件 - string clientConfig = ""; //生成的客户端配置文件 - string upLoadPath = "/usr/local/etc/trojan/config.json"; //服务端文件位置 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) - { - ReceiveConfigurationParameters[4] = TextBoxHost.Text.ToString(); - } + string serverConfig = "TemplateConfg\\trojan-go_all_config.json"; //服务端配置文件 + string clientConfig = "TemplateConfg\\trojan-go_all_config.json"; //生成的客户端配置文件 + string upLoadPath = "/etc/trojan-go/config.json"; //服务端文件位置 + + //if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == false) + //if(ReceiveConfigurationParameters[0].Contains("TrojanGo")==true) + //{ + // serverConfig = "TemplateConfg\\trojan-go_all_config.json"; + // clientConfig = "TemplateConfg\\trojan-go_all_config.json"; + //} + //else if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoTLS2Web")) + //{ + // serverConfig = "TemplateConfg\\trojan-go_all_config.json"; + // clientConfig = "TemplateConfg\\trojan-go_all_config.json"; + //} + //else if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoWebSocketTLS2Web")) + //{ + // serverConfig = "TemplateConfg\\trojan-go_all_config.json"; + // clientConfig = "TemplateConfg\\trojan-go_all_config.json"; + //} + //else if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) { - MessageBox.Show("请先选择配置模板!"); + MessageBox.Show("未选择配置模板或模板选择错误!"); return; } - else if (String.Equals(ReceiveConfigurationParameters[0], "TrojanTLS2Web")) + if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) { - serverConfig = "TemplateConfg\\trojan_server_config.json"; - clientConfig = "TemplateConfg\\trojan_client_config.json"; + MessageBox.Show("空域名,请检查相关参数设置!"); + return; + //ReceiveConfigurationParameters[4] = TextBoxHost.Text.ToString(); } - Thread thread = new Thread(() => StartSetUpTrojan(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing, serverConfig, clientConfig, upLoadPath)); + //else + //{ + // MessageBox.Show("空域名,请检查相关参数设置!"); + // return; + //} + Thread thread = new Thread(() => StartSetUpTrojanGo(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing, serverConfig, clientConfig, upLoadPath)); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } - - //登录远程主机布署Trojan程序 + //登录远程主机布署Trojan-Go程序 private void StartSetUpTrojanGo(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar, string serverConfig, string clientConfig, string upLoadPath) { string currentStatus = "正在登录远程主机......"; @@ -2004,15 +2022,15 @@ namespace ProxySU client.Disconnect(); return; } - //检测是否安装有Trojan - currentStatus = "检测系统是否已经安装Trojan......"; + //检测是否安装有Trojan-Go + currentStatus = "检测系统是否已经安装Trojan-Go......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); //string cmdTestTrojanInstalled = @"find / -name trojan"; - string resultCmdTestTrojanInstalled = client.RunCommand(@"find / -name trojan").Result; + string resultCmdTestTrojanInstalled = client.RunCommand(@"find / -name trojan-go").Result; - if (resultCmdTestTrojanInstalled.Contains("/usr/local/bin/trojan") == true) + if (resultCmdTestTrojanInstalled.Contains("/usr/bin/trojan-go/trojan-go") == true) { MessageBoxResult messageBoxResult = MessageBox.Show("远程主机已安装Trojan,是否强制重新安装?", "", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.No) @@ -2030,19 +2048,19 @@ namespace ProxySU textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); - string resultCmd = client.RunCommand("uname -m").Result; + //string resultCmd = client.RunCommand("uname -m").Result; //var result = client.RunCommand("cat /root/test.ver"); //string[] linuxKernelVerStr = resultCmd.Split('-'); //bool detectResult = DetectKernelVersion(linuxKernelVerStr[0]); - if (resultCmd.Contains("x86_64") == false) - { - MessageBox.Show($"请在x86_64系统中安装Trojan"); - currentStatus = "系统不符合要求,安装失败!!"; - textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); - Thread.Sleep(1000); - } + //if (resultCmd.Contains("x86_64") == false) + //{ + // MessageBox.Show($"请在x86_64系统中安装Trojan"); + // currentStatus = "系统不符合要求,安装失败!!"; + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // Thread.Sleep(1000); + //} //检测系统是否支持yum 或 apt-get或zypper,且支持Systemd //如果不存在组件,则命令结果为空,string.IsNullOrEmpty值为真, @@ -2077,9 +2095,9 @@ namespace ProxySU } - //如果使用如果是WebSocket + TLS + Web/http2/Http2Web/tcp_TLS/WebSocket_TLS模式,需要检测域名解析是否正确 - if (serverConfig.Contains("trojan_server") == true) - { + //检测域名解析是否正确 + //if (serverConfig.Contains("trojan_server") == true) + //{ currentStatus = "正在检测域名是否解析到当前VPS的IP上......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); @@ -2127,9 +2145,9 @@ namespace ProxySU return; } - } - if (serverConfig.Contains("trojan_server") == true) - { + //} + //if (serverConfig.Contains("trojan_server") == true) + //{ //检测是否安装lsof if (string.IsNullOrEmpty(client.RunCommand("command -v lsof").Result) == true) { @@ -2198,7 +2216,7 @@ namespace ProxySU Thread.Sleep(1000); } - } + //} currentStatus = "符合安装要求,布署中......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); @@ -2227,24 +2245,24 @@ namespace ProxySU //下载官方安装脚本安装 - client.RunCommand("curl -o /tmp/trojan-quickstart.sh https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh"); - client.RunCommand("yes | bash /tmp/trojan-quickstart.sh"); + client.RunCommand("curl -o /tmp/trojan-go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"); + client.RunCommand("bash /tmp/trojan-go.sh -f"); - string installResult = client.RunCommand("find / -name trojan").Result.ToString(); + string installResult = client.RunCommand("find / -name trojan-go").Result.ToString(); - if (!installResult.Contains("/usr/local/bin/trojan")) + if (!installResult.Contains("/usr/bin/trojan-go/trojan-go")) { MessageBox.Show("安装Trojan失败(官方脚本运行出错!"); - client.Disconnect(); + currentStatus = "安装Trojan失败(官方脚本运行出错!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); client.Disconnect(); return; } - client.RunCommand("mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.1"); + client.RunCommand("mv /etc/trojan-go/config.json /etc/trojan-go/config.json.1"); //上传配置文件 - currentStatus = "Trojan程序安装完毕,配置文件上传中......"; + currentStatus = "Trojan-Go程序安装完毕,配置文件上传中......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); @@ -2252,16 +2270,25 @@ namespace ProxySU using (StreamReader reader = File.OpenText(serverConfig)) { JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); + serverJson["run_type"] = "server"; + serverJson["local_addr"] = "0.0.0.0"; + serverJson["local_port"] = 443; + serverJson["remote_addr"] = "127.0.0.1"; + serverJson["remote_port"] = 80; //设置密码 serverJson["password"][0] = ReceiveConfigurationParameters[2]; - //设置监听端口 - //serverJson["inbounds"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); + //设置证书 + serverJson["ssl"]["cert"] = "/etc/trojan-go/trojan-go.crt"; + serverJson["ssl"]["key"] = "/etc/trojan-go/trojan-go.key"; + serverJson["ssl"]["cert"] = "/etc/trojan-go/trojan-go.crt"; + serverJson["ssl"]["sni"] = ReceiveConfigurationParameters[4]; using (StreamWriter sw = new StreamWriter(@"config.json")) { sw.Write(serverJson.ToString()); } } + upLoadPath = "/etc/trojan-go/config.json"; UploadConfig(connectionInfo, @"config.json", upLoadPath); File.Delete(@"config.json"); @@ -2270,40 +2297,38 @@ namespace ProxySU string openFireWallPort = ReceiveConfigurationParameters[1]; if (String.IsNullOrEmpty(client.RunCommand("command -v firewall-cmd").Result) == false) { - if (String.Equals(openFireWallPort, "443")) - { + //if (String.Equals(openFireWallPort, "443")) + //{ client.RunCommand("firewall-cmd --zone=public --add-port=80/tcp --permanent"); client.RunCommand("firewall-cmd --zone=public --add-port=443/tcp --permanent"); client.RunCommand("firewall-cmd --reload"); - } - else - { - client.RunCommand($"firewall-cmd --zone=public --add-port={openFireWallPort}/tcp --permanent"); - client.RunCommand($"firewall-cmd --zone=public --add-port={openFireWallPort}/udp --permanent"); - client.RunCommand("firewall-cmd --reload"); - } + //} + //else + //{ + // client.RunCommand($"firewall-cmd --zone=public --add-port={openFireWallPort}/tcp --permanent"); + // client.RunCommand($"firewall-cmd --zone=public --add-port={openFireWallPort}/udp --permanent"); + // client.RunCommand("firewall-cmd --reload"); + //} } if (String.IsNullOrEmpty(client.RunCommand("command -v ufw").Result) == false) { - if (String.Equals(openFireWallPort, "443")) - { + //if (String.Equals(openFireWallPort, "443")) + //{ client.RunCommand("ufw allow 80"); client.RunCommand("ufw allow 443"); client.RunCommand("yes | ufw reset"); - } - else - { - client.RunCommand($"ufw allow {openFireWallPort}/tcp"); - client.RunCommand($"ufw allow {openFireWallPort}/udp"); - client.RunCommand("yes | ufw reset"); - } + //} + //else + //{ + // client.RunCommand($"ufw allow {openFireWallPort}/tcp"); + // client.RunCommand($"ufw allow {openFireWallPort}/udp"); + // client.RunCommand("yes | ufw reset"); + //} } - - - if (serverConfig.Contains("trojan_server") == true) - { - currentStatus = "使用Trojan+TLS+Web模式,正在安装acme.sh......"; + //if (serverConfig.Contains("trojan_server") == true) + //{ + currentStatus = "正在安装acme.sh......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); @@ -2333,25 +2358,17 @@ namespace ProxySU //client.RunCommand("mkdir -p /etc/v2ray/ssl"); client.RunCommand($"/root/.acme.sh/acme.sh --issue --standalone -d {ReceiveConfigurationParameters[4]}"); - currentStatus = "安装证书到Trojan......"; + currentStatus = "安装证书到Trojan-Go......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); - client.RunCommand($"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/trojan/trojan_ssl.crt --keypath /usr/local/etc/trojan/trojan_ssl.key --capath /usr/local/etc/trojan/trojan_ssl.crt --reloadcmd \"systemctl restart trojan\""); - } + client.RunCommand($"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /etc/trojan-go/trojan-go.crt --keypath /etc/trojan-go/trojan-go.key --capath /etc/trojan-go/trojan-go.crt --reloadcmd \"systemctl restart trojan-go\""); + //} - currentStatus = "正在启动Trojan......"; - textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); - Thread.Sleep(1000); - //启动V2ray服务 - client.RunCommand("systemctl restart trojan"); - - currentStatus = "Trojan启动成功!"; - textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); - Thread.Sleep(1000); + //安装Caddy - if (serverConfig.Contains("trojan_server") == true) - { + //if (serverConfig.Contains("trojan_server") == true) + //{ currentStatus = "正在安装Caddy"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); @@ -2367,10 +2384,10 @@ namespace ProxySU Thread.Sleep(1000); string caddyConfig = ""; - if (serverConfig.Contains("trojan_server") == true) - { + //if (serverConfig.Contains("trojan_server") == true) + //{ caddyConfig = "TemplateConfg\\trojan_caddy_config.caddyfile"; - } + //} upLoadPath = "/etc/caddy/Caddyfile"; UploadConfig(connectionInfo, caddyConfig, upLoadPath); @@ -2396,11 +2413,28 @@ namespace ProxySU sshCmd = $"caddy -service install -agree -conf /etc/caddy/Caddyfile -email {email}"; //MessageBox.Show(sshCmd); client.RunCommand(sshCmd); - - //启动Caddy服务 + currentStatus = "正在启动Caddy......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + //启动V2ray服务 client.RunCommand("caddy -service restart"); - } + + currentStatus = "Caddy启动成功!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + + //} + + currentStatus = "正在启动Trojan-Go......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + //启动V2ray服务 + client.RunCommand("systemctl restart trojan-go"); + + currentStatus = "Trojan启动成功!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); //测试BBR条件,若满足提示是否启用 var result = client.RunCommand("uname -r"); @@ -2412,8 +2446,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) { - client.RunCommand(@"bash - c 'echo ""net.core.default_qdisc = fq"" >> /etc/sysctl.conf'"); - client.RunCommand(@"bash - c 'echo ""net.ipv4.tcp_congestion_control = bbr"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); client.RunCommand(@"sysctl -p"); } @@ -2421,20 +2455,22 @@ namespace ProxySU currentStatus = "生成客户端配置......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); - if (!Directory.Exists("trojan_config"))//如果不存在就创建file文件夹      + if (!Directory.Exists("trojan-go_config"))//如果不存在就创建file文件夹      { - Directory.CreateDirectory("trojan_config");//创建该文件夹   + Directory.CreateDirectory("trojan-go_config");//创建该文件夹   } - //string clientConfig = "TemplateConfg\\tcp_client_config.json"; + clientConfig = "TemplateConfg\\trojan-go_all_config.json"; using (StreamReader reader = File.OpenText(clientConfig)) { JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - + clientJson["run_type"] = "client"; + clientJson["local_addr"] = "127.0.0.1"; + clientJson["local_port"] = 1080; clientJson["remote_addr"] = ReceiveConfigurationParameters[4]; - clientJson["remote_port"] = int.Parse(ReceiveConfigurationParameters[1]); + clientJson["remote_port"] = 443; clientJson["password"][0] = ReceiveConfigurationParameters[2]; - using (StreamWriter sw = new StreamWriter(@"trojan_config\config.json")) + using (StreamWriter sw = new StreamWriter(@"trojan-go_config\config.json")) { sw.Write(clientJson.ToString()); } @@ -2448,7 +2484,7 @@ namespace ProxySU //显示服务端连接参数 //MessageBox.Show("用于Trojan官方客户端的配置文件已保存在config文件夹中"); - TrojanResultClientInfoWindow resultClientInformation = new TrojanResultClientInfoWindow(); + TrojanGoResultClientInfoWindow resultClientInformation = new TrojanGoResultClientInfoWindow(); resultClientInformation.ShowDialog(); return; @@ -2913,41 +2949,41 @@ namespace ProxySU Thread.Sleep(1000); //优化网络参数 - sshCmd = @"bash - c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); sshCmd = @"sysctl -p"; client.RunCommand(sshCmd); @@ -2966,8 +3002,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) { - client.RunCommand(@"bash - c 'echo ""net.core.default_qdisc = fq"" >> /etc/sysctl.conf'"); - client.RunCommand(@"bash - c 'echo ""net.ipv4.tcp_congestion_control = bbr"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); client.RunCommand(@"sysctl -p"); } @@ -3625,6 +3661,202 @@ namespace ProxySU } #endregion + } + //检测升级Trojan-Go版本 + private void ButtonUpdateTrojanGo_Click(object sender, RoutedEventArgs e) + { + ConnectionInfo connectionInfo = GenerateConnectionInfo(); + if (connectionInfo == null) + { + MessageBox.Show("远程主机连接信息有误,请检查"); + return; + } + + Thread thread = new Thread(() => UpdateTojanGo(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing)); + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + } + //升级Trojan主程序 + private void UpdateTojanGo(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar) + { + string currentStatus = "正在登录远程主机......"; + Action updateAction = new Action(UpdateTextBlock); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + + try + { + #region 主机指纹,暂未启用 + //byte[] expectedFingerPrint = new byte[] { + // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, + // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b + // }; + #endregion + using (var client = new SshClient(connectionInfo)) + + { + #region ssh登录验证主机指纹代码块,暂未启用 + // client.HostKeyReceived += (sender, e) => + // { + // if (expectedFingerPrint.Length == e.FingerPrint.Length) + // { + // for (var i = 0; i < expectedFingerPrint.Length; i++) + // { + // if (expectedFingerPrint[i] != e.FingerPrint[i]) + // { + // e.CanTrust = false; + // break; + // } + // } + // } + // else + // { + // e.CanTrust = false; + // } + // }; + #endregion + + client.Connect(); + if (client.IsConnected == true) + { + currentStatus = "主机登录成功"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + } + //检测是否运行在root权限下 + string testRootAuthority = client.RunCommand(@"id -u").Result; + if (testRootAuthority.Equals("0\n") == false) + { + MessageBox.Show("请使用具有root权限的账户登录主机!!"); + client.Disconnect(); + return; + } + //检测远程主机V2ray版本 + currentStatus = "检测远程主机Trojan-Go版本......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + + string cmdTestTrojanInstalled = @"find / -name trojan-go"; + //MessageBox.Show(cmdTestV2rayInstalled); + string resultCmdTestTrojanInstalled = client.RunCommand(cmdTestTrojanInstalled).Result; + //client.Disconnect(); + //MessageBox.Show(resultCmdTestV2rayInstalled); + if (resultCmdTestTrojanInstalled.Contains("/usr/bin/trojan-go/trojan-go") == false) + { + MessageBoxResult messageBoxResult = MessageBox.Show("远程主机未安装Trojan-Go!"); + + currentStatus = "未安装Trojan-Go,退出"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + client.Disconnect(); + return; + + } + string sshcmd; + sshcmd = @"echo ""$(/usr/bin/trojan-go/trojan-go -version)"" | head -n 1 | cut -d "" "" -f2"; + //MessageBox.Show(sshcmd); + string trojanCurrentVersion = client.RunCommand(sshcmd).Result;//含字母v + //MessageBox.Show(v2rayCurrentVersion); + + sshcmd = @"curl -s https://api.github.com/repos/p4gefau1t/trojan-go/tags | grep 'name' | cut -d\"" -f4 | head -1"; + //MessageBox.Show(sshcmd); + + string trojanNewVersion = client.RunCommand(sshcmd).Result;//含字母v + //MessageBox.Show(v2rayNewVersion); + if (trojanNewVersion.Equals(trojanCurrentVersion) == false) + { + MessageBoxResult messageBoxResult = MessageBox.Show($"远程主机当前版本为:v{trojanCurrentVersion}\n最新版本为:{trojanNewVersion}\n是否升级为最新版本?", "", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (messageBoxResult == MessageBoxResult.No) + { + currentStatus = "升级取消,退出"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + client.Disconnect(); + return; + } + else + { + currentStatus = "正在升级Trojan-Go到最新版本......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + + //备份配置文件 + //sshcmd = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.bak"; + //client.RunCommand(sshcmd); + //升级Trojan-Go主程序 + client.RunCommand("curl -o /tmp/trojan-go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"); + client.RunCommand("bash /tmp/trojan-go.sh -f"); + sshcmd = @"curl -s https://api.github.com/repos/p4gefau1t/trojan-go/tags | grep 'name' | cut -d\"" -f4 | head -1"; + //MessageBox.Show(sshcmd); + trojanCurrentVersion = client.RunCommand(sshcmd).Result;//含字母v + if (trojanNewVersion.Equals(trojanCurrentVersion) == true) + { + //恢复原来的配置文件备份 + //sshcmd = @"rm -f /usr/local/etc/trojan/config.json"; + //client.RunCommand(sshcmd); + //sshcmd = @"mv /usr/local/etc/trojan/config.json.bak /usr/local/etc/trojan/config.json"; + //client.RunCommand(sshcmd); + MessageBox.Show($"升级成功!!\n当前版本为:v{trojanCurrentVersion}\n最新版本为:{trojanNewVersion}"); + currentStatus = "升级成功!当前已是最新版本!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + } + else + { + MessageBox.Show("升级失败,原因未知,请向开发者提问,以寻求支持!"); + currentStatus = "升级失败!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + } + } + } + else + { + MessageBox.Show($"远程主机当前已是最新版本:{trojanNewVersion}\n无需升级!"); + currentStatus = "已是最新版本,无需升级,退出"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + Thread.Sleep(1000); + } + + client.Disconnect(); + return; + } + } + catch (Exception ex1)//例外处理 + #region 例外处理 + { + //MessageBox.Show(ex1.Message); + if (ex1.Message.Contains("连接尝试失败") == true) + { + MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); + } + + else if (ex1.Message.Contains("denied (password)") == true) + { + MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); + } + else if (ex1.Message.Contains("Invalid private key file") == true) + { + MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); + } + else if (ex1.Message.Contains("denied (publickey)") == true) + { + MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); + } + else if (ex1.Message.Contains("目标计算机积极拒绝") == true) + { + MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); + } + else + { + MessageBox.Show("发生错误"); + MessageBox.Show(ex1.Message); + } + currentStatus = "主机登录失败"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + + } + #endregion + } //生成三合一的v2ray路径 @@ -4225,8 +4457,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) { - client.RunCommand(@"bash - c 'echo ""net.core.default_qdisc = fq"" >> /etc/sysctl.conf'"); - client.RunCommand(@"bash - c 'echo ""net.ipv4.tcp_congestion_control = bbr"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); + client.RunCommand(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); client.RunCommand(@"sysctl -p"); } resultCmdTestBBR = client.RunCommand(@"sysctl net.ipv4.tcp_congestion_control | grep bbr").Result; @@ -4247,41 +4479,41 @@ namespace ProxySU textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); Thread.Sleep(1000); //优化网络参数 - sshCmd = @"bash - c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); - sshCmd = @"bash - c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'"; + sshCmd = @"bash -c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'"; client.RunCommand(sshCmd); sshCmd = @"sysctl -p"; client.RunCommand(sshCmd); diff --git a/ProxySU/Properties/AssemblyInfo.cs b/ProxySU/Properties/AssemblyInfo.cs index 34e53bb..a5ff342 100644 --- a/ProxySU/Properties/AssemblyInfo.cs +++ b/ProxySU/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ using System.Windows; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.4.0")] -[assembly: AssemblyFileVersion("1.6.4.0")] +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] diff --git a/ProxySU/ProxySU.csproj b/ProxySU/ProxySU.csproj index 43271eb..8febe77 100644 --- a/ProxySU/ProxySU.csproj +++ b/ProxySU/ProxySU.csproj @@ -93,6 +93,12 @@ TemplateConfiguration.xaml + + TrojanGoResultClientInfoWindow.xaml + + + TrojanGoTemplateWindow.xaml + TrojanResultClientInfoWindow.xaml @@ -127,6 +133,14 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/ProxySU/ResultClientInformation.xaml b/ProxySU/ResultClientInformation.xaml index 20d53b7..ebb4d60 100644 --- a/ProxySU/ResultClientInformation.xaml +++ b/ProxySU/ResultClientInformation.xaml @@ -78,7 +78,7 @@ - + diff --git a/ProxySU/ResultClientInformation.xaml.cs b/ProxySU/ResultClientInformation.xaml.cs index e8bd9b1..5c87506 100644 --- a/ProxySU/ResultClientInformation.xaml.cs +++ b/ProxySU/ResultClientInformation.xaml.cs @@ -361,15 +361,16 @@ namespace ProxySU sw.WriteLine("下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。"); sw.WriteLine("-----------------------------------------"); sw.WriteLine("QR.bmp"); - sw.WriteLine("此文件为v2rayN、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点"); + sw.WriteLine("此文件为v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点"); sw.WriteLine("v2rayN下载网址:https://github.com/2dust/v2rayN/releases"); + sw.WriteLine("Trojan-QT5:https://github.com/Trojan-Qt5/Trojan-Qt5"); sw.WriteLine("v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases"); sw.WriteLine("v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang"); sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); sw.WriteLine("-----------------------------------------"); sw.WriteLine("url.txt"); - sw.WriteLine("此文件为v2rayN、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址"); + sw.WriteLine("此文件为v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址"); sw.WriteLine("-----------------------------------------\n"); sw.WriteLine("服务器通用连接配置参数"); sw.WriteLine($"地址(address):{TextBoxHostAddress.Text}"); diff --git a/ProxySU/TrojanGoResultClientInfoWindow.xaml b/ProxySU/TrojanGoResultClientInfoWindow.xaml new file mode 100644 index 0000000..7e185ea --- /dev/null +++ b/ProxySU/TrojanGoResultClientInfoWindow.xaml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProxySU/TrojanGoResultClientInfoWindow.xaml.cs b/ProxySU/TrojanGoResultClientInfoWindow.xaml.cs new file mode 100644 index 0000000..619585e --- /dev/null +++ b/ProxySU/TrojanGoResultClientInfoWindow.xaml.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.IO; +using Renci.SshNet; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using System.Drawing; +using QRCoder; + +namespace ProxySU +{ + /// + /// TrojanGoResultClientInfoWindow.xaml 的交互逻辑 + /// + public partial class TrojanGoResultClientInfoWindow : Window + { + private string saveFileFolder = ""; + public TrojanGoResultClientInfoWindow() + { + InitializeComponent(); + TextBoxTrojanGoWSPath.Visibility = Visibility.Hidden; + TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Hidden; + TextBlockTrojanGoCaption.Visibility = Visibility.Hidden; + //主机地址 + TextBoxTrojanServerHost.Text = MainWindow.ReceiveConfigurationParameters[4]; + //主机端口 + TextBoxTrojanServerPort.Text = "443"; + //密钥(uuid) + TextBoxTrojanServerPassword.Text = MainWindow.ReceiveConfigurationParameters[2]; + //WebSocket路径 + if (MainWindow.ReceiveConfigurationParameters[0].Equals("TrojanGoWebSocketTLS2Web")) + { + TextBoxTrojanGoWSPath.Text = MainWindow.ReceiveConfigurationParameters[3]; + TextBoxTrojanGoWSPath.Visibility = Visibility.Visible; + TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Visible; + TextBlockTrojanGoCaption.Visibility = Visibility.Visible; + + } + + GenerateV2rayShareQRcodeAndBase64Url(); + } + private void GenerateV2rayShareQRcodeAndBase64Url() + { + + string saveFileFolderFirst = TextBoxTrojanServerHost.Text; + int num = 1; + saveFileFolder = saveFileFolderFirst; + CheckDir("trojan-go_config"); + while (Directory.Exists(@"trojan-go_config\" + saveFileFolder)) + { + saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); + num++; + } + CheckDir(@"trojan-go_config\" + saveFileFolder); + string trojanUrl = $"trojan://{TextBoxTrojanServerPassword.Text}@{TextBoxTrojanServerHost.Text}:{TextBoxTrojanServerPort.Text}?allowinsecure=0&tfo=0&sni=&mux=0&ws=0&group=#{TextBoxTrojanServerHost.Text}"; + //MessageBox.Show(v2rayNjsonObject.ToString()); + //string trojanUrl = "trojan://" + ToBase64Encode(v2rayNjsonObject.ToString()); + TextBoxTrojanUrl.Text = trojanUrl; + using (StreamWriter sw = new StreamWriter($"trojan-go_config\\{saveFileFolder}\\url.txt")) + { + sw.WriteLine(trojanUrl); + + } + CreateQRCode(trojanUrl); + + //移动Trojan官方程序配置文件到相应目录 + if (File.Exists(@"trojan-go_config\config.json")) + { + File.Move(@"trojan-go_config\config.json", @"trojan-go_config\" + saveFileFolder + @"\config.json"); + //File.Delete(@"config\config.json");//删除该文件 + } + + using (StreamWriter sw = new StreamWriter($"trojan-go_config\\{saveFileFolder}\\说明.txt")) + { + sw.WriteLine("config.json"); + sw.WriteLine("此文件为Trojan-go官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080"); + sw.WriteLine("Trojan-go官方网站:https://github.com/p4gefau1t/trojan-go"); + sw.WriteLine("Trojan-go官方程序下载地址:https://github.com/p4gefau1t/trojan-go/releases"); + sw.WriteLine("下载相应版本,Windows选择Trojan-x.xx-win.zip,解压后提取trojan.exe。与config.json放在同一目录,运行trojan.exe即可。"); + sw.WriteLine("-----------------------------------------\n"); + sw.WriteLine("QR.bmp"); + sw.WriteLine("此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点(Trojan-Go的WebSocket模式暂不支持)"); + sw.WriteLine("Trojan-QT5 (windows)下载网址:https://github.com/TheWanderingCoel/Trojan-Qt5/releases"); + sw.WriteLine("igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases"); + sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); + + sw.WriteLine("-----------------------------------------\n"); + sw.WriteLine("url.txt"); + sw.WriteLine("此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)复制粘贴导入节点的网址(Trojan-Go的WebSocket模式暂不支持)"); + sw.WriteLine("-----------------------------------------\n"); + sw.WriteLine("服务器通用连接配置参数"); + sw.WriteLine($"地址(address):{TextBoxTrojanServerHost.Text}"); + sw.WriteLine($"端口(Port):{TextBoxTrojanServerPort.Text}"); + sw.WriteLine($"密钥:{TextBoxTrojanServerPassword.Text}"); + sw.WriteLine($"WebSocket路径:{TextBoxTrojanGoWSPath.Text}"); + + } + + + + } + //生成base64 + //private string ToBase64Encode(string text) + //{ + // if (String.IsNullOrEmpty(text)) + // { + // return text; + // } + + // byte[] textBytes = Encoding.UTF8.GetBytes(text); + // return Convert.ToBase64String(textBytes); + //} + + //生成QRcoder图片 + private void CreateQRCode(string varBase64) + { + //string varBase64 = varBase64; + QRCodeGenerator qrGenerator = new QRCodeGenerator(); + QRCodeData qrCodeData = qrGenerator.CreateQrCode(varBase64, QRCodeGenerator.ECCLevel.Q); + QRCode qrCode = new QRCode(qrCodeData); + Bitmap qrCodeImage = qrCode.GetGraphic(20); + IntPtr myImagePtr = qrCodeImage.GetHbitmap(); + BitmapSource imgsource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(myImagePtr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); + ImageTrojanShareQRurl.Source = imgsource; + //DeleteObject(myImagePtr); + qrCodeImage.Save($"trojan-go_config\\{saveFileFolder}\\QR.bmp"); + + } + //判断目录是否存在,不存在则创建 + private static bool CheckDir(string folder) + { + try + { + if (!Directory.Exists(folder))//如果不存在就创建file文件夹 + Directory.CreateDirectory(folder);//创建该文件夹   + return true; + } + catch (Exception) + { + return false; + } + } + private void ButtonTrojanResultOpen_Click(object sender, RoutedEventArgs e) + { + string openFolderPath = @"trojan-go_config\" + saveFileFolder; + System.Diagnostics.Process.Start("explorer.exe", openFolderPath); + this.Close(); + } + } +} diff --git a/ProxySU/TrojanGoTemplateWindow.xaml b/ProxySU/TrojanGoTemplateWindow.xaml new file mode 100644 index 0000000..c7f5667 --- /dev/null +++ b/ProxySU/TrojanGoTemplateWindow.xaml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProxySU/TrojanGoTemplateWindow.xaml.cs b/ProxySU/TrojanGoTemplateWindow.xaml.cs new file mode 100644 index 0000000..12c9cc3 --- /dev/null +++ b/ProxySU/TrojanGoTemplateWindow.xaml.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace ProxySU +{ + /// + /// TrojanGoTemplateWindow.xaml 的交互逻辑 + /// + public partial class TrojanGoTemplateWindow : Window + { + public TrojanGoTemplateWindow() + { + InitializeComponent(); + RadioButtonTrojanGoTLS2Web.IsChecked = true; + } + private void ButtondDecide_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrEmpty(TextBoxDomain.Text.ToString()) == true) + { + MessageBox.Show("域名不能为空!"); + return; + } + //传递域名 + MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomain.Text.ToString(); + //处理伪装网站域名中的前缀 + MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.ToString(); + + if (TextBoxMaskSites.Text.ToString().Length >= 7) + { + string testDomain = TextBoxMaskSites.Text.Substring(0, 7); + if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://")) + { + //MessageBox.Show(testDomain); + MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/"); + } + else + { + MainWindow.ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxMaskSites.Text; + } + } + + //传递服务端口 + MainWindow.ReceiveConfigurationParameters[1] = "443"; + //传递密码(uuid) + MainWindow.ReceiveConfigurationParameters[2] = TextBoxNewUUID.Text.ToString(); + if (RadioButtonTrojanGoTLS2Web.IsChecked == true) + { + //传递模板类型 + MainWindow.ReceiveConfigurationParameters[0] = "TrojanGoTLS2Web"; + } + else if (RadioButtonTrojanGoWebSocketTLS2Web.IsChecked == true) + { + //传递模板类型 + MainWindow.ReceiveConfigurationParameters[0] = "TrojanGoWebSocketTLS2Web"; + MainWindow.ReceiveConfigurationParameters[3] = TextBoxPath.Text; + } + + this.Close(); + } + //更新密码 + private void ButtonNewUUID_Click(object sender, RoutedEventArgs e) + { + Guid uuid = Guid.NewGuid(); + TextBoxNewUUID.Text = uuid.ToString(); + } + //更新路径 + private void ButtonPath_Click(object sender, RoutedEventArgs e) + { + Random random = new Random(); + int randomSerialNum = random.Next(0, 4); + Guid uuid = Guid.NewGuid(); + string[] pathArray = uuid.ToString().Split('-'); + string path = pathArray[randomSerialNum]; + TextBoxPath.Text = $"/{path}"; + //MessageBox.Show(path); + } + //private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) + //{ + // Random random = new Random(); + // int randomServerPort = random.Next(10000, 50000); + // TextBoxServerListenPort.Text = randomServerPort.ToString(); + //} + private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close(); + + private void RadioButtonTrojanTLS2Web_Checked(object sender, RoutedEventArgs e) + { + Guid uuid = Guid.NewGuid(); + TextBoxNewUUID.Text = uuid.ToString(); + TextBlockPath.Visibility = Visibility.Collapsed; + TextBoxPath.Visibility = Visibility.Collapsed; + ButtonPath.Visibility = Visibility.Collapsed; + //Random random = new Random(); + //int randomServerPort = random.Next(10000, 50000); + //TextBoxServerListenPort.Text = "443"; + } + private void RadioButtonTrojanGoWebSocketTLS2Web_Checked(object sender, RoutedEventArgs e) + { + Guid uuid = Guid.NewGuid(); + TextBoxNewUUID.Text = uuid.ToString(); + TextBlockPath.Visibility = Visibility.Visible; + TextBoxPath.Visibility = Visibility.Visible; + ButtonPath.Visibility = Visibility.Visible; + TextBoxPath.Text = "/trojan"; + } + + + + } +} diff --git a/ProxySU/TrojanResultClientInfoWindow.xaml b/ProxySU/TrojanResultClientInfoWindow.xaml index 87ec6fc..915b6ae 100644 --- a/ProxySU/TrojanResultClientInfoWindow.xaml +++ b/ProxySU/TrojanResultClientInfoWindow.xaml @@ -39,6 +39,9 @@ + diff --git a/ProxySU/TrojanResultClientInfoWindow.xaml.cs b/ProxySU/TrojanResultClientInfoWindow.xaml.cs index 52e318e..a1080f6 100644 --- a/ProxySU/TrojanResultClientInfoWindow.xaml.cs +++ b/ProxySU/TrojanResultClientInfoWindow.xaml.cs @@ -29,13 +29,25 @@ namespace ProxySU public TrojanResultClientInfoWindow() { InitializeComponent(); + //TextBoxTrojanGoWSPath.Visibility = Visibility.Hidden; + //TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Hidden; + //TextBlockTrojanGoCaption.Visibility = Visibility.Hidden; //主机地址 TextBoxTrojanServerHost.Text = MainWindow.ReceiveConfigurationParameters[4]; //主机端口 - TextBoxTrojanServerPort.Text = MainWindow.ReceiveConfigurationParameters[1]; + TextBoxTrojanServerPort.Text = "443"; //密钥(uuid) TextBoxTrojanServerPassword.Text = MainWindow.ReceiveConfigurationParameters[2]; + //WebSocket路径 + //if (MainWindow.ReceiveConfigurationParameters[0].Equals("TrojanGoWebSocketTLS2Web")) + //{ + // TextBoxTrojanGoWSPath.Text = MainWindow.ReceiveConfigurationParameters[3]; + // TextBoxTrojanGoWSPath.Visibility = Visibility.Visible; + // TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Visible; + // TextBlockTrojanGoCaption.Visibility = Visibility.Visible; + //} + GenerateV2rayShareQRcodeAndBase64Url(); } diff --git a/ProxySU/TrojanTemplateWindow.xaml b/ProxySU/TrojanTemplateWindow.xaml index 63bd780..0d05b5d 100644 --- a/ProxySU/TrojanTemplateWindow.xaml +++ b/ProxySU/TrojanTemplateWindow.xaml @@ -73,15 +73,16 @@ + - + - - - - + + + + diff --git a/ProxySU/TrojanTemplateWindow.xaml.cs b/ProxySU/TrojanTemplateWindow.xaml.cs index e0f9e99..8fc7b91 100644 --- a/ProxySU/TrojanTemplateWindow.xaml.cs +++ b/ProxySU/TrojanTemplateWindow.xaml.cs @@ -54,7 +54,7 @@ namespace ProxySU } } //传递服务端口 - MainWindow.ReceiveConfigurationParameters[1] = TextBoxServerListenPort.Text.ToString(); + MainWindow.ReceiveConfigurationParameters[1] = "443"; //传递密码(uuid) MainWindow.ReceiveConfigurationParameters[2] = TextBoxNewUUID.Text.ToString(); } @@ -67,12 +67,12 @@ namespace ProxySU Guid uuid = Guid.NewGuid(); TextBoxNewUUID.Text = uuid.ToString(); } - private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) - { - Random random = new Random(); - int randomServerPort = random.Next(10000, 50000); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - } + //private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) + //{ + // Random random = new Random(); + // int randomServerPort = random.Next(10000, 50000); + // TextBoxServerListenPort.Text = randomServerPort.ToString(); + //} private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close(); private void RadioButtonTrojanTLS2Web_Checked(object sender, RoutedEventArgs e) @@ -81,7 +81,7 @@ namespace ProxySU TextBoxNewUUID.Text = uuid.ToString(); //Random random = new Random(); //int randomServerPort = random.Next(10000, 50000); - TextBoxServerListenPort.Text = "443"; + //TextBoxServerListenPort.Text = "443"; } } } diff --git a/ProxySU/bin/Beta/Beta.zip b/ProxySU/bin/Beta/Beta.zip index 91faeca1967c71ce35efbcb62976a26d00b65d18..7402aade6914a064e6a144fb56d7a34bbe13d0b2 100644 GIT binary patch delta 47280 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 diff --git a/TemplateConfg/trojan-go_all_config.json b/TemplateConfg/trojan-go_all_config.json new file mode 100644 index 0000000..5a31b5e --- /dev/null +++ b/TemplateConfg/trojan-go_all_config.json @@ -0,0 +1,113 @@ +{ + "run_type": "", + "local_addr": "", + "local_port": "", + "remote_addr": "", + "remote_port": "", + "log_level": 1, + "log_file": "", + "password": [ + "" + ], + "buffer_size": 32, + "dns": [], + "disable_http_check": false, + "ssl": { + "verify": true, + "verify_hostname": true, + "cert": "", + "key": "", + "key_password": "", + "cipher": "", + "cipher_tls13": "", + "curves": "", + "prefer_server_cipher": false, + "sni": "", + "alpn": [ + "http/1.1" + ], + "session_ticket": true, + "reuse_session": true, + "plain_http_response": "", + "fallback_port": 0, + "fingerprint": "firefox", + "serve_plain_text": false + }, + "tcp": { + "no_delay": true, + "keep_alive": true, + "reuse_port": false, + "prefer_ipv4": false, + "fast_open": false, + "fast_open_qlen": 20 + }, + "mux": { + "enabled": false, + "concurrency": 8, + "idle_timeout": 60 + }, + "router": { + "enabled": false, + "bypass": [], + "proxy": [], + "block": [], + "default_policy": "proxy", + "domain_strategy": "as_is", + "geoip": "./geoip.dat", + "geosite": "./geosite.dat" + }, + "websocket": { + "enabled": false, + "path": "", + "hostname": "", + "obfuscation_password": "", + "double_tls": true, + "ssl": { + "verify": true, + "verify_hostname": true, + "cert": "", + "key": "", + "key_password": "", + "prefer_server_cipher": false, + "sni": "", + "session_ticket": true, + "reuse_session": true, + "plain_http_response": "", + "key_log": "" + } + }, + "forward_proxy": { + "enabled": false, + "proxy_addr": "", + "proxy_port": 0, + "username": "", + "password": "" + }, + "mysql": { + "enabled": false, + "server_addr": "localhost", + "server_port": 3306, + "database": "", + "username": "", + "password": "", + "check_rate": 60 + }, + "redis": { + "enabled": false, + "server_addr": "localhost", + "server_port": 6379, + "password": "" + }, + "api": { + "enabled": false, + "api_addr": "", + "api_port": 0, + "api_tls": false, + "ssl": { + "cert": "", + "key": "", + "key_password": "", + "client_cert": [] + } + } +} \ No newline at end of file