From b2faf65ab542d5113366e17c6b370176e6593e3d Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Fri, 13 Dec 2024 15:52:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linker.gen/InterfaceSourceGenerator.cs | 5 +- linker.tunnel/transport/TransportTcpP2PNAT.cs | 7 +- linker/plugins/access/AccessApiController.cs | 17 +- linker/plugins/access/AccessDecenter.cs | 54 +++++ linker/plugins/access/AccessStartup.cs | 1 + linker/plugins/access/AccessTransfer.cs | 72 +----- linker/plugins/client/ClientSignInTransfer.cs | 6 +- linker/plugins/client/RouteExcludeIP.cs | 18 ++ .../plugins/client/SignInArgsGroupPassword.cs | 9 +- linker/plugins/decenter/DecenterTransfer.cs | 2 +- linker/plugins/decenter/IDecenter.cs | 22 ++ .../plugins/forward/ForwardApiController.cs | 12 +- linker/plugins/forward/ForwardDecenter.cs | 54 +++++ linker/plugins/forward/ForwardStartup.cs | 1 + linker/plugins/forward/ForwardTransfer.cs | 59 +---- linker/plugins/logger/LoggerController.cs | 1 - linker/plugins/pcp/PcpConfigTransfer.cs | 5 +- linker/plugins/relay/client/RelaConfigSync.cs | 7 +- .../relay/client/RelayApiController.cs | 9 +- linker/plugins/relay/client/RelayTransfer.cs | 6 +- .../relay/server/RelayServerConfigTransfer.cs | 13 ++ .../relay/server/RelayServerNodeTransfer.cs | 21 +- linker/plugins/route/IRouteExcludeIP.cs | 9 + .../plugins/route/RouteExcludeIPTransfer.cs | 29 +++ .../route/RouteExcludeIPTypesLoader.cs | 17 ++ linker/plugins/route/RouteStartup.cs | 40 ++++ .../plugins/sforward/SForwardApiController.cs | 12 +- linker/plugins/sforward/SForwardConfigSync.cs | 3 +- linker/plugins/sforward/SForwardDecenter.cs | 59 +++++ .../sforward/SForwardServerConfigTransfer.cs | 5 - linker/plugins/sforward/SForwardStartup.cs | 2 + linker/plugins/sforward/SForwardTransfer.cs | 62 +----- linker/plugins/socks5/RouteExcludeIP.cs | 18 ++ linker/plugins/socks5/Socks5ApiController.cs | 14 +- linker/plugins/socks5/Socks5ConfigTransfer.cs | 209 +----------------- linker/plugins/socks5/Socks5Decenter.cs | 199 +++++++++++++++++ linker/plugins/socks5/Socks5Proxy.cs | 1 - linker/plugins/socks5/Socks5Startup.cs | 3 +- linker/plugins/tunnel/RouteExcludeIP.cs | 20 ++ linker/plugins/tunnel/TunnelAdapter.cs | 5 +- linker/plugins/tunnel/TunnelApiController.cs | 2 +- linker/plugins/tunnel/TunnelDecenter.cs | 12 +- .../excludeip/TunnelExcludeIPTransfer.cs | 11 +- linker/plugins/tuntap/ExcludeIP.cs | 15 ++ linker/plugins/tuntap/TuntapAdapter.cs | 21 +- linker/plugins/tuntap/TuntapApiController.cs | 2 +- linker/plugins/tuntap/TuntapDecenter.cs | 12 +- linker/plugins/tuntap/TuntapPingTransfer.cs | 2 +- version.txt | 2 +- 49 files changed, 684 insertions(+), 503 deletions(-) create mode 100644 linker/plugins/access/AccessDecenter.cs create mode 100644 linker/plugins/client/RouteExcludeIP.cs create mode 100644 linker/plugins/forward/ForwardDecenter.cs create mode 100644 linker/plugins/route/IRouteExcludeIP.cs create mode 100644 linker/plugins/route/RouteExcludeIPTransfer.cs create mode 100644 linker/plugins/route/RouteExcludeIPTypesLoader.cs create mode 100644 linker/plugins/route/RouteStartup.cs create mode 100644 linker/plugins/sforward/SForwardDecenter.cs create mode 100644 linker/plugins/socks5/RouteExcludeIP.cs create mode 100644 linker/plugins/socks5/Socks5Decenter.cs create mode 100644 linker/plugins/tunnel/RouteExcludeIP.cs diff --git a/linker.gen/InterfaceSourceGenerator.cs b/linker.gen/InterfaceSourceGenerator.cs index 0485bcb6..f4bfd9df 100644 --- a/linker.gen/InterfaceSourceGenerator.cs +++ b/linker.gen/InterfaceSourceGenerator.cs @@ -4,8 +4,6 @@ using System.Linq; using System.Collections.Generic; using Microsoft.CodeAnalysis.Text; using System.Text; -using System; -using System.Diagnostics; namespace linker.gen { @@ -25,6 +23,7 @@ namespace linker.gen new GeneratorInfo{ ClassName="ApiClientTypesLoader", ClassNameSpace="linker.plugins.capi", InterfaceName="linker.plugins.capi.IApiClientController"}, new GeneratorInfo{ ClassName="ConfigSyncTypesLoader", ClassNameSpace="linker.plugins.config", InterfaceName="linker.plugins.config.IConfigSync"}, new GeneratorInfo{ ClassName="DecenterTypesLoader", ClassNameSpace="linker.plugins.decenter", InterfaceName="linker.plugins.decenter.IDecenter"}, + new GeneratorInfo{ ClassName="RouteExcludeIPTypesLoader", ClassNameSpace="linker.plugins.route", InterfaceName="linker.plugins.route.IRouteExcludeIP" }, }; public void Initialize(IncrementalGeneratorInitializationContext context) @@ -33,7 +32,7 @@ namespace linker.gen context.RegisterSourceOutput(compilations, (sourceProductionContext, compilation) => { - + foreach (GeneratorInfo info in generators) { diff --git a/linker.tunnel/transport/TransportTcpP2PNAT.cs b/linker.tunnel/transport/TransportTcpP2PNAT.cs index 46e854fa..e73b0357 100644 --- a/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -54,7 +54,7 @@ namespace linker.tunnel.transport private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); - + public TransportTcpP2PNAT() { } @@ -174,7 +174,10 @@ namespace linker.tunnel.transport if (state.SSL) { sslStream = new SslStream(new NetworkStream(socket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); - await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 }).ConfigureAwait(false); + await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions + { + EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 + }).ConfigureAwait(false); } return new TunnelConnectionTcp diff --git a/linker/plugins/access/AccessApiController.cs b/linker/plugins/access/AccessApiController.cs index ea8dc4c0..c8c22ebd 100644 --- a/linker/plugins/access/AccessApiController.cs +++ b/linker/plugins/access/AccessApiController.cs @@ -12,41 +12,38 @@ namespace linker.plugins.access { public sealed class AccessApiController : IApiClientController { - private readonly FileConfig config; private readonly IMessengerSender sender; private readonly ClientSignInState clientSignInState; - private readonly AccessTransfer accessTransfer; + private readonly AccessDecenter accessDecenter; private readonly ClientConfigTransfer clientConfigTransfer; - public AccessApiController(FileConfig config, IMessengerSender sender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public AccessApiController(IMessengerSender sender, ClientSignInState clientSignInState, AccessDecenter accessDecenter, ClientConfigTransfer clientConfigTransfer) { - this.config = config; this.sender = sender; this.clientSignInState = clientSignInState; - this.accessTransfer = accessTransfer; + this.accessDecenter = accessDecenter; this.clientConfigTransfer = clientConfigTransfer; } public void Refresh(ApiControllerParamsInfo param) { - accessTransfer.RefreshConfig(); + accessDecenter.Refresh(); } public AccessListInfo GetAccesss(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (accessTransfer.Version.Eq(hashCode, out ulong version) == false) + if (accessDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new AccessListInfo { - HashCode = version, - List = accessTransfer.GetAccesss() - + List = accessDecenter.Accesss }; } return new AccessListInfo { HashCode = version }; } + [ClientApiAccessAttribute(ClientApiAccess.Access)] public async Task SetAccess(ApiControllerParamsInfo param) { diff --git a/linker/plugins/access/AccessDecenter.cs b/linker/plugins/access/AccessDecenter.cs new file mode 100644 index 00000000..af382452 --- /dev/null +++ b/linker/plugins/access/AccessDecenter.cs @@ -0,0 +1,54 @@ +using linker.config; +using linker.libs; +using linker.plugins.client; +using linker.plugins.decenter; +using MemoryPack; + +namespace linker.plugins.access +{ + public sealed class AccessDecenter : IDecenter + { + public string Name => "access"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + + public Dictionary Accesss { get; } = new Dictionary(); + + private readonly ClientConfigTransfer clientConfigTransfer; + private readonly AccessTransfer accessTransfer; + public AccessDecenter(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, AccessTransfer accessTransfer) + { + this.clientConfigTransfer = clientConfigTransfer; + this.accessTransfer = accessTransfer; + + clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add(); + accessTransfer.OnChanged += SyncVersion.Add; + } + public void Refresh() + { + SyncVersion.Add(); + } + public Memory GetData() + { + ConfigAccessInfo info = new ConfigAccessInfo { MachineId = clientConfigTransfer.Id, Access = accessTransfer.Access }; + Accesss[info.MachineId] = info.Access; + DataVersion.Add(); + return MemoryPackSerializer.Serialize(info); + } + public void SetData(Memory data) + { + ConfigAccessInfo access = MemoryPackSerializer.Deserialize(data.Span); + Accesss[access.MachineId] = access.Access; + DataVersion.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + foreach (var item in list) + { + Accesss[item.MachineId] = item.Access; + } + DataVersion.Add(); + } + } +} diff --git a/linker/plugins/access/AccessStartup.cs b/linker/plugins/access/AccessStartup.cs index 8ab54573..453ce34d 100644 --- a/linker/plugins/access/AccessStartup.cs +++ b/linker/plugins/access/AccessStartup.cs @@ -23,6 +23,7 @@ namespace linker.plugins.access serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config) diff --git a/linker/plugins/access/AccessTransfer.cs b/linker/plugins/access/AccessTransfer.cs index 89dd1bbf..e4fc39f7 100644 --- a/linker/plugins/access/AccessTransfer.cs +++ b/linker/plugins/access/AccessTransfer.cs @@ -1,69 +1,20 @@ using linker.config; using linker.libs; -using linker.plugins.client; -using linker.plugins.decenter; -using linker.plugins.messenger; -using MemoryPack; namespace linker.plugins.access { - public sealed class AccessTransfer : IDecenter + public sealed class AccessTransfer { - public string Name => "access"; - public VersionManager DataVersion { get; } = new VersionManager(); + public ClientApiAccess Access => fileConfig.Data.Client.Access; - public VersionManager Version { get; } = new VersionManager(); - - private Dictionary accesss = new Dictionary(); + public Action OnChanged { get; set; } = () => { }; private readonly FileConfig fileConfig; - private readonly IMessengerSender sender; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - public AccessTransfer(FileConfig fileConfig, IMessengerSender sender, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer) + public AccessTransfer(FileConfig fileConfig) { this.fileConfig = fileConfig; - this.sender = sender; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - - clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add(); } - public Memory GetData() - { - ConfigAccessInfo info = new ConfigAccessInfo { MachineId = clientConfigTransfer.Id, Access = fileConfig.Data.Client.Access }; - accesss[info.MachineId] = info.Access; - Version.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - ConfigAccessInfo access = MemoryPackSerializer.Deserialize(data.Span); - accesss[access.MachineId] = access.Access; - Version.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - accesss = list.ToDictionary(c => c.MachineId, d => d.Access); - accesss[clientConfigTransfer.Id] = fileConfig.Data.Client.Access; - Version.Add(); - } - - public void RefreshConfig() - { - DataVersion.Add(); - } - - /// - /// 获取所有人的权限 - /// - /// - public Dictionary GetAccesss() - { - return accesss; - } /// /// 设置权限 /// @@ -73,16 +24,13 @@ namespace linker.plugins.access if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access},my access {(ulong)fileConfig.Data.Client.Access}"); - //我的权限删掉它的权限==0,说明它至少拥有我的全部权限,我是它的子集,它有权管我 - if (accesss.TryGetValue(info.FromMachineId, out ClientApiAccess access) && (~access & fileConfig.Data.Client.Access) == 0) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success"); - fileConfig.Data.Client.Access = (ClientApiAccess)info.Access; - fileConfig.Data.Update(); - } - DataVersion.Add(); + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success"); + fileConfig.Data.Client.Access = (ClientApiAccess)info.Access; + fileConfig.Data.Update(); + OnChanged(); } + /// /// 合并权限 /// diff --git a/linker/plugins/client/ClientSignInTransfer.cs b/linker/plugins/client/ClientSignInTransfer.cs index 125bb9a5..5d3c6a1e 100644 --- a/linker/plugins/client/ClientSignInTransfer.cs +++ b/linker/plugins/client/ClientSignInTransfer.cs @@ -17,18 +17,14 @@ namespace linker.plugins.client public sealed class ClientSignInTransfer { private readonly ClientSignInState clientSignInState; - private readonly RunningConfig runningConfig; - private readonly FileConfig config; private readonly IMessengerSender messengerSender; private readonly IMessengerResolver messengerResolver; private readonly SignInArgsTransfer signInArgsTransfer; private readonly ClientConfigTransfer clientConfigTransfer; - public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, IMessengerSender messengerSender, IMessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, ClientConfigTransfer clientConfigTransfer) + public ClientSignInTransfer(ClientSignInState clientSignInState, IMessengerSender messengerSender, IMessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, ClientConfigTransfer clientConfigTransfer) { this.clientSignInState = clientSignInState; - this.runningConfig = runningConfig; - this.config = config; this.messengerSender = messengerSender; this.messengerResolver = messengerResolver; this.signInArgsTransfer = signInArgsTransfer; diff --git a/linker/plugins/client/RouteExcludeIP.cs b/linker/plugins/client/RouteExcludeIP.cs new file mode 100644 index 00000000..571e8b75 --- /dev/null +++ b/linker/plugins/client/RouteExcludeIP.cs @@ -0,0 +1,18 @@ +using linker.plugins.route; +using System.Net; + +namespace linker.plugins.client +{ + public sealed class RouteExcludeIPSignin : IRouteExcludeIP + { + private readonly ClientSignInState clientSignInState; + public RouteExcludeIPSignin(ClientSignInState clientSignInState) + { + this.clientSignInState = clientSignInState; + } + public List Get() + { + return new List { clientSignInState.Connection?.Address.Address ?? IPAddress.Any }; + } + } +} diff --git a/linker/plugins/client/SignInArgsGroupPassword.cs b/linker/plugins/client/SignInArgsGroupPassword.cs index 78c0d998..90077626 100644 --- a/linker/plugins/client/SignInArgsGroupPassword.cs +++ b/linker/plugins/client/SignInArgsGroupPassword.cs @@ -1,6 +1,5 @@ using linker.plugins.signIn.args; using linker.plugins.signin.messenger; -using linker.config; namespace linker.plugins.client { @@ -9,11 +8,9 @@ namespace linker.plugins.client /// public sealed class SignInArgsGroupPasswordClient : ISignInArgs { - private readonly FileConfig fileConfig; private readonly ClientConfigTransfer clientConfigTransfer; - public SignInArgsGroupPasswordClient(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) + public SignInArgsGroupPasswordClient( ClientConfigTransfer clientConfigTransfer) { - this.fileConfig = fileConfig; this.clientConfigTransfer = clientConfigTransfer; } public async Task Invoke(string host, Dictionary args) @@ -35,10 +32,8 @@ namespace linker.plugins.client /// public sealed class SignInArgsGroupPasswordServer : ISignInArgs { - private readonly FileConfig fileConfig; - public SignInArgsGroupPasswordServer(FileConfig fileConfig) + public SignInArgsGroupPasswordServer() { - this.fileConfig = fileConfig; } public async Task Invoke(string host, Dictionary args) { diff --git a/linker/plugins/decenter/DecenterTransfer.cs b/linker/plugins/decenter/DecenterTransfer.cs index 688b86c5..8ef0ff9e 100644 --- a/linker/plugins/decenter/DecenterTransfer.cs +++ b/linker/plugins/decenter/DecenterTransfer.cs @@ -50,7 +50,7 @@ namespace linker.plugins.decenter { try { - var tasks = syncs.Where(c => c.DataVersion.Reset()).Select(c => + var tasks = syncs.Where(c => c.SyncVersion.Reset()).Select(c => { return new DecenterSyncTaskInfo { diff --git a/linker/plugins/decenter/IDecenter.cs b/linker/plugins/decenter/IDecenter.cs index 516c505d..cf9a61ac 100644 --- a/linker/plugins/decenter/IDecenter.cs +++ b/linker/plugins/decenter/IDecenter.cs @@ -4,10 +4,32 @@ namespace linker.plugins.decenter { public interface IDecenter { + /// + /// 名称 + /// public string Name { get; } + /// + /// 同步版本,版本变化则同步 + /// + public VersionManager SyncVersion { get; } + /// + /// 数据版本,从收到数据则更新 + /// public VersionManager DataVersion { get; } + /// + /// 获取本地数据 + /// + /// public Memory GetData(); + /// + /// 收到远端数据 + /// + /// public void SetData(Memory data); + /// + /// 收到远端数据 + /// + /// public void SetData(List> data); } } diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker/plugins/forward/ForwardApiController.cs index 63d4c0d4..aa26c432 100644 --- a/linker/plugins/forward/ForwardApiController.cs +++ b/linker/plugins/forward/ForwardApiController.cs @@ -22,19 +22,19 @@ namespace linker.plugins.forward private readonly ForwardProxy forwardProxy; private readonly IMessengerSender messengerSender; private readonly ClientSignInState clientSignInState; - private readonly FileConfig config; private readonly AccessTransfer accessTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ForwardDecenter forwardDecenter; - public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, ForwardDecenter forwardDecenter) { this.forwardTransfer = forwardTransfer; this.forwardProxy = forwardProxy; this.messengerSender = messengerSender; this.clientSignInState = clientSignInState; - this.config = config; this.accessTransfer = accessTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.forwardDecenter = forwardDecenter; } public ConnectionListInfo Connections(ApiControllerParamsInfo param) @@ -64,16 +64,16 @@ namespace linker.plugins.forward public void Refresh(ApiControllerParamsInfo param) { - forwardTransfer.RefreshConfig(); + forwardDecenter.Refresh(); } public ForwardListInfo GetCount(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (forwardTransfer.Version.Eq(hashCode, out ulong version) == false) + if (forwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new ForwardListInfo { - List = forwardTransfer.GetCount(), + List = forwardDecenter.CountDic, HashCode = version }; } diff --git a/linker/plugins/forward/ForwardDecenter.cs b/linker/plugins/forward/ForwardDecenter.cs new file mode 100644 index 00000000..f069f61a --- /dev/null +++ b/linker/plugins/forward/ForwardDecenter.cs @@ -0,0 +1,54 @@ +using linker.libs; +using linker.plugins.client; +using linker.plugins.decenter; +using MemoryPack; +using System.Collections.Concurrent; + +namespace linker.plugins.forward +{ + public sealed class ForwardDecenter:IDecenter + { + public string Name => "forward"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + public ConcurrentDictionary CountDic { get; }= new ConcurrentDictionary(); + + + private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ForwardTransfer forwardTransfer; + public ForwardDecenter(ClientConfigTransfer clientConfigTransfer, ForwardTransfer forwardTransfer) + { + this.clientConfigTransfer = clientConfigTransfer; + this.forwardTransfer = forwardTransfer; + forwardTransfer.OnReset += CountDic.Clear; + forwardTransfer.OnChanged += SyncVersion.Add; + } + + public Memory GetData() + { + CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = forwardTransfer.Count }; + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + DataVersion.Add(); + return MemoryPackSerializer.Serialize(info); + } + public void SetData(Memory data) + { + CountInfo info = MemoryPackSerializer.Deserialize(data.Span); + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + DataVersion.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + foreach (var info in list) + { + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + } + DataVersion.Add(); + } + public void Refresh() + { + SyncVersion.Add(); + } + } +} diff --git a/linker/plugins/forward/ForwardStartup.cs b/linker/plugins/forward/ForwardStartup.cs index 4dc73030..1f2a445b 100644 --- a/linker/plugins/forward/ForwardStartup.cs +++ b/linker/plugins/forward/ForwardStartup.cs @@ -24,6 +24,7 @@ namespace linker.plugins.forward serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config) diff --git a/linker/plugins/forward/ForwardTransfer.cs b/linker/plugins/forward/ForwardTransfer.cs index 812288f0..f166a432 100644 --- a/linker/plugins/forward/ForwardTransfer.cs +++ b/linker/plugins/forward/ForwardTransfer.cs @@ -1,21 +1,18 @@ using linker.client.config; -using linker.config; using linker.libs; using linker.plugins.client; -using linker.plugins.decenter; using linker.plugins.forward.proxy; using linker.plugins.messenger; using MemoryPack; -using System.Collections.Concurrent; namespace linker.plugins.forward { - public sealed class ForwardTransfer : IDecenter + public sealed class ForwardTransfer { - public string Name => "forward"; - public VersionManager DataVersion { get; } = new VersionManager(); + public int Count => running.Data.Forwards.Count(c => c.GroupId == clientConfigTransfer.Group.Id); + public Action OnChanged { get; set; } = () => { }; + public Action OnReset{ get; set; } = () => { }; - private readonly FileConfig fileConfig; private readonly RunningConfig running; private readonly ForwardProxy forwardProxy; private readonly ClientSignInState clientSignInState; @@ -23,13 +20,9 @@ namespace linker.plugins.forward private readonly ClientConfigTransfer clientConfigTransfer; private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); - private readonly ConcurrentDictionary countDic = new ConcurrentDictionary(); - public VersionManager Version { get; } = new VersionManager(); - - public ForwardTransfer(FileConfig fileConfig, RunningConfig running, ForwardProxy forwardProxy, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) + public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) { - this.fileConfig = fileConfig; this.running = running; this.forwardProxy = forwardProxy; this.clientSignInState = clientSignInState; @@ -37,40 +30,6 @@ namespace linker.plugins.forward this.clientConfigTransfer = clientConfigTransfer; clientSignInState.NetworkEnabledHandle += Reset; - - } - - public Memory GetData() - { - CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = running.Data.Forwards.Count(c => c.GroupId == clientConfigTransfer.Group.Id) }; - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - Version.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - CountInfo info = MemoryPackSerializer.Deserialize(data.Span); - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - Version.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var info in list) - { - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - } - Version.Add(); - } - public void RefreshConfig() - { - DataVersion.Add(); - } - - public ConcurrentDictionary GetCount() - { - DataVersion.Add(); - return countDic; } string groupid = string.Empty; @@ -89,7 +48,7 @@ namespace linker.plugins.forward if (groupid != clientConfigTransfer.Group.Id) { - countDic.Clear(); + OnReset(); Stop(); } groupid = clientConfigTransfer.Group.Id; @@ -117,7 +76,7 @@ namespace linker.plugins.forward Stop(item); } } - DataVersion.Add(); + OnChanged(); } } private void Start(ForwardInfo forwardInfo, bool errorStop = true) @@ -157,7 +116,7 @@ namespace linker.plugins.forward } } - Version.Add(); + OnChanged(); } private void Stop() @@ -185,7 +144,7 @@ namespace linker.plugins.forward { LoggerHelper.Instance.Error(ex); } - Version.Add(); + OnChanged(); } public List Get() diff --git a/linker/plugins/logger/LoggerController.cs b/linker/plugins/logger/LoggerController.cs index 2b2f44db..8a4438fc 100644 --- a/linker/plugins/logger/LoggerController.cs +++ b/linker/plugins/logger/LoggerController.cs @@ -51,7 +51,6 @@ namespace linker.plugins.logger return true; } - public LoggerSetParamInfo GetConfig(ApiControllerParamsInfo param) { return new LoggerSetParamInfo diff --git a/linker/plugins/pcp/PcpConfigTransfer.cs b/linker/plugins/pcp/PcpConfigTransfer.cs index 48e05045..d45cb08a 100644 --- a/linker/plugins/pcp/PcpConfigTransfer.cs +++ b/linker/plugins/pcp/PcpConfigTransfer.cs @@ -12,6 +12,7 @@ namespace linker.plugins.pcp public sealed class PcpConfigTransfer : IDecenter { public string Name => "pcp"; + public VersionManager SyncVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager(); private ConcurrentDictionary> history = new ConcurrentDictionary>(); @@ -27,7 +28,7 @@ namespace linker.plugins.pcp this.clientSignInState = clientSignInState; this.clientConfigTransfer = clientConfigTransfer; - clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add(); + clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add(); } public void AddHistory(ITunnelConnection connection) @@ -36,7 +37,7 @@ namespace linker.plugins.pcp { runningConfig.Data.TunnelHistory.History.Add(connection.RemoteMachineId); runningConfig.Data.Update(); - DataVersion.Add(); + SyncVersion.Add(); } } public List GetNodes(string fromMachineId, string toMachineId) diff --git a/linker/plugins/relay/client/RelaConfigSync.cs b/linker/plugins/relay/client/RelaConfigSync.cs index f2122ac6..d049dcb4 100644 --- a/linker/plugins/relay/client/RelaConfigSync.cs +++ b/linker/plugins/relay/client/RelaConfigSync.cs @@ -1,5 +1,4 @@ -using linker.config; -using linker.plugins.config; +using linker.plugins.config; using MemoryPack; namespace linker.plugins.relay.client @@ -8,11 +7,9 @@ namespace linker.plugins.relay.client { public string Name => "RelaySecretKey"; - private readonly FileConfig fileConfig; private readonly RelayClientConfigTransfer relayClientConfigTransfer; - public RelaConfigSyncSecretKey(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer) + public RelaConfigSyncSecretKey(RelayClientConfigTransfer relayClientConfigTransfer) { - this.fileConfig = fileConfig; this.relayClientConfigTransfer = relayClientConfigTransfer; } public Memory GetData() diff --git a/linker/plugins/relay/client/RelayApiController.cs b/linker/plugins/relay/client/RelayApiController.cs index 41b5e92e..3330419d 100644 --- a/linker/plugins/relay/client/RelayApiController.cs +++ b/linker/plugins/relay/client/RelayApiController.cs @@ -1,5 +1,4 @@ -using linker.client.config; -using linker.config; +using linker.config; using linker.libs.api; using linker.libs.extends; using linker.plugins.capi; @@ -11,16 +10,12 @@ namespace linker.plugins.relay.client /// public sealed class RelayApiController : IApiClientController { - private readonly FileConfig config; - private readonly RunningConfig runningConfig; private readonly RelayTestTransfer relayTestTransfer; private readonly RelayTransfer relayTransfer; private readonly RelayClientConfigTransfer relayClientConfigTransfer; - public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + public RelayApiController(RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer) { - this.config = config; - this.runningConfig = runningConfig; this.relayTestTransfer = relayTestTransfer; this.relayTransfer = relayTransfer; this.relayClientConfigTransfer = relayClientConfigTransfer; diff --git a/linker/plugins/relay/client/RelayTransfer.cs b/linker/plugins/relay/client/RelayTransfer.cs index 54559e36..14176b5d 100644 --- a/linker/plugins/relay/client/RelayTransfer.cs +++ b/linker/plugins/relay/client/RelayTransfer.cs @@ -14,16 +14,12 @@ namespace linker.plugins.relay.client { public List Transports { get; private set; } - - private readonly FileConfig fileConfig; - private ConcurrentDictionary connectingDic = new ConcurrentDictionary(); private Dictionary>> OnConnected { get; } = new Dictionary>>(); private readonly RelayClientConfigTransfer relayClientConfigTransfer; - public RelayTransfer(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer) + public RelayTransfer(RelayClientConfigTransfer relayClientConfigTransfer) { - this.fileConfig = fileConfig; this.relayClientConfigTransfer = relayClientConfigTransfer; } diff --git a/linker/plugins/relay/server/RelayServerConfigTransfer.cs b/linker/plugins/relay/server/RelayServerConfigTransfer.cs index f1ed672e..35d07cd8 100644 --- a/linker/plugins/relay/server/RelayServerConfigTransfer.cs +++ b/linker/plugins/relay/server/RelayServerConfigTransfer.cs @@ -14,5 +14,18 @@ namespace linker.plugins.relay.server { this.config = config; } + + public void SetMaxGbTotalMonth(int month) + { + Node.MaxGbTotalMonth = month; + } + public void SetMaxGbTotalLastBytes(ulong value) + { + Node.MaxGbTotalLastBytes = value; + } + public void Update() + { + config.Data.Update(); + } } } diff --git a/linker/plugins/relay/server/RelayServerNodeTransfer.cs b/linker/plugins/relay/server/RelayServerNodeTransfer.cs index 7d1d5bc9..cf224280 100644 --- a/linker/plugins/relay/server/RelayServerNodeTransfer.cs +++ b/linker/plugins/relay/server/RelayServerNodeTransfer.cs @@ -36,12 +36,10 @@ namespace linker.plugins.relay.server this.serverConfigTransfer = serverConfigTransfer; limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0)); - ResetBytes(); cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey); cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey); ReportTask(); - } public async ValueTask TryGetRelayCache(string key, string nodeid) @@ -143,8 +141,8 @@ namespace linker.plugins.relay.server } if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length) - relayServerConfigTransfer.Node.MaxGbTotalLastBytes -= length; - else relayServerConfigTransfer.Node.MaxGbTotalLastBytes = 0; + relayServerConfigTransfer.SetMaxGbTotalLastBytes(relayServerConfigTransfer.Node.MaxGbTotalLastBytes - length); + else relayServerConfigTransfer.SetMaxGbTotalLastBytes(0); return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0; } @@ -179,21 +177,20 @@ namespace linker.plugins.relay.server { if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month) { - relayServerConfigTransfer.Node.MaxGbTotalMonth = DateTime.Now.Month; - relayServerConfigTransfer.Node.MaxGbTotalLastBytes = (ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024); - fileConfig.Data.Update(); + relayServerConfigTransfer.SetMaxGbTotalMonth(DateTime.Now.Month); + relayServerConfigTransfer.SetMaxGbTotalLastBytes((ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024)); } + relayServerConfigTransfer.Update(); } private void ReportTask() { TimerHelper.SetInterval(async () => { - ResetBytes(); - IEnumerable nodes = new List { + //默认报告给自己,作为本服务器的一个默认中继节点 new RelayNodeInfo{ Id = RelayNodeInfo.MASTER_NODE_ID, Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(), @@ -208,6 +205,7 @@ namespace linker.plugins.relay.server Name = "default", Public = false }, + //配置的中继节点 relayServerConfigTransfer.Node }.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false) .Where(c => string.IsNullOrWhiteSpace(c.Name) == false && string.IsNullOrWhiteSpace(c.Id) == false); @@ -222,7 +220,6 @@ namespace linker.plugins.relay.server ICrypto crypto = node.Id == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode; IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, serverConfigTransfer.Port) ?? new IPEndPoint(IPAddress.Any, serverConfigTransfer.Port); - RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo { Id = node.Id, @@ -253,12 +250,8 @@ namespace linker.plugins.relay.server { } } - - return true; }, () => 5000); } } - - } diff --git a/linker/plugins/route/IRouteExcludeIP.cs b/linker/plugins/route/IRouteExcludeIP.cs new file mode 100644 index 00000000..ed874c93 --- /dev/null +++ b/linker/plugins/route/IRouteExcludeIP.cs @@ -0,0 +1,9 @@ +using System.Net; + +namespace linker.plugins.route +{ + public interface IRouteExcludeIP + { + public List Get(); + } +} diff --git a/linker/plugins/route/RouteExcludeIPTransfer.cs b/linker/plugins/route/RouteExcludeIPTransfer.cs new file mode 100644 index 00000000..3e17e0a8 --- /dev/null +++ b/linker/plugins/route/RouteExcludeIPTransfer.cs @@ -0,0 +1,29 @@ +using System.Net; + +namespace linker.plugins.route +{ + public sealed partial class RouteExcludeIPTransfer + { + private List excludeIPs; + + public RouteExcludeIPTransfer() + { + } + + public void LoadTunnelExcludeIPs(List list) + { + excludeIPs = list; + + } + + public List Get() + { + List result = new List(); + foreach (var item in excludeIPs) + { + result.AddRange(item.Get()); + } + return result; + } + } +} diff --git a/linker/plugins/route/RouteExcludeIPTypesLoader.cs b/linker/plugins/route/RouteExcludeIPTypesLoader.cs new file mode 100644 index 00000000..6161a0d7 --- /dev/null +++ b/linker/plugins/route/RouteExcludeIPTypesLoader.cs @@ -0,0 +1,17 @@ +using linker.libs; +using Microsoft.Extensions.DependencyInjection; + +namespace linker.plugins.route +{ + public sealed partial class RouteExcludeIPTypesLoader + { + public RouteExcludeIPTypesLoader(RouteExcludeIPTransfer tunnelExcludeIPTransfer, ServiceProvider serviceProvider) + { + var types = GetSourceGeneratorTypes(); + var flows = types.Select(c => (IRouteExcludeIP)serviceProvider.GetService(c)).Where(c => c != null).ToList(); + tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(flows); + + LoggerHelper.Instance.Info($"load route excludeips :{string.Join(",", flows.Select(c => c.GetType().Name))}"); + } + } +} diff --git a/linker/plugins/route/RouteStartup.cs b/linker/plugins/route/RouteStartup.cs new file mode 100644 index 00000000..98d9f79d --- /dev/null +++ b/linker/plugins/route/RouteStartup.cs @@ -0,0 +1,40 @@ +using linker.config; +using linker.startup; +using Microsoft.Extensions.DependencyInjection; + +namespace linker.plugins.route +{ + public sealed class RouteStartup : IStartup + { + public StartupLevel Level => StartupLevel.Normal; + public string Name => "route"; + + public bool Required => false; + + public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; + + public StartupLoadType LoadType => StartupLoadType.Normal; + + public void AddClient(ServiceCollection serviceCollection, FileConfig config) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + } + + public void AddServer(ServiceCollection serviceCollection, FileConfig config) + { + } + + public void UseClient(ServiceProvider serviceProvider, FileConfig config) + { + RouteExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService(); + RouteExcludeIPTypesLoader ruteExcludeIPTypesLoader = serviceProvider.GetService(); + + } + + public void UseServer(ServiceProvider serviceProvider, FileConfig config) + { + + } + } +} diff --git a/linker/plugins/sforward/SForwardApiController.cs b/linker/plugins/sforward/SForwardApiController.cs index 92d027ba..b888ecbc 100644 --- a/linker/plugins/sforward/SForwardApiController.cs +++ b/linker/plugins/sforward/SForwardApiController.cs @@ -17,18 +17,18 @@ namespace linker.plugins.sforward private readonly SForwardTransfer forwardTransfer; private readonly IMessengerSender messengerSender; private readonly ClientSignInState clientSignInState; - private readonly FileConfig config; private readonly AccessTransfer accessTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly SForwardDecenter sForwardDecenter; - public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, SForwardDecenter sForwardDecenter) { this.forwardTransfer = forwardTransfer; this.messengerSender = messengerSender; this.clientSignInState = clientSignInState; - this.config = config; this.accessTransfer = accessTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.sForwardDecenter = sForwardDecenter; } /// @@ -53,7 +53,7 @@ namespace linker.plugins.sforward public void Refresh(ApiControllerParamsInfo param) { - forwardTransfer.RefreshConfig(); + sForwardDecenter.Refresh(); } /// /// 获取数量 @@ -63,11 +63,11 @@ namespace linker.plugins.sforward public SForwardListInfo GetCount(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (forwardTransfer.Version.Eq(hashCode, out ulong version) == false) + if (sForwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new SForwardListInfo { - List = forwardTransfer.GetCount(), + List = sForwardDecenter.CountDic, HashCode = version }; } diff --git a/linker/plugins/sforward/SForwardConfigSync.cs b/linker/plugins/sforward/SForwardConfigSync.cs index ef41dc20..a6dc278c 100644 --- a/linker/plugins/sforward/SForwardConfigSync.cs +++ b/linker/plugins/sforward/SForwardConfigSync.cs @@ -1,5 +1,4 @@ -using linker.config; -using linker.plugins.config; +using linker.plugins.config; using MemoryPack; namespace linker.plugins.sforward diff --git a/linker/plugins/sforward/SForwardDecenter.cs b/linker/plugins/sforward/SForwardDecenter.cs new file mode 100644 index 00000000..e992d3b8 --- /dev/null +++ b/linker/plugins/sforward/SForwardDecenter.cs @@ -0,0 +1,59 @@ +using linker.libs; +using linker.plugins.client; +using linker.plugins.decenter; +using MemoryPack; +using System.Collections.Concurrent; + +namespace linker.plugins.sforward +{ + public sealed class SForwardDecenter : IDecenter + { + public string Name => "sforward"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + + public ConcurrentDictionary CountDic { get; } = new ConcurrentDictionary(); + + private readonly ClientConfigTransfer clientConfigTransfer; + private readonly SForwardTransfer sForwardTransfer; + public SForwardDecenter( ClientConfigTransfer clientConfigTransfer, SForwardTransfer sForwardTransfer) + { + this.clientConfigTransfer = clientConfigTransfer; + this.sForwardTransfer = sForwardTransfer; + } + + public Memory GetData() + { + CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = sForwardTransfer.Count }; + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + DataVersion.Add(); + return MemoryPackSerializer.Serialize(info); + } + public void SetData(Memory data) + { + CountInfo info = MemoryPackSerializer.Deserialize(data.Span); + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + DataVersion.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + foreach (var info in list) + { + CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); + } + DataVersion.Add(); + } + public void Refresh() + { + SyncVersion.Add(); + } + } + + [MemoryPackable] + public sealed partial class CountInfo + { + public string MachineId { get; set; } + public int Count { get; set; } + } +} diff --git a/linker/plugins/sforward/SForwardServerConfigTransfer.cs b/linker/plugins/sforward/SForwardServerConfigTransfer.cs index 80dabd84..ba06cb59 100644 --- a/linker/plugins/sforward/SForwardServerConfigTransfer.cs +++ b/linker/plugins/sforward/SForwardServerConfigTransfer.cs @@ -1,9 +1,4 @@ using linker.config; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace linker.plugins.sforward { diff --git a/linker/plugins/sforward/SForwardStartup.cs b/linker/plugins/sforward/SForwardStartup.cs index 4196a958..e3af0185 100644 --- a/linker/plugins/sforward/SForwardStartup.cs +++ b/linker/plugins/sforward/SForwardStartup.cs @@ -30,6 +30,8 @@ namespace linker.plugins.sforward serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + } public void AddServer(ServiceCollection serviceCollection, FileConfig config) diff --git a/linker/plugins/sforward/SForwardTransfer.cs b/linker/plugins/sforward/SForwardTransfer.cs index 812398c5..0c26a3b0 100644 --- a/linker/plugins/sforward/SForwardTransfer.cs +++ b/linker/plugins/sforward/SForwardTransfer.cs @@ -9,20 +9,15 @@ using linker.libs.extends; using linker.plugins.client; using linker.plugins.messenger; using linker.config; -using System.Collections.Concurrent; -using linker.plugins.decenter; namespace linker.plugins.sforward { - public sealed class SForwardTransfer : IDecenter + public sealed class SForwardTransfer { - public string Name => "sforward"; - public VersionManager DataVersion { get; } = new VersionManager(); - - public VersionManager Version { get; } = new VersionManager(); - public string SecretKey => fileConfig.Data.Client.SForward.SecretKey; + public int Count => running.Data.SForwards.Count; + public Action OnChanged { get; set; } = () => { }; private readonly FileConfig fileConfig; private readonly RunningConfig running; @@ -31,11 +26,8 @@ namespace linker.plugins.sforward private readonly ClientConfigTransfer clientConfigTransfer; private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); - private readonly ConcurrentDictionary countDic = new ConcurrentDictionary(); private readonly OperatingManager operatingManager = new OperatingManager(); - - public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) { this.fileConfig = fileConfig; @@ -47,37 +39,7 @@ namespace linker.plugins.sforward clientSignInState.NetworkFirstEnabledHandle += () => Start(); } - public Memory GetData() - { - CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = running.Data.SForwards.Count }; - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - Version.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - CountInfo info = MemoryPackSerializer.Deserialize(data.Span); - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - Version.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var info in list) - { - countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); - } - Version.Add(); - } - public void RefreshConfig() - { - DataVersion.Add(); - } - public ConcurrentDictionary GetCount() - { - return countDic; - } - + public void SetSecretKey(string key) { fileConfig.Data.Client.SForward.SecretKey = key; @@ -101,7 +63,7 @@ namespace linker.plugins.sforward } } - DataVersion.Add(); + OnChanged(); } private void Start(SForwardInfo forwardInfo) { @@ -147,7 +109,7 @@ namespace linker.plugins.sforward LoggerHelper.Instance.Error(ex); } - Version.Add(); + OnChanged(); } private void Stop(SForwardInfo forwardInfo) { @@ -184,7 +146,7 @@ namespace linker.plugins.sforward { LoggerHelper.Instance.Error(ex); } - Version.Add(); + OnChanged(); } public List Get() @@ -278,7 +240,7 @@ namespace linker.plugins.sforward forward.LocalMsg = item.Item2; } } - Version.Add(); + OnChanged(); } catch (Exception) { @@ -301,13 +263,5 @@ namespace linker.plugins.sforward } } } - - } - - [MemoryPackable] - public sealed partial class CountInfo - { - public string MachineId { get; set; } - public int Count { get; set; } } } diff --git a/linker/plugins/socks5/RouteExcludeIP.cs b/linker/plugins/socks5/RouteExcludeIP.cs new file mode 100644 index 00000000..7f6385c3 --- /dev/null +++ b/linker/plugins/socks5/RouteExcludeIP.cs @@ -0,0 +1,18 @@ +using linker.plugins.route; +using System.Net; + +namespace linker.plugins.socks5 +{ + public sealed class RouteExcludeIPSocks5 : IRouteExcludeIP + { + private readonly Socks5ConfigTransfer socks5ConfigTransfer; + public RouteExcludeIPSocks5(Socks5ConfigTransfer socks5ConfigTransfer) + { + this.socks5ConfigTransfer = socks5ConfigTransfer; + } + public List Get() + { + return socks5ConfigTransfer.Lans.Select(c => c.IP).ToList(); + } + } +} diff --git a/linker/plugins/socks5/Socks5ApiController.cs b/linker/plugins/socks5/Socks5ApiController.cs index bd6c286b..269a6d2a 100644 --- a/linker/plugins/socks5/Socks5ApiController.cs +++ b/linker/plugins/socks5/Socks5ApiController.cs @@ -19,22 +19,20 @@ namespace linker.plugins.socks5 private readonly IMessengerSender messengerSender; private readonly Socks5ConfigTransfer socks5ConfigTransfer; private readonly ClientSignInState clientSignInState; - private readonly FileConfig config; private readonly TunnelProxy tunnelProxy; - private readonly RunningConfig runningConfig; private readonly AccessTransfer accessTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly Socks5Decenter socks5Decenter; - public Socks5ClientApiController(IMessengerSender messengerSender, Socks5ConfigTransfer socks5ConfigTransfer, ClientSignInState clientSignInState, FileConfig config, TunnelProxy tunnelProxy, RunningConfig runningConfig, Socks5ConfigTransfer Socks5ConfigTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public Socks5ClientApiController(IMessengerSender messengerSender, Socks5ConfigTransfer socks5ConfigTransfer, ClientSignInState clientSignInState, TunnelProxy tunnelProxy, Socks5ConfigTransfer Socks5ConfigTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, Socks5Decenter socks5Decenter) { this.messengerSender = messengerSender; this.socks5ConfigTransfer = socks5ConfigTransfer; this.clientSignInState = clientSignInState; - this.config = config; this.tunnelProxy = tunnelProxy; - this.runningConfig = runningConfig; this.accessTransfer = accessTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.socks5Decenter = socks5Decenter; } public ConnectionListInfo Connections(ApiControllerParamsInfo param) @@ -65,11 +63,11 @@ namespace linker.plugins.socks5 public Socks5ListInfo Get(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (socks5ConfigTransfer.Version.Eq(hashCode, out ulong version) == false) + if (socks5Decenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new Socks5ListInfo { - List = socks5ConfigTransfer.Infos, + List = socks5Decenter.Infos, HashCode = version }; } @@ -81,7 +79,7 @@ namespace linker.plugins.socks5 /// public void Refresh(ApiControllerParamsInfo param) { - socks5ConfigTransfer.RefreshConfig(); + socks5Decenter.Refresh(); } /// diff --git a/linker/plugins/socks5/Socks5ConfigTransfer.cs b/linker/plugins/socks5/Socks5ConfigTransfer.cs index 5c9e20ca..41469bf7 100644 --- a/linker/plugins/socks5/Socks5ConfigTransfer.cs +++ b/linker/plugins/socks5/Socks5ConfigTransfer.cs @@ -1,133 +1,31 @@ using linker.client.config; using linker.config; using linker.libs; -using MemoryPack; -using System.Collections.Concurrent; -using System.Net; -using linker.plugins.client; -using linker.plugins.messenger; using linker.plugins.socks5.config; -using linker.plugins.decenter; -using linker.plugins.tunnel; -using linker.plugins.tuntap; namespace linker.plugins.socks5 { - public sealed class Socks5ConfigTransfer : IDecenter + public sealed class Socks5ConfigTransfer { - public string Name => "socks5"; - public VersionManager DataVersion { get; } = new VersionManager(); + public List Lans=> runningConfig.Data.Socks5.Lans; + public int Port=> runningConfig.Data.Socks5.Port; + public Action OnChanged { get; set; } = () => { }; - private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; private readonly FileConfig config; private readonly RunningConfig runningConfig; private readonly TunnelProxy tunnelProxy; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly TunnelConfigTransfer tunnelConfigTransfer; - private readonly TuntapConfigTransfer tuntapConfigTransfer; - - public VersionManager Version { get; } = new VersionManager(); - private readonly ConcurrentDictionary socks5Infos = new ConcurrentDictionary(); - public ConcurrentDictionary Infos => socks5Infos; - - private readonly SemaphoreSlim slim = new SemaphoreSlim(1); - public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer) + public Socks5ConfigTransfer(FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy) { - this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; this.config = config; this.runningConfig = runningConfig; this.tunnelProxy = tunnelProxy; - this.clientConfigTransfer = clientConfigTransfer; - this.tunnelConfigTransfer = tunnelConfigTransfer; - this.tuntapConfigTransfer = tuntapConfigTransfer; - - clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add(); - tunnelProxy.RefreshConfig += RefreshConfig; if (runningConfig.Data.Socks5.Running) Retstart(); } - public Memory GetData() - { - Socks5Info info = new Socks5Info - { - Lans = runningConfig.Data.Socks5.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), - MachineId = clientConfigTransfer.Id, - Status = tunnelProxy.Running ? Socks5Status.Running : Socks5Status.Normal, - Port = runningConfig.Data.Socks5.Port, - SetupError = tunnelProxy.Error - }; - socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - Socks5Info info = MemoryPackSerializer.Deserialize(data.Span); - TimerHelper.Async(async () => - { - await slim.WaitAsync(); - try - { - socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); - AddRoute(); - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Error(ex); - } - } - slim.Release(); - }); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - TimerHelper.Async(async () => - { - await slim.WaitAsync(); - - try - { - foreach (var item in list) - { - socks5Infos.AddOrUpdate(item.MachineId, item, (a, b) => item); - item.LastTicks.Update(); - } - var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); - foreach (var item in removes) - { - if (socks5Infos.TryGetValue(item, out Socks5Info socks5Info)) - { - socks5Info.Status = Socks5Status.Normal; - socks5Info.LastTicks.Clear(); - } - } - Version.Add(); - AddRoute(); - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Error(ex); - } - } - finally - { - slim.Release(); - } - - }); - } - + /// /// 重启 /// @@ -137,8 +35,7 @@ namespace linker.plugins.socks5 tunnelProxy.Start(runningConfig.Data.Socks5.Port); runningConfig.Data.Socks5.Running = tunnelProxy.Running; runningConfig.Data.Update(); - GetData(); - DataVersion.Add(); + OnChanged(); } /// /// 网卡 @@ -148,17 +45,9 @@ namespace linker.plugins.socks5 tunnelProxy.Stop(); runningConfig.Data.Socks5.Running = tunnelProxy.Running; runningConfig.Data.Update(); - GetData(); - DataVersion.Add(); + OnChanged(); } - /// - /// 刷新信息,把自己的配置发给别人,顺便把别人的信息带回来 - /// - public void RefreshConfig() - { - DataVersion.Add(); - } /// /// 更新本机信息 /// @@ -180,88 +69,8 @@ namespace linker.plugins.socks5 { Retstart(); } - GetData(); - DataVersion.Add(); + OnChanged(); }); } - - /// - /// 添加路由 - /// - private void AddRoute() - { - List ipsList = ParseIPs(socks5Infos.Values.ToList()); - Socks5LanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); - - tunnelProxy.SetIPs(ips); - Version.Add(); - } - - private List ParseIPs(List infos) - { - //排除的IP, - uint[] excludeIps =//本机局域网IP - tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - //路由上的IP - .Concat(tunnelConfigTransfer.RouteIPs) - //网卡IP 服务器IP - .Concat(new IPAddress[] { tuntapConfigTransfer.IP, clientSignInState.Connection.Address.Address }) - //网卡配置的局域网IP - .Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP)) - .Select(NetworkHelper.IP2Value) - .ToArray(); - - HashSet hashSet = new HashSet(); - - return infos - .Where(c => c.MachineId != clientConfigTransfer.Id) - .OrderByDescending(c => c.Status) - .OrderByDescending(c => c.LastTicks.Value) - - .Select(c => - { - var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c => - { - uint ipInt = NetworkHelper.IP2Value(c.IP); - uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength); - uint network = ipInt & maskValue; - c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network); - hashSet.Add(network); - return c.Exists == false; - }); - - return new Socks5LanIPAddressList - { - MachineId = c.MachineId, - IPS = ParseIPs(lans.ToList(), c.MachineId) - .Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(), - }; - }).ToList(); - } - private List ParseIPs(List lans, string machineid) - { - return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) => - { - return ParseIPAddress(c.IP, c.PrefixLength, machineid); - - }).ToList(); - } - private Socks5LanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid) - { - uint ipInt = NetworkHelper.IP2Value(ip); - //掩码十进制 - uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength); - return new Socks5LanIPAddress - { - IPAddress = ipInt, - PrefixLength = prefixLength, - MaskValue = maskValue, - NetWork = ipInt & maskValue, - Broadcast = ipInt | ~maskValue, - OriginIPAddress = ip, - MachineId = machineid - }; - } - } } diff --git a/linker/plugins/socks5/Socks5Decenter.cs b/linker/plugins/socks5/Socks5Decenter.cs new file mode 100644 index 00000000..0239bf16 --- /dev/null +++ b/linker/plugins/socks5/Socks5Decenter.cs @@ -0,0 +1,199 @@ +using linker.libs; +using linker.plugins.client; +using linker.plugins.decenter; +using linker.plugins.route; +using linker.plugins.socks5.config; +using linker.plugins.tunnel; +using linker.plugins.tuntap; +using MemoryPack; +using System.Collections.Concurrent; +using System.Net; + +namespace linker.plugins.socks5 +{ + public sealed class Socks5Decenter : IDecenter + { + public string Name => "socks5"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + private readonly ConcurrentDictionary socks5Infos = new ConcurrentDictionary(); + public ConcurrentDictionary Infos => socks5Infos; + + private readonly ClientSignInState clientSignInState; + private readonly TunnelProxy tunnelProxy; + private readonly ClientConfigTransfer clientConfigTransfer; + private readonly Socks5ConfigTransfer socks5ConfigTransfer; + private readonly RouteExcludeIPTransfer routeExcludeIPTransfer; + + private readonly SemaphoreSlim slim = new SemaphoreSlim(1); + public Socks5Decenter( ClientSignInState clientSignInState, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, Socks5ConfigTransfer socks5ConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer) + { + this.clientSignInState = clientSignInState; + this.tunnelProxy = tunnelProxy; + this.clientConfigTransfer = clientConfigTransfer; + this.socks5ConfigTransfer = socks5ConfigTransfer; + this.routeExcludeIPTransfer = routeExcludeIPTransfer; + + clientSignInState.NetworkEnabledHandle += (times) => Refresh(); + tunnelProxy.RefreshConfig += Refresh; + socks5ConfigTransfer.OnChanged += Refresh; + + + } + + /// + /// 刷新信息,把自己的配置发给别人,顺便把别人的信息带回来 + /// + public void Refresh() + { + SyncVersion.Add(); + } + public Memory GetData() + { + Socks5Info info = new Socks5Info + { + Lans = socks5ConfigTransfer.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), + MachineId = clientConfigTransfer.Id, + Status = tunnelProxy.Running ? Socks5Status.Running : Socks5Status.Normal, + Port = socks5ConfigTransfer.Port, + SetupError = tunnelProxy.Error + }; + socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); + DataVersion.Add(); + return MemoryPackSerializer.Serialize(info); + } + public void SetData(Memory data) + { + Socks5Info info = MemoryPackSerializer.Deserialize(data.Span); + TimerHelper.Async(async () => + { + await slim.WaitAsync(); + try + { + socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); + DataVersion.Add(); + AddRoute(); + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } + } + slim.Release(); + }); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + TimerHelper.Async(async () => + { + await slim.WaitAsync(); + + try + { + foreach (var item in list) + { + socks5Infos.AddOrUpdate(item.MachineId, item, (a, b) => item); + item.LastTicks.Update(); + } + var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); + foreach (var item in removes) + { + if (socks5Infos.TryGetValue(item, out Socks5Info socks5Info)) + { + socks5Info.Status = Socks5Status.Normal; + socks5Info.LastTicks.Clear(); + } + } + DataVersion.Add(); + AddRoute(); + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } + } + finally + { + slim.Release(); + } + + }); + } + + /// + /// 添加路由 + /// + private void AddRoute() + { + List ipsList = ParseIPs(socks5Infos.Values.ToList()); + Socks5LanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); + + tunnelProxy.SetIPs(ips); + } + + private List ParseIPs(List infos) + { + //排除的IP, + uint[] excludeIps = routeExcludeIPTransfer.Get().Concat(socks5ConfigTransfer.Lans.Select(c => c.IP)) + .Select(NetworkHelper.IP2Value) + .ToArray(); + + HashSet hashSet = new HashSet(); + + return infos + .Where(c => c.MachineId != clientConfigTransfer.Id) + .OrderByDescending(c => c.Status) + .OrderByDescending(c => c.LastTicks.Value) + + .Select(c => + { + var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c => + { + uint ipInt = NetworkHelper.IP2Value(c.IP); + uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength); + uint network = ipInt & maskValue; + c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network); + hashSet.Add(network); + return c.Exists == false; + }); + + return new Socks5LanIPAddressList + { + MachineId = c.MachineId, + IPS = ParseIPs(lans.ToList(), c.MachineId) + .Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(), + }; + }).ToList(); + } + private List ParseIPs(List lans, string machineid) + { + return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) => + { + return ParseIPAddress(c.IP, c.PrefixLength, machineid); + + }).ToList(); + } + private Socks5LanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid) + { + uint ipInt = NetworkHelper.IP2Value(ip); + //掩码十进制 + uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength); + return new Socks5LanIPAddress + { + IPAddress = ipInt, + PrefixLength = prefixLength, + MaskValue = maskValue, + NetWork = ipInt & maskValue, + Broadcast = ipInt | ~maskValue, + OriginIPAddress = ip, + MachineId = machineid + }; + } + + } +} diff --git a/linker/plugins/socks5/Socks5Proxy.cs b/linker/plugins/socks5/Socks5Proxy.cs index 138e01b1..e6f3ba7a 100644 --- a/linker/plugins/socks5/Socks5Proxy.cs +++ b/linker/plugins/socks5/Socks5Proxy.cs @@ -12,7 +12,6 @@ using linker.plugins.client; using linker.plugins.socks5.config; using System.Text; using linker.plugins.relay.client; -using linker.client.config; using linker.plugins.pcp; namespace linker.plugins.socks5 diff --git a/linker/plugins/socks5/Socks5Startup.cs b/linker/plugins/socks5/Socks5Startup.cs index dc675edc..8d512146 100644 --- a/linker/plugins/socks5/Socks5Startup.cs +++ b/linker/plugins/socks5/Socks5Startup.cs @@ -26,7 +26,8 @@ namespace linker.plugins.Socks5 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - + serviceCollection.AddSingleton(); + } public void AddServer(ServiceCollection serviceCollection, FileConfig config) diff --git a/linker/plugins/tunnel/RouteExcludeIP.cs b/linker/plugins/tunnel/RouteExcludeIP.cs new file mode 100644 index 00000000..8340bc2e --- /dev/null +++ b/linker/plugins/tunnel/RouteExcludeIP.cs @@ -0,0 +1,20 @@ +using linker.plugins.route; +using System.Net; + +namespace linker.plugins.tunnel +{ + public sealed class RouteExcludeIPTunnel : IRouteExcludeIP + { + private readonly TunnelConfigTransfer tunnelConfigTransfer; + public RouteExcludeIPTunnel(TunnelConfigTransfer tunnelConfigTransfer) + { + this.tunnelConfigTransfer = tunnelConfigTransfer; + } + public List Get() + { + return tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + //路由上的IP + .Concat(tunnelConfigTransfer.RouteIPs).ToList(); + } + } +} diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index 05044921..f9e109c2 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -63,10 +63,7 @@ namespace linker.plugins.tunnel new TransportUdp(), }); - clientSignInState.NetworkEnabledHandle += (times) => - { - RefreshPortMap(); - }; + clientSignInState.NetworkEnabledHandle += (times) => RefreshPortMap(); tunnelConfigTransfer.OnChanged += RefreshPortMap; } diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs index 83489ced..52e02ac5 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker/plugins/tunnel/TunnelApiController.cs @@ -46,7 +46,7 @@ namespace linker.plugins.tunnel public TunnelListInfo Get(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (tunnelDecenter.Version.Eq(hashCode, out ulong version) == false) + if (tunnelDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new TunnelListInfo { diff --git a/linker/plugins/tunnel/TunnelDecenter.cs b/linker/plugins/tunnel/TunnelDecenter.cs index a799dcea..1a42a2a5 100644 --- a/linker/plugins/tunnel/TunnelDecenter.cs +++ b/linker/plugins/tunnel/TunnelDecenter.cs @@ -8,9 +8,9 @@ namespace linker.plugins.tunnel public sealed class TunnelDecenter:IDecenter { public string Name => "tunnel"; - public VersionManager DataVersion { get; } = new VersionManager(); + public VersionManager SyncVersion { get; } = new VersionManager(); - public VersionManager Version { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); public ConcurrentDictionary Config { get; } = new ConcurrentDictionary(); private readonly TunnelConfigTransfer tunnelConfigTransfer; @@ -25,20 +25,20 @@ namespace linker.plugins.tunnel /// public void Refresh() { - DataVersion.Add(); + SyncVersion.Add(); } public Memory GetData() { TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = tunnelConfigTransfer.GetLocalRouteLevel(); Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - Version.Add(); + DataVersion.Add(); return MemoryPackSerializer.Serialize(tunnelTransportRouteLevelInfo); } public void SetData(Memory data) { TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = MemoryPackSerializer.Deserialize(data.Span); Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - Version.Add(); + DataVersion.Add(); } public void SetData(List> data) { @@ -49,7 +49,7 @@ namespace linker.plugins.tunnel } TunnelTransportRouteLevelInfo config = tunnelConfigTransfer.GetLocalRouteLevel(); Config.AddOrUpdate(config.MachineId, config, (a, b) => config); - Version.Add(); + DataVersion.Add(); } } } diff --git a/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs b/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs index bdc04ea4..ec9d4f63 100644 --- a/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs +++ b/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs @@ -1,6 +1,4 @@ using linker.client.config; -using linker.config; -using linker.plugins.client; namespace linker.plugins.tunnel.excludeip { @@ -8,15 +6,8 @@ namespace linker.plugins.tunnel.excludeip { private List excludeIPs; - private readonly RunningConfig running; - private readonly ClientSignInState clientSignInState; - private readonly FileConfig fileConfig; - - public TunnelExcludeIPTransfer(RunningConfig running, ClientSignInState clientSignInState, FileConfig fileConfig) + public TunnelExcludeIPTransfer() { - this.running = running; - this.clientSignInState = clientSignInState; - this.fileConfig = fileConfig; } public void LoadTunnelExcludeIPs(List list) diff --git a/linker/plugins/tuntap/ExcludeIP.cs b/linker/plugins/tuntap/ExcludeIP.cs index 2b9c711b..e7aeb622 100644 --- a/linker/plugins/tuntap/ExcludeIP.cs +++ b/linker/plugins/tuntap/ExcludeIP.cs @@ -1,5 +1,7 @@ using linker.client.config; +using linker.plugins.route; using linker.plugins.tunnel.excludeip; +using System.Net; namespace linker.plugins.tuntap { @@ -16,4 +18,17 @@ namespace linker.plugins.tuntap return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } }; } } + + public sealed class RouteExcludeIPTuntap : IRouteExcludeIP + { + private readonly TuntapConfigTransfer tuntapConfigTransfer; + public RouteExcludeIPTuntap(TuntapConfigTransfer tuntapConfigTransfer) + { + this.tuntapConfigTransfer = tuntapConfigTransfer; + } + public List Get() + { + return new List { tuntapConfigTransfer.IP }; + } + } } diff --git a/linker/plugins/tuntap/TuntapAdapter.cs b/linker/plugins/tuntap/TuntapAdapter.cs index 8c7780bd..4e11e1bf 100644 --- a/linker/plugins/tuntap/TuntapAdapter.cs +++ b/linker/plugins/tuntap/TuntapAdapter.cs @@ -1,5 +1,6 @@ using linker.libs; using linker.plugins.client; +using linker.plugins.route; using linker.plugins.tunnel; using linker.plugins.tuntap.config; using linker.tun; @@ -16,20 +17,18 @@ namespace linker.plugins.tuntap private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapDecenter tuntapDecenter; private readonly TuntapProxy tuntapProxy; - private readonly ClientSignInState clientSignInState; - private readonly TunnelConfigTransfer tunnelConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly RouteExcludeIPTransfer routeExcludeIPTransfer; public TuntapAdapter(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapDecenter tuntapDecenter, TuntapProxy tuntapProxy, - ClientSignInState clientSignInState, TunnelConfigTransfer tunnelConfigTransfer, ClientConfigTransfer clientConfigTransfer) + ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer) { this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapDecenter = tuntapDecenter; this.tuntapProxy = tuntapProxy; - this.clientSignInState = clientSignInState; - this.tunnelConfigTransfer = tunnelConfigTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.routeExcludeIPTransfer = routeExcludeIPTransfer; //初始化网卡 tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this); @@ -169,17 +168,7 @@ namespace linker.plugins.tuntap private List ParseIPs(List infos) { //排除的IP, - uint[] excludeIps =//本机局域网IP - tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - //路由上的IP - .Concat(tunnelConfigTransfer.RouteIPs) - //网卡IP 服务器IP - .Concat(new IPAddress[] { tuntapConfigTransfer.Info.IP, clientSignInState.Connection.Address.Address }) - //网卡配置的局域网IP - .Concat(tuntapConfigTransfer.Info.Lans.Select(c => c.IP)) - .Select(NetworkHelper.IP2Value) - .ToArray(); - + uint[] excludeIps = routeExcludeIPTransfer.Get().Select(NetworkHelper.IP2Value) .ToArray(); HashSet hashSet = new HashSet(); return infos diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs index b023b410..2227b5c8 100644 --- a/linker/plugins/tuntap/TuntapApiController.cs +++ b/linker/plugins/tuntap/TuntapApiController.cs @@ -76,7 +76,7 @@ namespace linker.plugins.tuntap public TuntabListInfo Get(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (tuntapDecenter.Version.Eq(hashCode, out ulong version) == false) + if (tuntapDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new TuntabListInfo { diff --git a/linker/plugins/tuntap/TuntapDecenter.cs b/linker/plugins/tuntap/TuntapDecenter.cs index a43f2b9c..fed26567 100644 --- a/linker/plugins/tuntap/TuntapDecenter.cs +++ b/linker/plugins/tuntap/TuntapDecenter.cs @@ -10,9 +10,9 @@ namespace linker.plugins.tuntap public sealed class TuntapDecenter : IDecenter { public string Name => "tuntap"; - public VersionManager DataVersion { get; } = new VersionManager(); + public VersionManager SyncVersion { get; } = new VersionManager(); - public VersionManager Version { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); public ConcurrentDictionary Infos => tuntapInfos; private readonly SemaphoreSlim slim = new SemaphoreSlim(1); @@ -43,14 +43,14 @@ namespace linker.plugins.tuntap public void Refresh() { - DataVersion.Add(); + SyncVersion.Add(); } public Memory GetData() { TuntapInfo info = HandleCurrentInfo(); tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); + DataVersion.Add(); return MemoryPackSerializer.Serialize(info); } public void SetData(Memory data) @@ -68,7 +68,7 @@ namespace linker.plugins.tuntap { OnChangeBefore(); tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); + DataVersion.Add(); OnChangeAfter(); } catch (Exception ex) @@ -105,7 +105,7 @@ namespace linker.plugins.tuntap tuntapInfo.LastTicks.Clear(); } } - Version.Add(); + DataVersion.Add(); OnChangeAfter(); } catch (Exception ex) diff --git a/linker/plugins/tuntap/TuntapPingTransfer.cs b/linker/plugins/tuntap/TuntapPingTransfer.cs index 91bab2a8..3e03d58e 100644 --- a/linker/plugins/tuntap/TuntapPingTransfer.cs +++ b/linker/plugins/tuntap/TuntapPingTransfer.cs @@ -61,7 +61,7 @@ namespace linker.plugins.tuntap using Ping ping = new Ping(); PingReply pingReply = await ping.SendPingAsync(c.IP, 500); c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1; - tuntapDecenter.Version.Add(); + tuntapDecenter.DataVersion.Add(); })); } } diff --git a/version.txt b/version.txt index e2ac7227..cec99a3f 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.3 -2024-12-12 17:37:53 +2024-12-13 15:52:27 1. 优化UI,显示网络计算IP数 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 3. 优化网卡的端口转发