From f5a16b0d8a3130f60333ca21438db178f7c1908e Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Mon, 16 Jun 2025 17:35:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E6=B4=9E=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=EF=BC=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=AE=A1=E7=90=86=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=98=B2=E7=81=AB=E5=A2=99=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4、通信功能/4.1、虚拟网卡/1.1、点对网.md | 7 +- .../ActionApiController.cs | 60 ++++++++-- .../ActionMessenger.cs | 95 +++++++++++++++ .../ActionMessengerIds.cs | 14 +++ src/linker.messenger.action/ActionSync.cs | 33 ++++++ src/linker.messenger.action/ActionTransfer.cs | 29 ++++- src/linker.messenger.action/Entry.cs | 18 +++ .../IActionClientStore.cs | 29 +++-- src/linker.messenger.api/Config.cs | 5 +- src/linker.messenger.firewall/Entry.cs | 5 + .../FirewallApiController.cs | 12 +- src/linker.messenger.firewall/FirewallSync.cs | 36 ++++++ .../FirewallTransfer.cs | 25 ++++ .../IFirewallClientStore.cs | 16 +++ .../linker.messenger.firewall.csproj | 1 + .../Entry.cs | 5 +- .../FirewallSerializer.cs | 108 ++++++++++++++++++ .../TunnelSerializer.cs | 50 ++++++++ .../action/ActionClientStore.cs | 24 +++- .../firewall/FirewallClientStore.cs | 44 +++++++ src/linker.messenger.tunnel/Config.cs | 10 +- .../TunnelApiController.cs | 36 +++++- .../TunnelMessenger.cs | 64 +++++++++++ .../TunnelMessengerIds.cs | 5 + src/linker.snat/LinkerDstMapping.cs | 4 +- src/linker.snat/LinkerSrcNat.cs | 15 ++- .../connection/TunnelConnectionUdp.cs | 6 +- src/linker.web/src/apis/action.js | 8 +- src/linker.web/src/apis/firewall.js | 3 + src/linker.web/src/apis/tunnel.js | 4 +- src/linker.web/src/lang/en-us.js | 2 + src/linker.web/src/lang/zh-cn.js | 2 + .../src/views/full/action/Action.vue | 73 ++++++++++++ .../src/views/full/action/Index.vue | 45 +------- .../views/full/devices/ConnectionsEdit.vue | 2 +- .../src/views/full/devices/List.vue | 6 +- .../src/views/full/devices/Oper.vue | 27 ++++- .../src/views/full/devices/OperAction.vue | 42 +++++++ .../src/views/full/devices/OperFirewall.vue | 2 +- .../src/views/full/devices/OperTransport.vue | 42 +++++++ .../src/views/full/devices/OperWakeup.vue | 2 +- .../src/views/full/devices/SForwardEdit.vue | 2 +- src/linker.web/src/views/full/devices/oper.js | 2 + .../src/views/full/firewall/Firewall.vue | 104 +++++++++++++---- .../src/views/full/install/Server.vue | 3 - .../src/views/full/server/RelayServers.vue | 2 +- .../src/views/full/transport/Index.vue | 86 ++------------ .../src/views/full/transport/Transport.vue | 96 ++++++++++++++++ version.txt | 2 +- 49 files changed, 1113 insertions(+), 200 deletions(-) create mode 100644 src/linker.messenger.action/ActionMessenger.cs create mode 100644 src/linker.messenger.action/ActionMessengerIds.cs create mode 100644 src/linker.messenger.action/ActionSync.cs create mode 100644 src/linker.messenger.firewall/FirewallSync.cs create mode 100644 src/linker.web/src/views/full/action/Action.vue create mode 100644 src/linker.web/src/views/full/devices/OperAction.vue create mode 100644 src/linker.web/src/views/full/devices/OperTransport.vue create mode 100644 src/linker.web/src/views/full/transport/Transport.vue diff --git a/src/linker.doc.web/docs/4、通信功能/4.1、虚拟网卡/1.1、点对网.md b/src/linker.doc.web/docs/4、通信功能/4.1、虚拟网卡/1.1、点对网.md index 33963080..a37121a8 100644 --- a/src/linker.doc.web/docs/4、通信功能/4.1、虚拟网卡/1.1、点对网.md +++ b/src/linker.doc.web/docs/4、通信功能/4.1、虚拟网卡/1.1、点对网.md @@ -12,8 +12,9 @@ sidebar_position: 2 :::tip[1、情况1,你的设备支持NAT转发时] -1. linux,已经自动添加NAT转发(在`OpenWrt`,需要在`防火墙 - 区域设置`中将`转发`设置为`接受`) -2. windows,优先使用系统`NetNat`,`NetNat`失败则启用`内置SNAT`,但是性能应该没有`NetNat`好 +1. linux,已经自动添加NAT转发 +2. linux软路由docker,在`OpenWrt、群晖`或者其它软路由系统,可能需要在宿主机允许IP转发,可以在UI设置,也可以尝试`sysctl -w net.ipv4.ip_forward=1`允许IP转发,然后`iptables -t nat -A POSTROUTING -s 10.18.18.0/24 -j MASQUERADE`然后添加NAT,10.18.18.0/24是你的虚拟网卡网段 +3. windows,优先使用系统`NetNat`,`NetNat`失败则启用`内置SNAT`,但是性能应该没有`NetNat`好 1. 由于`内置SNAT`依赖`WinDivert驱动`,如果报错`Windows 无法验证此文件的数字签名`什么的,可以尝试以下两种解决办法 2. 使用`管理员身份运行cmd`执行以下两条命令,然后重启系统 ``` @@ -30,8 +31,6 @@ sidebar_position: 2 ::: - - :::tip[2、情况2,你的设备无法使用NAT转发时] 1. 你的设备无法使用NAT转发(一般出现在低版本windows下,win10以下),那你只能使用端口转发功能来访问你当前设备局域网下的其它设备 diff --git a/src/linker.messenger.action/ActionApiController.cs b/src/linker.messenger.action/ActionApiController.cs index 820a17a2..af940c1a 100644 --- a/src/linker.messenger.action/ActionApiController.cs +++ b/src/linker.messenger.action/ActionApiController.cs @@ -1,30 +1,70 @@ -using linker.libs.extends; +using linker.libs; +using linker.libs.extends; using linker.libs.web; using linker.messenger.api; +using linker.messenger.signin; +using linker.tunnel.transport; namespace linker.messenger.action { public sealed class ActionApiController : IApiController { - private readonly IActionClientStore actionStore; - - public ActionApiController(IActionClientStore actionStore) + private readonly ActionTransfer actionTransfer; + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly IMessengerSender messengerSender; + private readonly ISerializer serializer; + public ActionApiController(ActionTransfer actionTransfer, SignInClientState signInClientState, ISignInClientStore signInClientStore, + IMessengerSender messengerSender, ISerializer serializer) { - this.actionStore = actionStore; + this.actionTransfer = actionTransfer; + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.messengerSender = messengerSender; + this.serializer = serializer; } [Access(AccessValue.Action)] public bool SetArgs(ApiControllerParamsInfo param) { - actionStore.SetActionArg(param.Content); - return actionStore.Confirm(); + return actionTransfer.SetActionDynamicArg(param.Content); } [Access(AccessValue.Action)] - public bool SetServerArgs(ApiControllerParamsInfo param) + public async Task GetServerArgs(ApiControllerParamsInfo param) { - actionStore.SetActionArgs(param.Content.DeJson>()); - return actionStore.Confirm(); + if (param.Content == signInClientStore.Id || string.IsNullOrWhiteSpace(param.Content)) + { + return actionTransfer.GetActionStaticArg(); + } + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)ActionMessengerIds.GetForward, + Payload = serializer.Serialize(param.Content) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) + { + return serializer.Deserialize(resp.Data.Span); + } + return string.Empty; + } + [Access(AccessValue.Action)] + public async Task SetServerArgs(ApiControllerParamsInfo param) + { + KeyValuePair keyValue = param.Content.DeJson>(); + + if (keyValue.Key == signInClientStore.Id || string.IsNullOrWhiteSpace(keyValue.Key)) + { + return actionTransfer.SetActionStaticArg(keyValue.Value); + } + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)ActionMessengerIds.SetForward, + Payload = serializer.Serialize(keyValue) + }).ConfigureAwait(false); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } } diff --git a/src/linker.messenger.action/ActionMessenger.cs b/src/linker.messenger.action/ActionMessenger.cs new file mode 100644 index 00000000..2d3a4f9c --- /dev/null +++ b/src/linker.messenger.action/ActionMessenger.cs @@ -0,0 +1,95 @@ +using linker.libs; +using linker.messenger.signin; + +namespace linker.messenger.action +{ + public class ActionClientMessenger : IMessenger + { + private readonly IMessengerSender messengerSender; + private readonly ISerializer serializer; + private readonly ActionTransfer actionTransfer; + + public ActionClientMessenger(IMessengerSender messengerSender, ISerializer serializer, ActionTransfer actionTransfer) + { + this.messengerSender = messengerSender; + this.serializer = serializer; + this.actionTransfer = actionTransfer; + } + [MessengerId((ushort)ActionMessengerIds.Get)] + public void Get(IConnection connection) + { + connection.Write(serializer.Serialize(actionTransfer.GetActionStaticArg())); + } + [MessengerId((ushort)ActionMessengerIds.Set)] + public void Set(IConnection connection) + { + actionTransfer.SetActionStaticArg(serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span)); + } + } + + public class ActionServerMessenger : IMessenger + { + private readonly IMessengerSender messengerSender; + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; + + public ActionServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer) + { + this.messengerSender = messengerSender; + this.signCaching = signCaching; + this.serializer = serializer; + } + + [MessengerId((ushort)ActionMessengerIds.GetForward)] + public void GetForward(IConnection connection) + { + string machineid = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to)) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + _ = messengerSender.SendReply(new MessageRequestWrap + { + Connection = to.Connection, + MessengerId = (ushort)ActionMessengerIds.Get + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK && result.Result.Data.Length > 0) + { + await messengerSender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Payload = result.Result.Data, + RequestId = requestid, + }, (ushort)ActionMessengerIds.GetForward).ConfigureAwait(false); + } + }); + } + } + [MessengerId((ushort)ActionMessengerIds.SetForward)] + public void SetForward(IConnection connection) + { + KeyValuePair info = serializer.Deserialize>(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, info.Key, out SignCacheInfo from, out SignCacheInfo to)) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + _ = messengerSender.SendReply(new MessageRequestWrap + { + Connection = to.Connection, + MessengerId = (ushort)ActionMessengerIds.Set, + Payload = serializer.Serialize(info.Value) + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK && result.Result.Data.Length > 0) + { + await messengerSender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Payload = result.Result.Data, + RequestId = requestid, + }, (ushort)ActionMessengerIds.SetForward).ConfigureAwait(false); + } + }); + } + } + } +} diff --git a/src/linker.messenger.action/ActionMessengerIds.cs b/src/linker.messenger.action/ActionMessengerIds.cs new file mode 100644 index 00000000..f8131465 --- /dev/null +++ b/src/linker.messenger.action/ActionMessengerIds.cs @@ -0,0 +1,14 @@ +namespace linker.messenger.action +{ + public enum ActionMessengerIds : ushort + { + _ = 3600, + + Get = 3601, + GetForward = 3602, + Set = 3603, + SetForward = 3604, + + None = 3699 + } +} diff --git a/src/linker.messenger.action/ActionSync.cs b/src/linker.messenger.action/ActionSync.cs new file mode 100644 index 00000000..9456348f --- /dev/null +++ b/src/linker.messenger.action/ActionSync.cs @@ -0,0 +1,33 @@ +using linker.libs; +using linker.messenger.sync; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.action +{ + public sealed class ActionSync : ISync + { + public string Name => "ActionStatic"; + + private readonly ActionTransfer actionTransfer; + private readonly ISerializer serializer; + public ActionSync(ActionTransfer actionTransfer, ISerializer serializer) + { + this.actionTransfer = actionTransfer; + this.serializer = serializer; + } + + public Memory GetData() + { + return serializer.Serialize(actionTransfer.GetActionStaticArg()); + } + + public void SetData(Memory data) + { + actionTransfer.SetActionStaticArg(serializer.Deserialize(data.Span)); + } + } +} diff --git a/src/linker.messenger.action/ActionTransfer.cs b/src/linker.messenger.action/ActionTransfer.cs index fb4967aa..b63be128 100644 --- a/src/linker.messenger.action/ActionTransfer.cs +++ b/src/linker.messenger.action/ActionTransfer.cs @@ -1,9 +1,17 @@ -using System.Net.Http.Json; +using linker.messenger.signin; +using System.Net.Http.Json; using System.Text.Json.Nodes; namespace linker.messenger.action { public sealed class ActionTransfer { + private readonly ISignInClientStore signInClientStore; + private readonly IActionClientStore actionClientStore; + public ActionTransfer(ISignInClientStore signInClientStore, IActionClientStore actionClientStore) + { + this.signInClientStore = signInClientStore; + this.actionClientStore = actionClientStore; + } public async Task ExcuteActions(string actionJson, string url) { if (string.IsNullOrWhiteSpace(url)) return string.Empty; @@ -31,5 +39,24 @@ namespace linker.messenger.action } return string.Empty; } + + public bool SetActionDynamicArg(string value) + { + actionClientStore.SetActionDynamicArg(value); + return actionClientStore.Confirm(); + } + public bool SetActionStaticArg(string value) + { + actionClientStore.SetActionStaticArg(signInClientStore.Server.Host, value); + return actionClientStore.Confirm(); + } + public string GetActionStaticArg() + { + return actionClientStore.GetActionStaticArg(signInClientStore.Server.Host); + } + public bool TryAddActionArg(Dictionary args) + { + return actionClientStore.TryAddActionArg(signInClientStore.Server.Host, args); + } } } \ No newline at end of file diff --git a/src/linker.messenger.action/Entry.cs b/src/linker.messenger.action/Entry.cs index 6cfad751..6c923a32 100644 --- a/src/linker.messenger.action/Entry.cs +++ b/src/linker.messenger.action/Entry.cs @@ -3,6 +3,7 @@ using linker.messenger.action; using linker.messenger.relay.server.validator; using linker.messenger.sforward.server.validator; using linker.messenger.signin.args; +using linker.messenger.sync; using Microsoft.Extensions.DependencyInjection; namespace linker.messenger.api { @@ -14,6 +15,11 @@ namespace linker.messenger.api serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); return serviceCollection; } public static ServiceProvider UseActionClient(this ServiceProvider serviceProvider) @@ -24,6 +30,12 @@ namespace linker.messenger.api SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService(); signInArgsTransfer.AddArgs(new List { serviceProvider.GetService() }); + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + SyncTreansfer syncTransfer = serviceProvider.GetService(); + syncTransfer.AddSyncs(new List { serviceProvider.GetService() }); + return serviceProvider; } @@ -33,6 +45,8 @@ namespace linker.messenger.api serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); return serviceCollection; } public static ServiceProvider UseActionServer(this ServiceProvider serviceProvider) @@ -45,6 +59,10 @@ namespace linker.messenger.api SForwardValidatorTransfer sForwardValidatorTransfer = serviceProvider.GetService(); sForwardValidatorTransfer.AddValidators(new List { serviceProvider.GetService() }); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + return serviceProvider; } } diff --git a/src/linker.messenger.action/IActionClientStore.cs b/src/linker.messenger.action/IActionClientStore.cs index 131b4031..698fd523 100644 --- a/src/linker.messenger.action/IActionClientStore.cs +++ b/src/linker.messenger.action/IActionClientStore.cs @@ -1,30 +1,39 @@ -namespace linker.messenger.action +using System.Collections.Concurrent; + +namespace linker.messenger.action { public sealed class ActionInfo { public string Arg { get; set; } = string.Empty; - public Dictionary Args { get; set; } = new Dictionary(); + public ConcurrentDictionary Args { get; set; } = new ConcurrentDictionary(); } public interface IActionClientStore { /// /// 设置动态验证参数,优先使用 /// - /// - public void SetActionArg(string action); + /// + public void SetActionDynamicArg(string value); /// /// 设置静态验证参数,动态参数为空时使用 /// - /// action参数列表,host->arg,不同的服务器不同的参数 - public void SetActionArgs(Dictionary actions); + /// + /// + public void SetActionStaticArg(string key,string value); /// - /// 从配置里获取验证参数,添加到args + /// 获取静态参数 /// - /// 当前服务器地址 - /// 一个字典 + /// /// - public bool TryAddActionArg(string host, Dictionary args); + public string GetActionStaticArg(string key); + /// + /// 网args里添加指定key的值 + /// + /// + /// + /// + public bool TryAddActionArg(string key, Dictionary args); /// /// 提交更新 /// diff --git a/src/linker.messenger.api/Config.cs b/src/linker.messenger.api/Config.cs index 2b4c423c..a5bf972a 100644 --- a/src/linker.messenger.api/Config.cs +++ b/src/linker.messenger.api/Config.cs @@ -99,7 +99,7 @@ namespace linker.messenger.api [AccessDisplay("修改打洞协议")] Transport = 28, - [AccessDisplay("修改验证参数")] + [AccessDisplay("修改本机验证参数")] Action = 29, [AccessDisplay("查看内网穿透流量")] @@ -149,6 +149,9 @@ namespace linker.messenger.api WakeupSelf = 46, [AccessDisplay("唤醒所有设备")] WakeupOther = 47, + + [AccessDisplay("修改所有验证参数")] + ActionOther = 48, } public sealed class AccessTextInfo diff --git a/src/linker.messenger.firewall/Entry.cs b/src/linker.messenger.firewall/Entry.cs index a6023302..37d02aef 100644 --- a/src/linker.messenger.firewall/Entry.cs +++ b/src/linker.messenger.firewall/Entry.cs @@ -1,5 +1,6 @@  using linker.libs.web; +using linker.messenger.sync; using linker.snat; using Microsoft.Extensions.DependencyInjection; @@ -13,6 +14,7 @@ namespace linker.messenger.firewall serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); return serviceCollection; } @@ -26,6 +28,9 @@ namespace linker.messenger.firewall linker.messenger.api.IWebServer apiServer = serviceProvider.GetService(); apiServer.AddPlugins(new List { serviceProvider.GetService() }); + SyncTreansfer syncTransfer = serviceProvider.GetService(); + syncTransfer.AddSyncs(new List { serviceProvider.GetService() }); + return serviceProvider; } diff --git a/src/linker.messenger.firewall/FirewallApiController.cs b/src/linker.messenger.firewall/FirewallApiController.cs index 20507b2d..1372484a 100644 --- a/src/linker.messenger.firewall/FirewallApiController.cs +++ b/src/linker.messenger.firewall/FirewallApiController.cs @@ -39,7 +39,7 @@ namespace linker.messenger.firewall if (accessStore.HasAccess(AccessValue.FirewallSelf) == false) return new FirewallListInfo(); return firewallTransfer.Get(info.Data); } - if (accessStore.HasAccess(AccessValue.FirewallOther) == false) return new FirewallListInfo (); + if (accessStore.HasAccess(AccessValue.FirewallOther) == false) return new FirewallListInfo(); var resp = await messengerSender.SendReply(new MessageRequestWrap { @@ -121,5 +121,15 @@ namespace linker.messenger.firewall Payload = serializer.Serialize(info) }).ConfigureAwait(false); } + /// + /// 选中 + /// + /// + /// + public bool Check(ApiControllerParamsInfo param) + { + FirewallCheckInfo info = param.Content.DeJson(); + return firewallTransfer.Check(info); + } } } diff --git a/src/linker.messenger.firewall/FirewallSync.cs b/src/linker.messenger.firewall/FirewallSync.cs new file mode 100644 index 00000000..f6ebcbc1 --- /dev/null +++ b/src/linker.messenger.firewall/FirewallSync.cs @@ -0,0 +1,36 @@ +using linker.libs; +using linker.messenger.sync; + +namespace linker.messenger.firewall +{ + public sealed class FirewallSync : ISync + { + public string Name => "Firewall"; + + private readonly FirewallTransfer firewallTransfer; + private readonly ISerializer serializer; + public FirewallSync(FirewallTransfer firewallTransfer, ISerializer serializer) + { + this.firewallTransfer = firewallTransfer; + this.serializer = serializer; + } + public Memory GetData() + { + return serializer.Serialize(firewallTransfer.Get().Where(c => c.Checked).ToList()); + } + + public void SetData(Memory data) + { + List ids = firewallTransfer.Get().Select(c => c.Id).ToList(); + + List list = serializer.Deserialize>(data.Span); + foreach (FirewallRuleInfo rule in list) + { + rule.Id = string.Empty; + } + firewallTransfer.Add(list); + + firewallTransfer.Remove(ids); + } + } +} diff --git a/src/linker.messenger.firewall/FirewallTransfer.cs b/src/linker.messenger.firewall/FirewallTransfer.cs index c0fc0de5..151cf002 100644 --- a/src/linker.messenger.firewall/FirewallTransfer.cs +++ b/src/linker.messenger.firewall/FirewallTransfer.cs @@ -34,7 +34,15 @@ namespace linker.messenger.firewall BuildRules(); return true; } + public bool Check(FirewallCheckInfo info) + { + return firewallClientStore.Check(info); + } + public List Get() + { + return firewallClientStore.GetAll().ToList(); + } public FirewallListInfo Get(FirewallSearchInfo info) { return new FirewallListInfo @@ -50,12 +58,29 @@ namespace linker.messenger.firewall BuildRules(); return true; } + public bool Add(List infos) + { + foreach (var item in infos) + { + item.GroupId = signInClientStore.Group.Id; + } + + firewallClientStore.Add(infos); + BuildRules(); + return true; + } public bool Remove(string id) { firewallClientStore.Remove(id); BuildRules(); return true; } + public bool Remove(List ids) + { + firewallClientStore.Remove(ids); + BuildRules(); + return true; + } } } diff --git a/src/linker.messenger.firewall/IFirewallClientStore.cs b/src/linker.messenger.firewall/IFirewallClientStore.cs index ed2bc8ce..9450fb47 100644 --- a/src/linker.messenger.firewall/IFirewallClientStore.cs +++ b/src/linker.messenger.firewall/IFirewallClientStore.cs @@ -7,10 +7,14 @@ namespace linker.messenger.firewall public LinkerFirewallState State { get; } public void SetState(LinkerFirewallState state); + public IEnumerable GetAll(); public IEnumerable GetAll(FirewallSearchInfo searchInfo); public IEnumerable GetEnabled(string groupId); public bool Add(FirewallRuleInfo rule); + public bool Add(List rules); public bool Remove(string id); + public bool Remove(List ids); + public bool Check(FirewallCheckInfo info); } public sealed class FirewallRuleInfo : linker.snat.LinkerFirewallRuleInfo @@ -21,6 +25,7 @@ namespace linker.messenger.firewall public bool Disabled { get; set; } public int OrderBy { get; set; } public string Remark { get; set; } + public bool Checked { get; set; } } @@ -59,4 +64,15 @@ namespace linker.messenger.firewall public string MachineId { get; set; } public LinkerFirewallState State { get; set; } } + + public sealed partial class FirewallCheckForwardInfo + { + public string MachineId { get; set; } + public FirewallCheckInfo Data { get; set; } + } + public sealed partial class FirewallCheckInfo + { + public List Ids { get; set; } + public bool IsChecked { get; set; } + } } diff --git a/src/linker.messenger.firewall/linker.messenger.firewall.csproj b/src/linker.messenger.firewall/linker.messenger.firewall.csproj index 2ef2df19..d22de408 100644 --- a/src/linker.messenger.firewall/linker.messenger.firewall.csproj +++ b/src/linker.messenger.firewall/linker.messenger.firewall.csproj @@ -40,6 +40,7 @@ + diff --git a/src/linker.messenger.serializer.memorypack/Entry.cs b/src/linker.messenger.serializer.memorypack/Entry.cs index 12ba8e39..61c3323c 100644 --- a/src/linker.messenger.serializer.memorypack/Entry.cs +++ b/src/linker.messenger.serializer.memorypack/Entry.cs @@ -39,6 +39,7 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new TunnelSetRouteLevelInfoFormatter()); MemoryPackFormatterProvider.Register(new TunnelInterfaceInfoFormatter()); MemoryPackFormatterProvider.Register(new TunnelNetInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelTransportItemSetInfoFormatter()); MemoryPackFormatterProvider.Register(new DecenterSyncInfoFormatter()); @@ -66,7 +67,7 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new RelayAskResultInfo170Formatter()); MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter()); - + MemoryPackFormatterProvider.Register(new RelayTrafficUpdateInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateWrapInfoFormatter()); @@ -143,6 +144,8 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new FirewallAddForwardInfoFormatter()); MemoryPackFormatterProvider.Register(new FirewallRemoveForwardInfoFormatter()); MemoryPackFormatterProvider.Register(new FirewallStateForwardInfoFormatter()); + MemoryPackFormatterProvider.Register(new FirewallCheckInfoFormatter()); + MemoryPackFormatterProvider.Register(new FirewallCheckForwardInfoFormatter()); MemoryPackFormatterProvider.Register(new WakeupInfoFormatter()); MemoryPackFormatterProvider.Register(new WakeupSearchInfoFormatter()); diff --git a/src/linker.messenger.serializer.memorypack/FirewallSerializer.cs b/src/linker.messenger.serializer.memorypack/FirewallSerializer.cs index d18206c9..477da691 100644 --- a/src/linker.messenger.serializer.memorypack/FirewallSerializer.cs +++ b/src/linker.messenger.serializer.memorypack/FirewallSerializer.cs @@ -441,4 +441,112 @@ namespace linker.messenger.serializer.memorypack value = wrapped.info; } } + + + [MemoryPackable] + public readonly partial struct SerializableFirewallCheckInfo + { + [MemoryPackIgnore] + public readonly FirewallCheckInfo info; + + [MemoryPackInclude] + List Ids => info.Ids; + + [MemoryPackInclude, MemoryPackAllowSerialize] + bool IsChecked => info.IsChecked; + + [MemoryPackConstructor] + SerializableFirewallCheckInfo(List ids, bool isChecked) + { + this.info = new FirewallCheckInfo + { + Ids = ids, + IsChecked = isChecked + }; + } + + public SerializableFirewallCheckInfo(FirewallCheckInfo info) + { + this.info = info; + } + } + public class FirewallCheckInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref FirewallCheckInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableFirewallCheckInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref FirewallCheckInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + [MemoryPackable] + public readonly partial struct SerializableFirewallCheckForwardInfo + { + [MemoryPackIgnore] + public readonly FirewallCheckForwardInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude, MemoryPackAllowSerialize] + FirewallCheckInfo Data => info.Data; + + [MemoryPackConstructor] + SerializableFirewallCheckForwardInfo(string machineId, FirewallCheckInfo data) + { + this.info = new FirewallCheckForwardInfo + { + MachineId = machineId, + Data = data + }; + } + + public SerializableFirewallCheckForwardInfo(FirewallCheckForwardInfo info) + { + this.info = info; + } + } + public class FirewallCheckForwardInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref FirewallCheckForwardInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableFirewallCheckForwardInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref FirewallCheckForwardInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } } diff --git a/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs b/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs index a4d19c4e..a751d20d 100644 --- a/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs +++ b/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs @@ -615,4 +615,54 @@ namespace linker.messenger.serializer.memorypack value = wrapped.info; } } + [MemoryPackable] + public readonly partial struct SerializableTunnelTransportItemSetInfo + { + [MemoryPackIgnore] + public readonly TunnelTransportItemSetInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + List Data => info.Data; + + [MemoryPackConstructor] + SerializableTunnelTransportItemSetInfo(string machineId, List data) + { + var info = new TunnelTransportItemSetInfo { MachineId = machineId, Data = data }; + this.info = info; + } + + public SerializableTunnelTransportItemSetInfo(TunnelTransportItemSetInfo info) + { + this.info = info; + } + } + public class TunnelTransportItemSetInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref TunnelTransportItemSetInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableTunnelTransportItemSetInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref TunnelTransportItemSetInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } } diff --git a/src/linker.messenger.store.file/action/ActionClientStore.cs b/src/linker.messenger.store.file/action/ActionClientStore.cs index ab6d0d82..13c2c157 100644 --- a/src/linker.messenger.store.file/action/ActionClientStore.cs +++ b/src/linker.messenger.store.file/action/ActionClientStore.cs @@ -1,4 +1,5 @@ -using linker.messenger.action; +using linker.libs.extends; +using linker.messenger.action; namespace linker.messenger.store.file.action { public sealed class ActionClientStore : IActionClientStore @@ -11,15 +12,25 @@ namespace linker.messenger.store.file.action this.config = config; } - public void SetActionArg(string action) + public void SetActionDynamicArg(string value) { - config.Data.Client.Action.Arg = action; + config.Data.Client.Action.Arg = value; } - public void SetActionArgs(Dictionary actions) + + public void SetActionStaticArg(string key, string value) { - config.Data.Client.Action.Args = actions; - + config.Data.Client.Action.Args.AddOrUpdate(key, value, (a, b) => value); } + + public string GetActionStaticArg(string key) + { + if (config.Data.Client.Action.Args.TryGetValue(key, out string arg)) + { + return arg; + } + return string.Empty; + } + public bool TryAddActionArg(string host, Dictionary args) { if (string.IsNullOrWhiteSpace(config.Data.Client.Action.Arg) == false) @@ -37,6 +48,7 @@ namespace linker.messenger.store.file.action config.Data.Update(); return true; } + } } \ No newline at end of file diff --git a/src/linker.messenger.store.file/firewall/FirewallClientStore.cs b/src/linker.messenger.store.file/firewall/FirewallClientStore.cs index 204ee592..7ff695e7 100644 --- a/src/linker.messenger.store.file/firewall/FirewallClientStore.cs +++ b/src/linker.messenger.store.file/firewall/FirewallClientStore.cs @@ -23,6 +23,10 @@ namespace linker.messenger.store.file.firewall runningConfig.Data.Update(); } + public IEnumerable GetAll() + { + return liteCollection.FindAll(); + } public IEnumerable GetAll(FirewallSearchInfo info) { IEnumerable list = liteCollection.FindAll() @@ -77,10 +81,50 @@ namespace linker.messenger.store.file.firewall }, c => c.Id == rule.Id) > 0; } } + public bool Add(List rules) + { + foreach (var rule in rules) + { + if (string.IsNullOrWhiteSpace(rule.Id)) + { + rule.Id = ObjectId.NewObjectId().ToString(); + liteCollection.Insert(rule); + } + else + { + liteCollection.UpdateMany(p => new FirewallRuleInfo + { + SrcId = rule.SrcId, + SrcName = rule.SrcName, + GroupId = rule.GroupId, + DstCIDR = rule.DstCIDR, + DstPort = rule.DstPort, + Protocol = rule.Protocol, + Action = rule.Action, + OrderBy = rule.OrderBy, + Disabled = rule.Disabled, + Remark = rule.Remark + }, c => c.Id == rule.Id); + } + } + return true; + } public bool Remove(string id) { return liteCollection.Delete(id); } + public bool Remove(List ids) + { + return liteCollection.DeleteMany(c => ids.Contains(c.Id)) > 0; + } + + public bool Check(FirewallCheckInfo info) + { + return liteCollection.UpdateMany(p => new FirewallRuleInfo + { + Checked = info.IsChecked + }, c => info.Ids.Contains(c.Id)) > 0; + } } } diff --git a/src/linker.messenger.tunnel/Config.cs b/src/linker.messenger.tunnel/Config.cs index 3298cf40..4817df42 100644 --- a/src/linker.messenger.tunnel/Config.cs +++ b/src/linker.messenger.tunnel/Config.cs @@ -1,4 +1,5 @@ -using System.Net; +using linker.tunnel.transport; +using System.Net; namespace linker.messenger.tunnel { @@ -72,4 +73,11 @@ namespace linker.messenger.tunnel public TunnelNetInfo Net { get; set; } = new TunnelNetInfo(); } + + public sealed class TunnelTransportItemSetInfo + { + public string MachineId { get; set; } + public List Data { get; set; } + } + } diff --git a/src/linker.messenger.tunnel/TunnelApiController.cs b/src/linker.messenger.tunnel/TunnelApiController.cs index 70778705..fb9c8040 100644 --- a/src/linker.messenger.tunnel/TunnelApiController.cs +++ b/src/linker.messenger.tunnel/TunnelApiController.cs @@ -120,7 +120,24 @@ namespace linker.messenger.tunnel /// public async Task> GetTransports(ApiControllerParamsInfo param) { - return await tunnelClientStore.GetTunnelTransports().ConfigureAwait(false); + if (param.Content == signInClientStore.Id || string.IsNullOrWhiteSpace(param.Content)) + { + return await tunnelClientStore.GetTunnelTransports().ConfigureAwait(false); + } + + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)TunnelMessengerIds.TransportGetForward, + Payload = serializer.Serialize(param.Content) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) + { + return serializer.Deserialize>(resp.Data.Span); + } + + return []; + } /// /// 设置打洞协议 @@ -130,12 +147,21 @@ namespace linker.messenger.tunnel [Access(AccessValue.Transport)] public async Task SetTransports(ApiControllerParamsInfo param) { - List info = param.Content.DeJson>(); - await tunnelClientStore.SetTunnelTransports(info).ConfigureAwait(false); - return true; + TunnelTransportItemSetInfo info = param.Content.DeJson(); + if (info.MachineId == signInClientStore.Id || string.IsNullOrWhiteSpace(info.MachineId)) + { + await tunnelClientStore.SetTunnelTransports(info.Data).ConfigureAwait(false); + return true; + } + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)TunnelMessengerIds.TransportSetForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } - public async Task GetNetwork(ApiControllerParamsInfo param) { if (param.Content == signInClientStore.Id) diff --git a/src/linker.messenger.tunnel/TunnelMessenger.cs b/src/linker.messenger.tunnel/TunnelMessenger.cs index f244dab2..5c5e9edf 100644 --- a/src/linker.messenger.tunnel/TunnelMessenger.cs +++ b/src/linker.messenger.tunnel/TunnelMessenger.cs @@ -104,6 +104,17 @@ namespace linker.messenger.tunnel { connection.Write(serializer.Serialize(tunnelNetworkTransfer.GetLocalNetwork())); } + + [MessengerId((ushort)TunnelMessengerIds.TransportGet)] + public void TransportGet(IConnection connection) + { + connection.Write(serializer.Serialize(tunnelClientStore.GetTunnelTransports())); + } + [MessengerId((ushort)TunnelMessengerIds.TransportSet)] + public void TransportSet(IConnection connection) + { + tunnelClientStore.SetTunnelTransports(serializer.Deserialize>(connection.ReceiveRequestWrap.Payload.Span)); + } } /// @@ -247,5 +258,58 @@ namespace linker.messenger.tunnel }); } } + + + [MessengerId((ushort)TunnelMessengerIds.TransportGetForward)] + public void TransportGetForward(IConnection connection) + { + string machineid = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to)) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + _ = messengerSender.SendReply(new MessageRequestWrap + { + Connection = to.Connection, + MessengerId = (ushort)TunnelMessengerIds.TransportGet + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK && result.Result.Data.Length > 0) + { + await messengerSender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Payload = result.Result.Data, + RequestId = requestid, + }, (ushort)TunnelMessengerIds.TransportGetForward).ConfigureAwait(false); + } + }); + } + } + [MessengerId((ushort)TunnelMessengerIds.TransportSetForward)] + public void TransportSetForward(IConnection connection) + { + TunnelTransportItemSetInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to)) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + _ = messengerSender.SendReply(new MessageRequestWrap + { + Connection = to.Connection, + MessengerId = (ushort)TunnelMessengerIds.TransportSet, + Payload = serializer.Serialize(info.Data) + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK && result.Result.Data.Length > 0) + { + await messengerSender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Payload = result.Result.Data, + RequestId = requestid, + }, (ushort)TunnelMessengerIds.TransportSetForward).ConfigureAwait(false); + } + }); + } + } } } diff --git a/src/linker.messenger.tunnel/TunnelMessengerIds.cs b/src/linker.messenger.tunnel/TunnelMessengerIds.cs index 60f40b51..9ed9e52c 100644 --- a/src/linker.messenger.tunnel/TunnelMessengerIds.cs +++ b/src/linker.messenger.tunnel/TunnelMessengerIds.cs @@ -22,6 +22,11 @@ Network = 2013, NetworkForward = 2014, + TransportGet = 2015, + TransportGetForward = 2016, + TransportSet = 2017, + TransportSetForward = 2018, + None = 2099 } } diff --git a/src/linker.snat/LinkerDstMapping.cs b/src/linker.snat/LinkerDstMapping.cs index b3fc087c..bafa94c5 100644 --- a/src/linker.snat/LinkerDstMapping.cs +++ b/src/linker.snat/LinkerDstMapping.cs @@ -1,6 +1,4 @@ using linker.libs; -using linker.libs.extends; -using System; using System.Buffers; using System.Buffers.Binary; using System.Collections.Concurrent; @@ -35,6 +33,7 @@ namespace linker.snat mapDic = maps.ToFrozenDictionary(x => NetworkHelper.ToNetworkValue(x.FakeIP, x.PrefixLength), x => NetworkHelper.ToNetworkValue(x.RealIP, x.PrefixLength)); masks = maps.Select(x => NetworkHelper.ToPrefixValue(x.PrefixLength)).ToArray(); + } /// @@ -94,6 +93,7 @@ namespace linker.snat if (packet.Span[19] == 255) return; uint fakeDist = NetworkHelper.ToValue(packet.Span.Slice(16, 4)); + for (int i = 0; i < masks.Length; i++) { //目标IP网络号存在映射表中,找到映射后的真实网络号,替换网络号得到最终真实的IP diff --git a/src/linker.snat/LinkerSrcNat.cs b/src/linker.snat/LinkerSrcNat.cs index 520eddd8..c34fd24e 100644 --- a/src/linker.snat/LinkerSrcNat.cs +++ b/src/linker.snat/LinkerSrcNat.cs @@ -88,6 +88,8 @@ namespace linker.snat error = string.Empty; try { + CommandHelper.Windows(string.Empty, ["reg add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\" /v IPEnableRouter /t REG_DWORD /d 1 /f"]); + Shutdown(); srcIp = NetworkHelper.ToValue(info.Src); @@ -117,7 +119,9 @@ namespace linker.snat private static string BuildFilter(AddrInfo[] dsts) { IEnumerable ipRanges = dsts.Select(c => $"(ip.SrcAddr >= {c.NetworkIP} and ip.SrcAddr <= {c.BroadcastIP})"); - return $"inbound and ({string.Join(" or ", ipRanges)})"; + string filter = $"inbound and ({string.Join(" or ", ipRanges)})"; + //Console.WriteLine($"filter:{filter}"); + return filter; } /// /// 开始接收数据包 @@ -211,10 +215,13 @@ namespace linker.snat }; if (result == false) return false; + //Console.WriteLine($"snat inject :{p.IPv4Hdr->SrcAddr}->{p.IPv4Hdr->DstAddr} 替换为 {interfaceAddr}->{p.IPv4Hdr->DstAddr}"); //改写源地址为网卡地址 p.IPv4Hdr->SrcAddr = interfaceAddr; + } WinDivert.CalcChecksums(p.Packet.Span, ref addr, 0); + winDivert.SendEx(p.Packet.Span, new ReadOnlySpan(ref addr)); } } @@ -260,6 +267,8 @@ namespace linker.snat natMapInfo.LastTime = Environment.TickCount64; natMapInfo.Timeout = 15 * 1000; + //Console.WriteLine($"snat inject icmp:{*ptr0}->{identifier0},{*ptr1}->{identifier1}"); + //改写为新的标识符 *ptr0 = identifier0; *ptr1 = identifier1; @@ -286,10 +295,13 @@ namespace linker.snat ValueTuple key = (p.IPv4Hdr->DstAddr.Raw, *ptr0, p.IPv4Hdr->SrcAddr.Raw, *ptr1, ProtocolType.Icmp); if (natMap.TryGetValue(key, out NatMapInfo natMapInfo)) { + //Console.WriteLine($"snat recv icmp:{*ptr0}->{natMapInfo.Identifier0},{*ptr1}->{natMapInfo.Identifier1}"); //改回原来的标识符 *ptr0 = natMapInfo.Identifier0; *ptr1 = natMapInfo.Identifier1; + //Console.WriteLine($"icmp recv:{p.IPv4Hdr->SrcAddr}->{p.IPv4Hdr->DstAddr} 替换为 {p.IPv4Hdr->SrcAddr}->{natMapInfo.SrcAddr}"); p.IPv4Hdr->DstAddr = natMapInfo.SrcAddr; + return true; } @@ -645,6 +657,7 @@ namespace linker.snat uint value = NetworkHelper.ToValue(Address); uint network = NetworkHelper.ToNetworkValue(value, NetworkHelper.ToValue(IPv4Mask)); network2ipMap.TryAdd(network, (value, IPv4Addr.Parse(Address.ToString()))); + } } diff --git a/src/linker.tunnel/connection/TunnelConnectionUdp.cs b/src/linker.tunnel/connection/TunnelConnectionUdp.cs index 1766bc26..c8f41ab9 100644 --- a/src/linker.tunnel/connection/TunnelConnectionUdp.cs +++ b/src/linker.tunnel/connection/TunnelConnectionUdp.cs @@ -166,9 +166,13 @@ namespace linker.tunnel.connection } catch (Exception ex) { - LoggerHelper.Instance.Error(ex); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + LoggerHelper.Instance.Error(Encoding.UTF8.GetString(memory.Span)); LoggerHelper.Instance.Error(string.Join(",", memory.ToArray())); + } + } } } diff --git a/src/linker.web/src/apis/action.js b/src/linker.web/src/apis/action.js index 9b13e8f6..b3ab7d4e 100644 --- a/src/linker.web/src/apis/action.js +++ b/src/linker.web/src/apis/action.js @@ -1,5 +1,9 @@ import { sendWebsocketMsg } from './request' -export const setArgs = (args) => { - return sendWebsocketMsg('action/SetServerArgs', args); + +export const getArgs = (machineid) => { + return sendWebsocketMsg('action/GetServerArgs', machineid); +} +export const setArgs = (keyvalue) => { + return sendWebsocketMsg('action/SetServerArgs', keyvalue); } \ No newline at end of file diff --git a/src/linker.web/src/apis/firewall.js b/src/linker.web/src/apis/firewall.js index 227593af..8af59ced 100644 --- a/src/linker.web/src/apis/firewall.js +++ b/src/linker.web/src/apis/firewall.js @@ -11,4 +11,7 @@ export const removeFirewall = (data) => { } export const stateFirewall = (data) => { return sendWebsocketMsg('firewall/state', data); +} +export const checkFirewall = (data) => { + return sendWebsocketMsg('firewall/check', data); } \ No newline at end of file diff --git a/src/linker.web/src/apis/tunnel.js b/src/linker.web/src/apis/tunnel.js index 30426cd2..e625bd07 100644 --- a/src/linker.web/src/apis/tunnel.js +++ b/src/linker.web/src/apis/tunnel.js @@ -17,8 +17,8 @@ export const setTunnelRouteLevel = (data) => { return sendWebsocketMsg('tunnel/SetRouteLevel', data); } -export const getTunnelTransports = () => { - return sendWebsocketMsg('tunnel/GetTransports'); +export const getTunnelTransports = (machineid) => { + return sendWebsocketMsg('tunnel/GetTransports',machineid); } export const setTunnelTransports = (data) => { return sendWebsocketMsg('tunnel/SetTransports', data); diff --git a/src/linker.web/src/lang/en-us.js b/src/linker.web/src/lang/en-us.js index 55fb5052..3106fc32 100644 --- a/src/linker.web/src/lang/en-us.js +++ b/src/linker.web/src/lang/en-us.js @@ -254,6 +254,8 @@ export default { 'server.asyncUpdaterSecretKey': 'Update secretKey', 'server.asyncTunnelTransports': 'Tunnel transports', 'server.asyncSignInUserId': 'User Id', + 'server.asyncActionStatic': 'Action args', + 'server.asyncFirewall': 'Firewall selected item', 'firewall.rule': 'Firewall rule', 'firewall.srcName': 'Src Device', diff --git a/src/linker.web/src/lang/zh-cn.js b/src/linker.web/src/lang/zh-cn.js index d14d6a46..2be935d2 100644 --- a/src/linker.web/src/lang/zh-cn.js +++ b/src/linker.web/src/lang/zh-cn.js @@ -344,6 +344,8 @@ export default { 'server.asyncUpdaterSecretKey': '更新密钥', 'server.asyncTunnelTransports': '打洞协议', 'server.asyncSignInUserId': '用户唯一标识', + 'server.asyncActionStatic': '自定义验证参数', + 'server.asyncFirewall': '防火墙选中项', 'firewall.rule': '防火墙协议', 'firewall.srcName': '源设备', diff --git a/src/linker.web/src/views/full/action/Action.vue b/src/linker.web/src/views/full/action/Action.vue new file mode 100644 index 00000000..70f7e456 --- /dev/null +++ b/src/linker.web/src/views/full/action/Action.vue @@ -0,0 +1,73 @@ + + + \ No newline at end of file diff --git a/src/linker.web/src/views/full/action/Index.vue b/src/linker.web/src/views/full/action/Index.vue index 5bf7605c..1cadb3dd 100644 --- a/src/linker.web/src/views/full/action/Index.vue +++ b/src/linker.web/src/views/full/action/Index.vue @@ -1,52 +1,19 @@ diff --git a/src/linker.web/src/views/full/devices/ConnectionsEdit.vue b/src/linker.web/src/views/full/devices/ConnectionsEdit.vue index bc8b570a..e27825d3 100644 --- a/src/linker.web/src/views/full/devices/ConnectionsEdit.vue +++ b/src/linker.web/src/views/full/devices/ConnectionsEdit.vue @@ -74,7 +74,7 @@ - +
diff --git a/src/linker.web/src/views/full/devices/List.vue b/src/linker.web/src/views/full/devices/List.vue index 6a445d80..cf0102ae 100644 --- a/src/linker.web/src/views/full/devices/List.vue +++ b/src/linker.web/src/views/full/devices/List.vue @@ -33,6 +33,8 @@ + +
+ \ No newline at end of file diff --git a/src/linker.web/src/views/full/devices/OperFirewall.vue b/src/linker.web/src/views/full/devices/OperFirewall.vue index 49bd71be..ec761030 100644 --- a/src/linker.web/src/views/full/devices/OperFirewall.vue +++ b/src/linker.web/src/views/full/devices/OperFirewall.vue @@ -1,5 +1,5 @@