diff --git a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs index c29f3869..92252850 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs @@ -834,6 +834,33 @@ namespace v2rayN.Handler private int GenMoreOutbounds(ProfileItem node, V2rayConfig v2rayConfig) { + //fragment proxy + if (_config.coreBasicItem.enableFragment + && !Utils.IsNullOrEmpty(v2rayConfig.outbounds[0].streamSettings?.security)) + { + var fragmentOutbound = new Outbounds4Ray + { + protocol = "freedom", + tag = $"{Global.ProxyTag}3", + settings = new() + { + fragment = new() + { + packets = "tlshello", + length = "100-200", + interval = "10-20" + } + } + }; + + v2rayConfig.outbounds.Add(fragmentOutbound); + v2rayConfig.outbounds[0].streamSettings.sockopt = new() + { + dialerProxy = fragmentOutbound.tag + }; + return 0; + } + if (node.subid.IsNullOrEmpty()) { return 0; diff --git a/v2rayN/v2rayN/Models/ConfigItems.cs b/v2rayN/v2rayN/Models/ConfigItems.cs index 5e3b8d58..80ddb74d 100644 --- a/v2rayN/v2rayN/Models/ConfigItems.cs +++ b/v2rayN/v2rayN/Models/ConfigItems.cs @@ -31,6 +31,8 @@ namespace v2rayN.Models /// 默认用户代理 /// public string defUserAgent { get; set; } + + public bool enableFragment { get; set; } } [Serializable] diff --git a/v2rayN/v2rayN/Models/V2rayConfig.cs b/v2rayN/v2rayN/Models/V2rayConfig.cs index eba9def5..73259a97 100644 --- a/v2rayN/v2rayN/Models/V2rayConfig.cs +++ b/v2rayN/v2rayN/Models/V2rayConfig.cs @@ -253,6 +253,8 @@ namespace v2rayN.Models /// /// public int? userLevel { get; set; } + + public FragmentItem4Ray? fragment { get; set; } } public class VnextItem4Ray @@ -665,4 +667,11 @@ namespace v2rayN.Models { public string? dialerProxy { get; set; } } + + public class FragmentItem4Ray + { + public string? packets { get; set; } + public string? length { get; set; } + public string? interval { get; set; } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index f2f0f507..eddcf0b0 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -2635,6 +2635,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Enable fragment 的本地化字符串。 + /// + public static string TbSettingsEnableFragment { + get { + return ResourceManager.GetString("TbSettingsEnableFragment", resourceCulture); + } + } + + /// + /// 查找类似 Use Xray and enable non-Tun mode, which conflicts with the group previous proxy 的本地化字符串。 + /// + public static string TbSettingsEnableFragmentTips { + get { + return ResourceManager.GetString("TbSettingsEnableFragmentTips", resourceCulture); + } + } + /// /// 查找类似 Enable hardware acceleration(Require restart) 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index f474f069..7ab6e440 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -1201,4 +1201,10 @@ Add [Http] server + + Use Xray and enable non-Tun mode, which conflicts with the group previous proxy + + + Enable fragment + \ 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 dca5948a..b5e98e8f 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -1198,4 +1198,10 @@ 添加[Http]服务器 + + 启用分片(Fragment) + + + 使用Xray且非Tun模式启用,和分组前置代理冲突 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx index 59538750..e69672ae 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx @@ -1171,4 +1171,10 @@ 新增[Http]伺服器 + + 啟用分片(Fragment) + + + 使用Xray且非Tun模式啟用,和分組前置代理衝突 + \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index 79e046bd..994d052f 100644 --- a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -34,6 +34,7 @@ namespace v2rayN.ViewModels [Reactive] public string mux4SboxProtocol { get; set; } [Reactive] public int hyUpMbps { get; set; } [Reactive] public int hyDownMbps { get; set; } + [Reactive] public bool enableFragment { get; set; } #endregion Core @@ -129,6 +130,7 @@ namespace v2rayN.ViewModels mux4SboxProtocol = _config.mux4SboxItem.protocol; hyUpMbps = _config.hysteriaItem.up_mbps; hyDownMbps = _config.hysteriaItem.down_mbps; + enableFragment = _config.coreBasicItem.enableFragment; #endregion Core @@ -289,6 +291,7 @@ namespace v2rayN.ViewModels _config.mux4SboxItem.protocol = mux4SboxProtocol; _config.hysteriaItem.up_mbps = hyUpMbps; _config.hysteriaItem.down_mbps = hyDownMbps; + _config.coreBasicItem.enableFragment = enableFragment; //Kcp //_config.kcpItem.mtu = Kcpmtu; diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index 6601637f..a02fa74c 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -67,6 +67,7 @@ + @@ -333,6 +334,26 @@ materialDesign:HintAssist.Hint="Down" Style="{StaticResource DefTextBox}" /> + + + + diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs index 4a9482ce..770700ca 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs @@ -156,6 +156,7 @@ namespace v2rayN.Views this.Bind(ViewModel, vm => vm.mux4SboxProtocol, v => v.cmbmux4SboxProtocol.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.hyUpMbps, v => v.txtUpMbps.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.hyDownMbps, v => v.txtDownMbps.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.enableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables); //this.Bind(ViewModel, vm => vm.Kcpmtu, v => v.txtKcpmtu.Text).DisposeWith(disposables); //this.Bind(ViewModel, vm => vm.Kcptti, v => v.txtKcptti.Text).DisposeWith(disposables);