diff --git a/v2rayN/ServiceLib/Manager/NetBridgeManager.cs b/v2rayN/ServiceLib/Manager/NetBridgeManager.cs index 3ea21e14..c4487201 100644 --- a/v2rayN/ServiceLib/Manager/NetBridgeManager.cs +++ b/v2rayN/ServiceLib/Manager/NetBridgeManager.cs @@ -166,6 +166,18 @@ public sealed class NetBridgeManager } } + public async Task SetDnsViaProxy(bool enable) + { + if (_netBridgeService == null) + { + return false; + } + + _netBridgeService.SetDnsViaProxy(enable); + + return await Task.FromResult(true); + } + private async Task ApplyRoutesInternal() { if (_netBridgeService == null) @@ -208,6 +220,11 @@ public sealed class NetBridgeManager private static List BuildRuleConfigs(string? ruleProcess) { + if (ruleProcess.IsNullOrEmpty()) + { + return new(); + } + var processNames = Utils.String2List(Utils.Convert2Comma(ruleProcess)); return processNames.Select(processName => new NetBridgeRuleConfig { diff --git a/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs b/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs index 9e18e094..8a63aac9 100644 --- a/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs @@ -282,4 +282,5 @@ public class SimpleDNSItem public class NetBridgeItem { public string? RuleProcess { get; set; } + public bool EnableDnsViaProxy { get; set; } } diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 675b0acc..35f09940 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -3052,7 +3052,7 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 Enables process traffic hijacking (experimental), similar to Proxifer; can coexist with system proxy; conflicts with TUN mode, please do not enable them simultaneously; 的本地化字符串。 + /// 查找类似 Enables process traffic hijacking (experimental), similar to Proxifer; can coexist with system proxy; conflicts with TUN mode, please do not enable them simultaneously;please allow v2rayN to use a private network in your firewall. 的本地化字符串。 /// public static string TbEnableNetBridge { get { @@ -3060,6 +3060,15 @@ namespace ServiceLib.Resx { } } + /// + /// 查找类似 DNS via Bridge 的本地化字符串。 + /// + public static string TbEnabletDnsViaProxy { + get { + return ResourceManager.GetString("TbEnabletDnsViaProxy", resourceCulture); + } + } + /// /// 查找类似 Enable Tun 的本地化字符串。 /// @@ -3699,6 +3708,15 @@ namespace ServiceLib.Resx { } } + /// + /// 查找类似 Save rules 的本地化字符串。 + /// + public static string TbSaveNetBridgeRule { + get { + return ResourceManager.GetString("TbSaveNetBridgeRule", resourceCulture); + } + } + /// /// 查找类似 sing-box Full Config Template 的本地化字符串。 /// diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx index 2b18f7dc..e8f7f73e 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1765,7 +1765,7 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Split the tail of packets into smaller fragments. This may affect throughput and latency. - Enables process traffic hijacking (experimental), similar to Proxifer; can coexist with system proxy; conflicts with TUN mode, please do not enable them simultaneously; + Enables process traffic hijacking (experimental), similar to Proxifer; can coexist with system proxy; conflicts with TUN mode, please do not enable them simultaneously;please allow v2rayN to use a private network in your firewall. The process names that need to be proxied; separate multiple processes with commas. Processes not in the list will also be hijacked, but will connect directly. @@ -1773,4 +1773,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Process traffic hijacking (experimental) - + + DNS via Bridge + + + Save rules + + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index 48b4ea52..f18e25ae 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1762,7 +1762,7 @@ 将数据包末端拆分为更小片段发送,可能影响吞吐与延迟。 - 启用进程流量劫持(实验性),类似 Proxifer 功能;可以和系统代理并存;和 TUN 模式冲突,请不要同时开启; + 启用进程流量劫持(实验性),类似 Proxifer 功能;可以和系统代理并存;和 TUN 模式冲突,请不要同时开启;请在防火墙中允许 v2rayN 使用专用网络 需要代理的进程名,多个进程请用逗号分隔;不在列表中的进程也会被劫持,但是会直连 @@ -1770,4 +1770,10 @@ 进程流量劫持(实验性) + + DNS 通过 Bridge + + + 保存规则 + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index 97703630..559d036a 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -1762,7 +1762,7 @@ 將封包末端拆分為更小的片段進行傳送,可能會影響吞吐量與延遲 - 啟用進程流量劫持(實驗性),類似 Proxifer 功能;可以和系統代理並存;和 TUN 模式衝突,請不要同時開啟; + 啟用進程流量劫持(實驗性),類似 Proxifer 功能;可以和系統代理並存;和 TUN 模式衝突,請不要同時開啟;請在防火牆中允許 v2rayN 使用專用網絡 需要代理程式的進程名,多個進程請用逗號分隔;不在清單中的進程也會被劫持,但是會直連 @@ -1770,4 +1770,10 @@ 進程流量劫持(實驗性) + + DNS 透過 Bridge + + + 保存規則 + \ No newline at end of file diff --git a/v2rayN/ServiceLib/ViewModels/NetBridgeViewModel.cs b/v2rayN/ServiceLib/ViewModels/NetBridgeViewModel.cs index 43c37cc7..6730db70 100644 --- a/v2rayN/ServiceLib/ViewModels/NetBridgeViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/NetBridgeViewModel.cs @@ -5,6 +5,9 @@ public class NetBridgeViewModel : MyReactiveObject [Reactive] public bool EnableNetBridge { get; set; } + [Reactive] + public bool EnabletDnsViaProxy { get; set; } + [Reactive] public string RuleProcess { get; set; } @@ -27,22 +30,31 @@ public class NetBridgeViewModel : MyReactiveObject await ToggleNetBridgeAsync(enabled); }); + this.WhenAnyValue(x => x.EnabletDnsViaProxy) + .Skip(1) + .Subscribe(async enabled => + { + await ToggleDnsViaProxyAsync(enabled); + }); + _ = Init(); } private async Task Init() { + EnabletDnsViaProxy = _config.NetBridgeItem.EnableDnsViaProxy; + _config.NetBridgeItem ??= new() { RuleProcess = string.Empty }; EnableNetBridge = false; - RuleProcess = _config.NetBridgeItem.RuleProcess; - if (RuleProcess.IsNullOrEmpty()) + if (_config.NetBridgeItem.RuleProcess.IsNullOrEmpty()) { - RuleProcess = "Chrome.exe"; + _config.NetBridgeItem.RuleProcess = "Chrome.exe"; } + RuleProcess = _config.NetBridgeItem.RuleProcess; await Task.CompletedTask; } @@ -58,6 +70,7 @@ public class NetBridgeViewModel : MyReactiveObject { await NetBridgeManager.Instance.UpdateProxyConfig(Global.Loopback, AppManager.Instance.GetLocalPort(EInboundProtocol.socks)); await NetBridgeManager.Instance.UpdateRoutes(RuleProcess); + await NetBridgeManager.Instance.SetDnsViaProxy(EnabletDnsViaProxy); } NoticeManager.Instance.Enqueue(succeed ? ResUI.OperationSuccess : ResUI.OperationFailed); } @@ -68,6 +81,13 @@ public class NetBridgeViewModel : MyReactiveObject } } + private async Task ToggleDnsViaProxyAsync(bool enabled) + { + _config.NetBridgeItem.EnableDnsViaProxy = enabled; + + await NetBridgeManager.Instance.SetDnsViaProxy(enabled); + } + /// private async Task SaveRulesAsync() { diff --git a/v2rayN/v2rayN.Desktop/Views/NetBridgeView.axaml b/v2rayN/v2rayN.Desktop/Views/NetBridgeView.axaml index a48e44bc..b18f0e47 100644 --- a/v2rayN/v2rayN.Desktop/Views/NetBridgeView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/NetBridgeView.axaml @@ -34,6 +34,25 @@ TextWrapping="Wrap" /> + + + + + + + + diff --git a/v2rayN/v2rayN/Views/NetBridgeView.xaml b/v2rayN/v2rayN/Views/NetBridgeView.xaml index 7094af55..dceb35aa 100644 --- a/v2rayN/v2rayN/Views/NetBridgeView.xaml +++ b/v2rayN/v2rayN/Views/NetBridgeView.xaml @@ -35,6 +35,25 @@ TextWrapping="Wrap" /> + + + + + + + diff --git a/v2rayN/v2rayN/Views/NetBridgeView.xaml.cs b/v2rayN/v2rayN/Views/NetBridgeView.xaml.cs index 87d74a13..cc6f0070 100644 --- a/v2rayN/v2rayN/Views/NetBridgeView.xaml.cs +++ b/v2rayN/v2rayN/Views/NetBridgeView.xaml.cs @@ -13,6 +13,7 @@ public partial class NetBridgeView this.BindCommand(ViewModel, vm => vm.SaveRulesCmd, v => v.btnSave).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableNetBridge, v => v.togEnableNetBridge.IsChecked).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.EnabletDnsViaProxy, v => v.togEnabletDnsViaProxy.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.RuleProcess, v => v.txtRuleProcess.Text).DisposeWith(disposables); });