From 69cbdbd20e3b4f11994166df932d3cba98676909 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 14 Jan 2024 17:33:41 +0800 Subject: [PATCH] Added Wireguard support (using sing-box) --- v2rayN/v2rayN/Global.cs | 6 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 32 ++++++++ v2rayN/v2rayN/Handler/CoreConfigSingbox.cs | 13 +++ v2rayN/v2rayN/Handler/CoreConfigV2ray.cs | 6 +- v2rayN/v2rayN/Handler/CoreHandler.cs | 2 +- v2rayN/v2rayN/Handler/ProxySetting.cs | 3 +- v2rayN/v2rayN/Mode/EConfigType.cs | 3 +- v2rayN/v2rayN/Mode/ProfileItem.cs | 12 +-- v2rayN/v2rayN/Mode/SingboxConfig.cs | 7 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 36 +++++++++ v2rayN/v2rayN/Resx/ResUI.resx | 12 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 12 +++ .../v2rayN/ViewModels/AddServerViewModel.cs | 4 + .../v2rayN/ViewModels/MainWindowViewModel.cs | 8 +- .../ViewModels/OptionSettingViewModel.cs | 3 +- v2rayN/v2rayN/Views/AddServerWindow.xaml | 79 ++++++++++++++++++- v2rayN/v2rayN/Views/AddServerWindow.xaml.cs | 17 ++++ v2rayN/v2rayN/Views/MainWindow.xaml | 5 ++ v2rayN/v2rayN/Views/MainWindow.xaml.cs | 1 + .../v2rayN/Views/OptionSettingWindow.xaml.cs | 1 - 20 files changed, 239 insertions(+), 23 deletions(-) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index ea7fe878..70f6a3af 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -138,7 +138,8 @@ namespace v2rayN {EConfigType.VLESS,"vless://"}, {EConfigType.Trojan,"trojan://"}, {EConfigType.Hysteria2,"hysteria2://"}, - {EConfigType.Tuic,"tuic://"} + {EConfigType.Tuic,"tuic://"}, + {EConfigType.Wireguard,"wireguard://"} }; public static readonly Dictionary ProtocolTypes = new() @@ -149,7 +150,8 @@ namespace v2rayN {EConfigType.VLESS,"vless"}, {EConfigType.Trojan,"trojan"}, {EConfigType.Hysteria2,"hysteria2"}, - {EConfigType.Tuic,"tuic"} + {EConfigType.Tuic,"tuic"}, + {EConfigType.Wireguard,"wireguard"} }; public static readonly List VmessSecuritys = new() { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 50e8c4a3..8185d0e5 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -768,6 +768,34 @@ namespace v2rayN.Handler return 0; } + /// + /// Add or edit server + /// + /// + /// + /// + public static int AddWireguardServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.configType = EConfigType.Wireguard; + profileItem.coreType = ECoreType.sing_box; + + profileItem.address = profileItem.address.TrimEx(); + profileItem.id = profileItem.id.TrimEx(); + profileItem.publicKey = profileItem.publicKey.TrimEx(); + profileItem.path = profileItem.path.TrimEx(); + profileItem.requestHost = profileItem.requestHost.TrimEx(); + profileItem.network = string.Empty; + + if (profileItem.id.IsNullOrEmpty()) + { + return -1; + } + + AddServerCommon(config, profileItem, toFile); + + return 0; + } + public static int SortServers(Config config, string subId, string colName, bool asc) { var lstModel = LazyConfig.Instance.ProfileItems(subId, ""); @@ -1125,6 +1153,10 @@ namespace v2rayN.Handler { addStatus = AddTuicServer(config, profileItem, false); } + else if (profileItem.configType == EConfigType.Wireguard) + { + addStatus = AddWireguardServer(config, profileItem, false); + } if (addStatus == 0) { diff --git a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs index 7b8c4438..efe86502 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs @@ -181,6 +181,8 @@ namespace v2rayN.Handler tunInbound.mtu = _config.tunModeItem.mtu; tunInbound.strict_route = _config.tunModeItem.strictRoute; tunInbound.stack = _config.tunModeItem.stack; + tunInbound.sniff = _config.inbound[0].sniffingEnabled; + tunInbound.sniff_override_destination = _config.inbound[0].routeOnly ? false : _config.inbound[0].sniffingEnabled; if (_config.tunModeItem.enableIPv6Address == false) { tunInbound.inet6_address = null; @@ -296,6 +298,17 @@ namespace v2rayN.Handler GenOutboundMux(node, outbound); } + else if (node.configType == EConfigType.Wireguard) + { + outbound.type = Global.ProtocolTypes[EConfigType.Wireguard]; + + outbound.private_key = node.id; + outbound.peer_public_key = node.publicKey; + outbound.reserved = Utils.String2List(node.path).Select(int.Parse).ToArray(); + outbound.local_address = [.. Utils.String2List(node.requestHost)]; + + GenOutboundMux(node, outbound); + } GenOutboundTls(node, outbound); diff --git a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs index 18b8a6f8..d32e3440 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs @@ -846,7 +846,8 @@ namespace v2rayN.Handler if (prevNode is not null && prevNode.configType != EConfigType.Custom && prevNode.configType != EConfigType.Hysteria2 - && prevNode.configType != EConfigType.Tuic) + && prevNode.configType != EConfigType.Tuic + && prevNode.configType != EConfigType.Wireguard) { var prevOutbound = JsonUtils.Deserialize(txtOutbound); GenOutbound(prevNode, prevOutbound); @@ -864,7 +865,8 @@ namespace v2rayN.Handler if (nextNode is not null && nextNode.configType != EConfigType.Custom && nextNode.configType != EConfigType.Hysteria2 - && nextNode.configType != EConfigType.Tuic) + && nextNode.configType != EConfigType.Tuic + && nextNode.configType != EConfigType.Wireguard) { var nextOutbound = JsonUtils.Deserialize(txtOutbound); GenOutbound(nextNode, nextOutbound); diff --git a/v2rayN/v2rayN/Handler/CoreHandler.cs b/v2rayN/v2rayN/Handler/CoreHandler.cs index f30924e4..ff30ab8b 100644 --- a/v2rayN/v2rayN/Handler/CoreHandler.cs +++ b/v2rayN/v2rayN/Handler/CoreHandler.cs @@ -70,7 +70,7 @@ namespace v2rayN.Handler public int LoadCoreConfigSpeedtest(List selecteds) { int pid = -1; - var coreType = selecteds.Exists(t => t.configType == EConfigType.Hysteria2 || t.configType == EConfigType.Tuic) ? ECoreType.sing_box : ECoreType.Xray; + var coreType = selecteds.Exists(t => t.configType == EConfigType.Hysteria2 || t.configType == EConfigType.Tuic || t.configType == EConfigType.Wireguard) ? ECoreType.sing_box : ECoreType.Xray; string configPath = Utils.GetConfigPath(Global.CoreSpeedtestConfigFileName); if (CoreConfigHandler.GenerateClientSpeedtestConfig(_config, configPath, selecteds, coreType, out string msg) != 0) { diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs index 1e7c17c9..9f01c31f 100644 --- a/v2rayN/v2rayN/Handler/ProxySetting.cs +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -1,5 +1,4 @@ -using Microsoft.Win32; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using static v2rayN.Handler.ProxySetting.InternetConnectionOption; namespace v2rayN.Handler diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs index 090250ab..aff401aa 100644 --- a/v2rayN/v2rayN/Mode/EConfigType.cs +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -9,6 +9,7 @@ VLESS = 5, Trojan = 6, Hysteria2 = 7, - Tuic = 8 + Tuic = 8, + Wireguard = 9 } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Mode/ProfileItem.cs b/v2rayN/v2rayN/Mode/ProfileItem.cs index 999901db..797587e5 100644 --- a/v2rayN/v2rayN/Mode/ProfileItem.cs +++ b/v2rayN/v2rayN/Mode/ProfileItem.cs @@ -47,18 +47,12 @@ namespace v2rayN.Mode } switch (configType) { - case EConfigType.VMess: - case EConfigType.Shadowsocks: - case EConfigType.Socks: - case EConfigType.VLESS: - case EConfigType.Trojan: - case EConfigType.Hysteria2: - case EConfigType.Tuic: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); + case EConfigType.Custom: + summary += string.Format("{0}", remarks); break; default: - summary += string.Format("{0}", remarks); + summary += string.Format("{0}({1}:{2})", remarks, addr, port); break; } return summary; diff --git a/v2rayN/v2rayN/Mode/SingboxConfig.cs b/v2rayN/v2rayN/Mode/SingboxConfig.cs index 07832fb1..8253f4ed 100644 --- a/v2rayN/v2rayN/Mode/SingboxConfig.cs +++ b/v2rayN/v2rayN/Mode/SingboxConfig.cs @@ -112,7 +112,12 @@ public string congestion_control { get; set; } public string? version { get; set; } public string? network { get; set; } - public string packet_encoding { get; set; } + public string? packet_encoding { get; set; } + public string[]? local_address { get; set; } + public string? private_key { get; set; } + public string? peer_public_key { get; set; } + public int[]? reserved { get; set; } + public int? mtu { get; set; } public Tls4Sbox tls { get; set; } public Multiplex4Sbox multiplex { get; set; } public Transport4Sbox transport { get; set; } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 0502e160..35d926d5 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -699,6 +699,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Add [Wireguard] server 的本地化字符串。 + /// + public static string menuAddWireguardServer { + get { + return ResourceManager.GetString("menuAddWireguardServer", resourceCulture); + } + } + /// /// 查找类似 Check Update 的本地化字符串。 /// @@ -2140,6 +2149,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Address(Ip,Ipv6) 的本地化字符串。 + /// + public static string TbLocalAddress { + get { + return ResourceManager.GetString("TbLocalAddress", resourceCulture); + } + } + /// /// 查找类似 Transport protocol(network) 的本地化字符串。 /// @@ -2185,6 +2203,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 PrivateKey 的本地化字符串。 + /// + public static string TbPrivateKey { + get { + return ResourceManager.GetString("TbPrivateKey", resourceCulture); + } + } + /// /// 查找类似 PublicKey 的本地化字符串。 /// @@ -2212,6 +2239,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Reserved(2,3,4) 的本地化字符串。 + /// + public static string TbReserved { + get { + return ResourceManager.GetString("TbReserved", resourceCulture); + } + } + /// /// 查找类似 Reset 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index e33aebf0..962c9de4 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -1168,4 +1168,16 @@ Enable IPv6 Address + + Add [Wireguard] server + + + PrivateKey + + + Reserved(2,3,4) + + + Address(Ip,Ipv6) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 5fbeefcc..e9fd31bf 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -1165,4 +1165,16 @@ 启用IPv6 + + 添加[Wireguard]服务器 + + + PrivateKey + + + Reserved(2,3,4) + + + Address(Ip,Ipv6) + \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs index 19b7cd2d..6660bc2e 100644 --- a/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs @@ -152,6 +152,10 @@ namespace v2rayN.ViewModels case EConfigType.Tuic: ret = ConfigHandler.AddTuicServer(_config, item); break; + + case EConfigType.Wireguard: + ret = ConfigHandler.AddWireguardServer(_config, item); + break; } if (ret == 0) diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 51adc658..c0122284 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -88,6 +88,7 @@ namespace v2rayN.ViewModels public ReactiveCommand AddTrojanServerCmd { get; } public ReactiveCommand AddHysteria2ServerCmd { get; } public ReactiveCommand AddTuicServerCmd { get; } + public ReactiveCommand AddWireguardServerCmd { get; } public ReactiveCommand AddCustomServerCmd { get; } public ReactiveCommand AddServerViaClipboardCmd { get; } public ReactiveCommand AddServerViaScanCmd { get; } @@ -347,6 +348,10 @@ namespace v2rayN.ViewModels { EditServer(true, EConfigType.Tuic); }); + AddWireguardServerCmd = ReactiveCommand.Create(() => + { + EditServer(true, EConfigType.Wireguard); + }); AddCustomServerCmd = ReactiveCommand.Create(() => { EditServer(true, EConfigType.Custom); @@ -1390,7 +1395,8 @@ namespace v2rayN.ViewModels { Process.Start(startInfo); MyAppExit(false); - } catch { } + } + catch { } } private void ImportOldGuiConfig() diff --git a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index 1c1a2423..da871a2f 100644 --- a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -372,8 +372,7 @@ namespace v2rayN.ViewModels type = CoreType6; break; - case 7: - case 8: + default: continue; } item.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), type); diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml b/v2rayN/v2rayN/Views/AddServerWindow.xaml index 86bbe10e..c6be3abc 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml @@ -510,6 +510,83 @@ Margin="{StaticResource ServerItemMargin}" Style="{StaticResource DefComboBox}" /> + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs index 8ad2605f..efc0a2e1 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs @@ -139,6 +139,16 @@ namespace v2rayN.Views cmbHeaderType8.Items.Add(it); }); break; + + case EConfigType.Wireguard: + gridWireguard.Visibility = Visibility.Visible; + + sepa2.Visibility = Visibility.Collapsed; + gridTransport.Visibility = Visibility.Collapsed; + gridTls.Visibility = Visibility.Collapsed; + cmbCoreType.IsEnabled = false; + + break; } gridTlsMore.Visibility = Visibility.Hidden; @@ -188,6 +198,13 @@ namespace v2rayN.Views this.Bind(ViewModel, vm => vm.SelectedSource.security, v => v.txtSecurity8.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.headerType, v => v.cmbHeaderType8.Text).DisposeWith(disposables); break; + + case EConfigType.Wireguard: + this.Bind(ViewModel, vm => vm.SelectedSource.id, v => v.txtId9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.publicKey, v => v.txtPublicKey9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.path, v => v.txtPath9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.requestHost, v => v.txtRequestHost9.Text).DisposeWith(disposables); + break; } this.Bind(ViewModel, vm => vm.SelectedSource.network, v => v.cmbNetwork.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.headerType, v => v.cmbHeaderType.Text).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index e22a9c3b..1644b640 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -83,6 +83,7 @@ x:Name="menuAddTrojanServer" Height="{StaticResource MenuItemHeight}" Header="{x:Static resx:ResUI.menuAddTrojanServer}" /> + + vm.AddTrojanServerCmd, v => v.menuAddTrojanServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.AddHysteria2ServerCmd, v => v.menuAddHysteria2Server).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.AddTuicServerCmd, v => v.menuAddTuicServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.AddWireguardServerCmd, v => v.menuAddWireguardServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.AddCustomServerCmd, v => v.menuAddCustomServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.AddServerViaClipboardCmd, v => v.menuAddServerViaClipboard).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.AddServerViaScanCmd, v => v.menuAddServerViaScan).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs index c7f13a8c..f4822b42 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs @@ -203,6 +203,5 @@ namespace v2rayN.Views { this.Close(); } - } } \ No newline at end of file