整理代码

This commit is contained in:
snltty
2024-12-12 00:29:10 +08:00
parent d8fa9fe576
commit f95926ec81
70 changed files with 651 additions and 470 deletions

View File

@@ -7,7 +7,6 @@ using System.Collections.Concurrent;
using System.Net.Sockets; using System.Net.Sockets;
using System.Net; using System.Net;
using linker.tunnel.wanport; using linker.tunnel.wanport;
using System.Transactions;
namespace linker.tunnel namespace linker.tunnel
{ {
@@ -43,6 +42,7 @@ namespace linker.tunnel
item.OnSendConnectFail = tunnelAdapter.SendConnectFail; item.OnSendConnectFail = tunnelAdapter.SendConnectFail;
item.OnSendConnectSuccess = tunnelAdapter.SendConnectSuccess; item.OnSendConnectSuccess = tunnelAdapter.SendConnectSuccess;
item.OnConnected = _OnConnected; item.OnConnected = _OnConnected;
item.SetAdapter(tunnelAdapter);
} }
var transportItems = tunnelAdapter.GetTunnelTransports(); var transportItems = tunnelAdapter.GetTunnelTransports();

View File

@@ -1,4 +1,5 @@
using linker.tunnel.connection; using linker.tunnel.adapter;
using linker.tunnel.connection;
using linker.tunnel.wanport; using linker.tunnel.wanport;
using System.Net; using System.Net;
@@ -61,6 +62,8 @@ namespace linker.tunnel.transport
/// </summary> /// </summary>
public Action<ITunnelConnection> OnConnected { get; set; } public Action<ITunnelConnection> OnConnected { get; set; }
public void SetAdapter(ITunnelAdapter tunnelAdapter);
/// <summary> /// <summary>
/// 连接对方 /// 连接对方
/// </summary> /// </summary>

View File

@@ -46,27 +46,15 @@ namespace linker.tunnel.transport
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
private IPEndPoint quicListenEP = null; private IPEndPoint quicListenEP = null;
private readonly ITunnelAdapter tunnelAdapter; private ITunnelAdapter tunnelAdapter;
public TransportMsQuic(ITunnelAdapter tunnelAdapter) public TransportMsQuic()
{
_ = QuicListen();
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{ {
this.tunnelAdapter = tunnelAdapter; this.tunnelAdapter = tunnelAdapter;
_ = QuicListen();
/*
* QUIC监听 QuicStart
*
* 大致流程
*
* 1、ConnectAsync 告诉B我要连接你
*
* 2、B 收到消息调用 OnBegin然后绑定一个 socketB 等待 A 的消息,
* 3、B 给 A 发送一些消息 ,在 BindAndTTL
*
* 4、A 绑定一个监听 socketA然后发消息给 B , 如果 B 收到消息,就会回一条消息,这个监听就会收到消息,在 ConnectForward
* 5、A 再绑定一个 socketA1用以接收quic的连接
*
* 6、socketA1 收到消息,则通过 socketA 发送给B socketB 收到消息创建一个udp发送给quic监听完成一个线路
*/
} }
/// <summary> /// <summary>

View File

@@ -54,8 +54,11 @@ namespace linker.tunnel.transport
/// </summary> /// </summary>
public Action<ITunnelConnection> OnConnected { get; set; } = (state) => { }; public Action<ITunnelConnection> OnConnected { get; set; } = (state) => { };
private readonly ITunnelAdapter tunnelAdapter; private ITunnelAdapter tunnelAdapter;
public TunnelTransportTcpNutssb(ITunnelAdapter tunnelAdapter) public TunnelTransportTcpNutssb()
{
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{ {
this.tunnelAdapter = tunnelAdapter; this.tunnelAdapter = tunnelAdapter;
} }

View File

@@ -56,8 +56,11 @@ namespace linker.tunnel.transport
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
private readonly ITunnelAdapter tunnelAdapter; private ITunnelAdapter tunnelAdapter;
public TransportTcpP2PNAT(ITunnelAdapter tunnelAdapter) public TransportTcpP2PNAT()
{
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{ {
this.tunnelAdapter = tunnelAdapter; this.tunnelAdapter = tunnelAdapter;
} }

View File

@@ -44,12 +44,16 @@ namespace linker.tunnel.transport
private readonly ConcurrentDictionary<string, TaskCompletionSource<Socket>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<Socket>>(); private readonly ConcurrentDictionary<string, TaskCompletionSource<Socket>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<Socket>>();
private readonly ITunnelAdapter tunnelAdapter; private ITunnelAdapter tunnelAdapter;
public TransportTcpPortMap(ITunnelAdapter tunnelAdapter) public TransportTcpPortMap()
{
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{ {
this.tunnelAdapter = tunnelAdapter; this.tunnelAdapter = tunnelAdapter;
} }
Socket socket; Socket socket;
public async Task Listen(int localPort) public async Task Listen(int localPort)
{ {

View File

@@ -6,6 +6,7 @@ using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using linker.tunnel.wanport; using linker.tunnel.wanport;
using linker.tunnel.adapter;
namespace linker.tunnel.transport namespace linker.tunnel.transport
{ {
@@ -52,6 +53,9 @@ namespace linker.tunnel.transport
public TransportUdp() public TransportUdp()
{ {
} }
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{
}
/// <summary> /// <summary>
/// 开始连接对方 /// 开始连接对方

View File

@@ -46,11 +46,14 @@ namespace linker.tunnel.transport
private readonly ConcurrentDictionary<string, TaskCompletionSource<State>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<State>>(); private readonly ConcurrentDictionary<string, TaskCompletionSource<State>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<State>>();
private readonly ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo> connectionsDic = new ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo>(new IPEndPointComparer()); private readonly ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo> connectionsDic = new ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo>(new IPEndPointComparer());
private readonly ITunnelAdapter tunnelAdapter; private ITunnelAdapter tunnelAdapter;
public TransportUdpPortMap(ITunnelAdapter tunnelAdapter) public TransportUdpPortMap()
{
CleanTask();
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{ {
this.tunnelAdapter = tunnelAdapter; this.tunnelAdapter = tunnelAdapter;
CleanTask();
} }
Socket socket; Socket socket;

View File

@@ -13,7 +13,8 @@
@blur="handleEditBlur(scope.row, 'ListenPort')"></el-input> @blur="handleEditBlur(scope.row, 'ListenPort')"></el-input>
</template> </template>
<template v-else> <template v-else>
{{ scope.row.ListenPort }} <strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ListenPort }}</strong>
<span v-else>{{ scope.row.ListenPort }}</span>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
@@ -24,7 +25,8 @@
@blur="handleEditBlur(scope.row, 'ConnectAddr')"></el-input> @blur="handleEditBlur(scope.row, 'ConnectAddr')"></el-input>
</template> </template>
<template v-else> <template v-else>
{{ scope.row.ConnectAddr }} <strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ConnectAddr }}</strong>
<span v-else>{{ scope.row.ConnectAddr }}</span>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
@@ -35,7 +37,8 @@
@blur="handleEditBlur(scope.row, 'ConnectPort')"></el-input> @blur="handleEditBlur(scope.row, 'ConnectPort')"></el-input>
</template> </template>
<template v-else> <template v-else>
{{ scope.row.ConnectPort }} <strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ConnectPort }}</strong>
<span v-else>{{ scope.row.ConnectPort }}</span>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>

View File

@@ -7,6 +7,12 @@ namespace linker.plugins.action
{ {
public const string ACTION_ARG_KEY = "ACTION_ARGS"; public const string ACTION_ARG_KEY = "ACTION_ARGS";
public string SignInActionUrl => config.Data.Action.SignInActionUrl;
public string RelayActionUrl => config.Data.Action.SignInActionUrl;
public string SForwardActionUrl => config.Data.Action.SignInActionUrl;
private readonly FileConfig config; private readonly FileConfig config;
public ActionTransfer(FileConfig config) public ActionTransfer(FileConfig config)
{ {

View File

@@ -122,7 +122,7 @@ namespace linker.plugins.action
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SignInActionUrl) == false) if (string.IsNullOrWhiteSpace(actionTransfer.SignInActionUrl) == false)
{ {
if (actionTransfer.TryGetActionArg(signInfo.Args, out string str, out string machineKey) == false) if (actionTransfer.TryGetActionArg(signInfo.Args, out string str, out string machineKey) == false)
{ {
@@ -140,7 +140,7 @@ namespace linker.plugins.action
IPAddress = signInfo.Connection.Address.Address IPAddress = signInfo.Connection.Address.Address
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.SignInActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SignInActionUrl);
} }
return string.Empty; return string.Empty;
@@ -160,7 +160,7 @@ namespace linker.plugins.action
public async Task<string> Validate(linker.plugins.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) public async Task<string> Validate(linker.plugins.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
{ {
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.RelayActionUrl) == false) if (string.IsNullOrWhiteSpace(actionTransfer.RelayActionUrl) == false)
{ {
if (actionTransfer.TryGetActionArg(fromMachine.Args, out string str, out string machineKey) == false) if (actionTransfer.TryGetActionArg(fromMachine.Args, out string str, out string machineKey) == false)
{ {
@@ -191,7 +191,7 @@ namespace linker.plugins.action
IPAddress = fromMachine.Connection.Address.Address, IPAddress = fromMachine.Connection.Address.Address,
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.RelayActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.RelayActionUrl);
} }
return string.Empty; return string.Empty;
} }
@@ -210,7 +210,7 @@ namespace linker.plugins.action
public async Task<string> Validate(SignCacheInfo cache, SForwardAddInfo sForwardAddInfo) public async Task<string> Validate(SignCacheInfo cache, SForwardAddInfo sForwardAddInfo)
{ {
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SForwardActionUrl) == false) if (string.IsNullOrWhiteSpace(actionTransfer.SForwardActionUrl) == false)
{ {
if (actionTransfer.TryGetActionArg(cache.Args, out string str, out string machineKey) == false) if (actionTransfer.TryGetActionArg(cache.Args, out string str, out string machineKey) == false)
{ {
@@ -233,7 +233,7 @@ namespace linker.plugins.action
IPAddress = cache.Connection.Address.Address IPAddress = cache.Connection.Address.Address
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.SForwardActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SForwardActionUrl);
} }
return string.Empty; return string.Empty;
} }

View File

@@ -4,13 +4,13 @@ using MemoryPack;
namespace linker.plugins.client namespace linker.plugins.client
{ {
public sealed class ConfigSyncSignInSecretKey : IConfigSync public sealed class ClientConfigSyncSecretKey : IConfigSync
{ {
public string Name => "SignInSecretKey"; public string Name => "SignInSecretKey";
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
public ConfigSyncSignInSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) public ClientConfigSyncSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
@@ -22,17 +22,16 @@ namespace linker.plugins.client
public void SetData(Memory<byte> data) public void SetData(Memory<byte> data)
{ {
clientConfigTransfer.Server.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span); clientConfigTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
fileConfig.Data.Update();
} }
} }
public sealed class ConfigSyncGroupSecretKey : IConfigSync public sealed class ClientConfigSyncGroupSecretKey : IConfigSync
{ {
public string Name => "GroupSecretKey"; public string Name => "GroupSecretKey";
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
public ConfigSyncGroupSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) public ClientConfigSyncGroupSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;

View File

@@ -38,6 +38,12 @@ namespace linker.plugins.client
config.Data.Update(); config.Data.Update();
} }
public void SetSecretKey(string secretKey)
{
Server.SecretKey = secretKey;
config.Data.Update();
}
public void SetId(string id) public void SetId(string id)
{ {
config.Data.Client.Id = id; config.Data.Client.Id = id;

View File

@@ -25,8 +25,8 @@ namespace linker.plugins.client
serviceCollection.AddSingleton<SignInArgsSecretKeyClient>(); serviceCollection.AddSingleton<SignInArgsSecretKeyClient>();
serviceCollection.AddSingleton<SignInArgsGroupPasswordClient>(); serviceCollection.AddSingleton<SignInArgsGroupPasswordClient>();
serviceCollection.AddSingleton<ConfigSyncSignInSecretKey>(); serviceCollection.AddSingleton<ClientConfigSyncSecretKey>();
serviceCollection.AddSingleton<ConfigSyncGroupSecretKey>(); serviceCollection.AddSingleton<ClientConfigSyncGroupSecretKey>();
serviceCollection.AddSingleton<ClientConfigTransfer>(); serviceCollection.AddSingleton<ClientConfigTransfer>();

View File

@@ -1,6 +1,7 @@
using linker.plugins.signIn.args; using linker.plugins.signIn.args;
using linker.plugins.signin.messenger; using linker.plugins.signin.messenger;
using linker.config; using linker.config;
using linker.plugins.signIn;
namespace linker.plugins.client namespace linker.plugins.client
{ {
@@ -36,9 +37,11 @@ namespace linker.plugins.client
public sealed class SignInArgsSecretKeyServer : ISignInArgs public sealed class SignInArgsSecretKeyServer : ISignInArgs
{ {
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
public SignInArgsSecretKeyServer(FileConfig fileConfig) private readonly SignInConfigTransfer signInConfigTransfer;
public SignInArgsSecretKeyServer(FileConfig fileConfig, SignInConfigTransfer signInConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.signInConfigTransfer = signInConfigTransfer;
} }
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
@@ -54,9 +57,9 @@ namespace linker.plugins.client
/// <returns></returns> /// <returns></returns>
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
if (string.IsNullOrWhiteSpace(fileConfig.Data.Server.SignIn.SecretKey) == false) if (string.IsNullOrWhiteSpace(signInConfigTransfer.SecretKey) == false)
{ {
if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != fileConfig.Data.Server.SignIn.SecretKey) if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != signInConfigTransfer.SecretKey)
{ {
return $"server secretkey validate fail"; return $"server secretkey validate fail";
} }

View File

@@ -9,6 +9,8 @@ using linker.plugins.flow.messenger;
using linker.libs.extends; using linker.libs.extends;
using linker.plugins.sforward.proxy; using linker.plugins.sforward.proxy;
using linker.plugins.relay; using linker.plugins.relay;
using linker.plugins.relay.client;
using linker.plugins.sforward;
namespace linker.plugins.flow namespace linker.plugins.flow
{ {
@@ -18,13 +20,17 @@ namespace linker.plugins.flow
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly FileConfig config; private readonly FileConfig config;
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
private readonly SForwardTransfer sForwardTransfer;
public FlowClientApiController(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig) public FlowClientApiController(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.config = config; this.config = config;
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer;
this.sForwardTransfer = sForwardTransfer;
} }
public async Task<FlowInfo> GetFlows(ApiControllerParamsInfo param) public async Task<FlowInfo> GetFlows(ApiControllerParamsInfo param)
@@ -58,7 +64,7 @@ namespace linker.plugins.flow
public async Task<SForwardFlowResponseInfo> GetSForwardFlows(ApiControllerParamsInfo param) public async Task<SForwardFlowResponseInfo> GetSForwardFlows(ApiControllerParamsInfo param)
{ {
SForwardFlowRequestInfo info = param.Content.DeJson<SForwardFlowRequestInfo>(); SForwardFlowRequestInfo info = param.Content.DeJson<SForwardFlowRequestInfo>();
info.SecretKey = config.Data.Client.SForward.SecretKey; info.SecretKey = sForwardTransfer.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{ {
@@ -77,7 +83,7 @@ namespace linker.plugins.flow
public async Task<RelayFlowResponseInfo> GetRelayFlows(ApiControllerParamsInfo param) public async Task<RelayFlowResponseInfo> GetRelayFlows(ApiControllerParamsInfo param)
{ {
RelayFlowRequestInfo info = param.Content.DeJson<RelayFlowRequestInfo>(); RelayFlowRequestInfo info = param.Content.DeJson<RelayFlowRequestInfo>();
info.SecretKey = config.Data.Client.Relay.Server.SecretKey; info.SecretKey = relayClientConfigTransfer.Server.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{ {

View File

@@ -1,5 +1,7 @@
using linker.config; using linker.config;
using linker.plugins.messenger; using linker.plugins.messenger;
using linker.plugins.relay.server;
using linker.plugins.sforward;
using linker.plugins.signin.messenger; using linker.plugins.signin.messenger;
using MemoryPack; using MemoryPack;
@@ -13,10 +15,12 @@ namespace linker.plugins.flow.messenger
private readonly RelayFlow relayFlow; private readonly RelayFlow relayFlow;
private readonly SignCaching signCaching; private readonly SignCaching signCaching;
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
private DateTime start = DateTime.Now; private DateTime start = DateTime.Now;
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignCaching signCaching, FileConfig fileConfig) public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer)
{ {
this.flowTransfer = flowTransfer; this.flowTransfer = flowTransfer;
this.messengerFlow = messengerFlow; this.messengerFlow = messengerFlow;
@@ -24,6 +28,8 @@ namespace linker.plugins.flow.messenger
this.relayFlow = relayFlow; this.relayFlow = relayFlow;
this.signCaching = signCaching; this.signCaching = signCaching;
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayServerConfigTransfer = relayServerConfigTransfer;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
} }
[MessengerId((ushort)FlowMessengerIds.List)] [MessengerId((ushort)FlowMessengerIds.List)]
@@ -55,7 +61,7 @@ namespace linker.plugins.flow.messenger
sForwardFlow.Update(); sForwardFlow.Update();
SForwardFlowRequestInfo info = MemoryPackSerializer.Deserialize<SForwardFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span); SForwardFlowRequestInfo info = MemoryPackSerializer.Deserialize<SForwardFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (fileConfig.Data.Server.SForward.SecretKey == info.SecretKey) if (sForwardServerConfigTransfer.SecretKey == info.SecretKey)
{ {
info.GroupId = string.Empty; info.GroupId = string.Empty;
} }
@@ -79,7 +85,7 @@ namespace linker.plugins.flow.messenger
{ {
relayFlow.Update(); relayFlow.Update();
RelayFlowRequestInfo info = MemoryPackSerializer.Deserialize<RelayFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span); RelayFlowRequestInfo info = MemoryPackSerializer.Deserialize<RelayFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (fileConfig.Data.Server.Relay.SecretKey == info.SecretKey) if (relayServerConfigTransfer.SecretKey == info.SecretKey)
{ {
info.GroupId = string.Empty; info.GroupId = string.Empty;
} }

View File

@@ -20,8 +20,8 @@ namespace linker.plugins.forward.proxy
protected override string TransactionId => "forward"; protected override string TransactionId => "forward";
public ForwardProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig) public ForwardProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer) : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
{ {
TaskUdp(); TaskUdp();
} }

View File

@@ -1,5 +1,6 @@
using linker.config; using linker.config;
using linker.plugins.client; using linker.plugins.client;
using linker.plugins.server;
using linker.startup; using linker.startup;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@@ -59,8 +60,10 @@ namespace linker.plugins.messenger
{ {
loaded = true; loaded = true;
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>(); IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
messengerResolver.Initialize(config.Data.Server.SSL.File, config.Data.Server.SSL.Password); messengerResolver.Initialize(serverConfigTransfer.SSL.File, serverConfigTransfer.SSL.Password);
MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService<MessengerResolverTypesLoader>(); MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService<MessengerResolverTypesLoader>();
} }

View File

@@ -33,13 +33,16 @@ namespace linker.plugins.relay
serviceCollection.AddSingleton<RelayTestTransfer>(); serviceCollection.AddSingleton<RelayTestTransfer>();
serviceCollection.AddSingleton<ConfigSyncRelaySecretKey>(); serviceCollection.AddSingleton<RelaConfigSyncSecretKey>();
serviceCollection.AddSingleton<RelayTypesLoader>(); serviceCollection.AddSingleton<RelayTypesLoader>();
serviceCollection.AddSingleton<RelayServerMasterTransfer>(); serviceCollection.AddSingleton<RelayServerMasterTransfer>();
serviceCollection.AddSingleton<RelayServerNodeTransfer>(); serviceCollection.AddSingleton<RelayServerNodeTransfer>();
serviceCollection.AddSingleton<IRelayCaching, RelayCachingMemory>(); serviceCollection.AddSingleton<IRelayCaching, RelayCachingMemory>();
serviceCollection.AddSingleton<RelayClientConfigTransfer>();
} }
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)
@@ -57,6 +60,7 @@ namespace linker.plugins.relay
serviceCollection.AddSingleton<RelayValidatorSecretKey>(); serviceCollection.AddSingleton<RelayValidatorSecretKey>();
serviceCollection.AddSingleton<RelayServerConfigTransfer>();
} }
public void UseClient(ServiceProvider serviceProvider, FileConfig config) public void UseClient(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -4,28 +4,26 @@ using MemoryPack;
namespace linker.plugins.relay.client namespace linker.plugins.relay.client
{ {
public sealed class ConfigSyncRelaySecretKey : IConfigSync public sealed class RelaConfigSyncSecretKey : IConfigSync
{ {
public string Name => "RelaySecretKey"; public string Name => "RelaySecretKey";
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
public ConfigSyncRelaySecretKey(FileConfig fileConfig) private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelaConfigSyncSecretKey(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer;
} }
public Memory<byte> GetData() public Memory<byte> GetData()
{ {
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Relay.Servers.FirstOrDefault().SecretKey); return MemoryPackSerializer.Serialize(relayClientConfigTransfer.Server.SecretKey);
} }
public void SetData(Memory<byte> data) public void SetData(Memory<byte> data)
{ {
string value = MemoryPackSerializer.Deserialize<string>(data.Span); string value = MemoryPackSerializer.Deserialize<string>(data.Span);
foreach (var item in fileConfig.Data.Client.Relay.Servers) relayClientConfigTransfer.SetServerSecretKey(value);
{
item.SecretKey = value;
}
fileConfig.Data.Update();
} }
} }
} }

View File

@@ -15,13 +15,15 @@ namespace linker.plugins.relay.client
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly RelayTestTransfer relayTestTransfer; private readonly RelayTestTransfer relayTestTransfer;
private readonly RelayTransfer relayTransfer; private readonly RelayTransfer relayTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer) public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.config = config; this.config = config;
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.relayTestTransfer = relayTestTransfer; this.relayTestTransfer = relayTestTransfer;
this.relayTransfer = relayTransfer; this.relayTransfer = relayTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
} }
/// <summary> /// <summary>
@@ -33,8 +35,7 @@ namespace linker.plugins.relay.client
public bool SetServers(ApiControllerParamsInfo param) public bool SetServers(ApiControllerParamsInfo param)
{ {
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>(); RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
config.Data.Client.Relay.Servers = [info]; relayClientConfigTransfer.SetServer(info);
config.Data.Update();
return true; return true;
} }
@@ -48,8 +49,7 @@ namespace linker.plugins.relay.client
{ {
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>(); RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId); _ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId);
runningConfig.Data.Relay.DefaultNodeId = relayConnectInfo.NodeId; relayClientConfigTransfer.SetDefaultNodeId(relayConnectInfo.NodeId);
runningConfig.Data.Update();
return true; return true;
} }

View File

@@ -0,0 +1,39 @@
using linker.client.config;
using linker.config;
namespace linker.plugins.relay.client
{
public sealed class RelayClientConfigTransfer
{
public string DefaultNodeId => runningConfig.Data.Relay.DefaultNodeId;
public RelayServerInfo Server => config.Data.Client.Relay.Servers[0];
private readonly FileConfig config;
private readonly RunningConfig runningConfig;
public RelayClientConfigTransfer(FileConfig config, RunningConfig runningConfig)
{
this.config = config;
this.runningConfig = runningConfig;
}
public void SetDefaultNodeId(string defaultNodeId)
{
runningConfig.Data.Relay.DefaultNodeId = defaultNodeId;
runningConfig.Data.Update();
}
public void SetServer(RelayServerInfo server)
{
config.Data.Client.Relay.Servers = [server];
runningConfig.Data.Update();
}
public void SetServerSecretKey(string secretKey)
{
foreach (var item in config.Data.Client.Relay.Servers)
{
item.SecretKey = secretKey;
}
runningConfig.Data.Update();
}
}
}

View File

@@ -16,15 +16,17 @@ namespace linker.plugins.relay.client
private readonly RelayTransfer relayTransfer; private readonly RelayTransfer relayTransfer;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public List<RelayNodeReportInfo> Nodes { get; private set; } = new List<RelayNodeReportInfo>(); public List<RelayNodeReportInfo> Nodes { get; private set; } = new List<RelayNodeReportInfo>();
public RelayTestTransfer(FileConfig fileConfig, RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer) public RelayTestTransfer(FileConfig fileConfig, RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayTransfer = relayTransfer; this.relayTransfer = relayTransfer;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
TestTask(); TestTask();
} }
@@ -39,13 +41,13 @@ namespace linker.plugins.relay.client
{ {
try try
{ {
ITransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == fileConfig.Data.Client.Relay.Server.RelayType); ITransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientConfigTransfer.Server.RelayType);
if (transport != null) if (transport != null)
{ {
Nodes = await transport.RelayTestAsync(new RelayTestInfo Nodes = await transport.RelayTestAsync(new RelayTestInfo
{ {
MachineId = clientConfigTransfer.Id, MachineId = clientConfigTransfer.Id,
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey SecretKey = relayClientConfigTransfer.Server.SecretKey
}); });
var tasks = Nodes.Select(async (c) => var tasks = Nodes.Select(async (c) =>
{ {

View File

@@ -20,9 +20,11 @@ namespace linker.plugins.relay.client
private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>(); private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>();
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>(); private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
public RelayTransfer(FileConfig fileConfig) private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelayTransfer(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer;
} }
public void LoadTransports(List<ITransport> list) public void LoadTransports(List<ITransport> list)
@@ -71,7 +73,7 @@ namespace linker.plugins.relay.client
} }
try try
{ {
ITransport transport = Transports.FirstOrDefault(c => c.Type == fileConfig.Data.Client.Relay.Server.RelayType && fileConfig.Data.Client.Relay.Server.Disabled == false); ITransport transport = Transports.FirstOrDefault(c => c.Type == relayClientConfigTransfer.Server.RelayType && relayClientConfigTransfer.Server.Disabled == false);
if (transport == null) if (transport == null)
{ {
return null; return null;
@@ -84,10 +86,10 @@ namespace linker.plugins.relay.client
FromMachineName = string.Empty, FromMachineName = string.Empty,
RemoteMachineId = remoteMachineId, RemoteMachineId = remoteMachineId,
RemoteMachineName = string.Empty, RemoteMachineName = string.Empty,
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey, SecretKey = relayClientConfigTransfer.Server.SecretKey,
TransactionId = transactionId, TransactionId = transactionId,
TransportName = transport.Name, TransportName = transport.Name,
SSL = fileConfig.Data.Client.Relay.Server.SSL, SSL = relayClientConfigTransfer.Server.SSL,
NodeId = nodeId NodeId = nodeId
}; };

View File

@@ -33,7 +33,6 @@ namespace linker.config
/// 中继服务器列表 /// 中继服务器列表
/// </summary> /// </summary>
public RelayServerInfo[] Servers { get; set; } = new RelayServerInfo[] { new RelayServerInfo { } }; public RelayServerInfo[] Servers { get; set; } = new RelayServerInfo[] { new RelayServerInfo { } };
public RelayServerInfo Server => Servers[0];
} }

View File

@@ -0,0 +1,18 @@
using linker.config;
namespace linker.plugins.relay.server
{
public sealed class RelayServerConfigTransfer
{
public string SecretKey => config.Data.Server.Relay.SecretKey;
public RelayNodeInfo Node=> config.Data.Server.Relay.Distributed.Node;
public RelayMasterInfo Master => config.Data.Server.Relay.Distributed.Master;
private readonly FileConfig config;
public RelayServerConfigTransfer(FileConfig config)
{
this.config = config;
}
}
}

View File

@@ -14,16 +14,14 @@ namespace linker.plugins.relay.server
private readonly IRelayCaching relayCaching; private readonly IRelayCaching relayCaching;
private readonly FileConfig fileConfig;
private readonly ICrypto crypto; private readonly ICrypto crypto;
private readonly ConcurrentDictionary<string, RelayNodeReportInfo> reports = new ConcurrentDictionary<string, RelayNodeReportInfo>(); private readonly ConcurrentDictionary<string, RelayNodeReportInfo> reports = new ConcurrentDictionary<string, RelayNodeReportInfo>();
public RelayServerMasterTransfer(IRelayCaching relayCaching, FileConfig fileConfig) public RelayServerMasterTransfer(IRelayCaching relayCaching, RelayServerConfigTransfer relayServerConfigTransfer)
{ {
this.relayCaching = relayCaching; this.relayCaching = relayCaching;
this.fileConfig = fileConfig; crypto = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
crypto = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Master.SecretKey);
} }

View File

@@ -3,6 +3,7 @@ using linker.libs;
using linker.libs.extends; using linker.libs.extends;
using linker.plugins.relay.server.caching; using linker.plugins.relay.server.caching;
using linker.plugins.resolver; using linker.plugins.resolver;
using linker.plugins.server;
using MemoryPack; using MemoryPack;
using System.Buffers; using System.Buffers;
using System.Net; using System.Net;
@@ -16,6 +17,8 @@ namespace linker.plugins.relay.server
private readonly IRelayCaching relayCaching; private readonly IRelayCaching relayCaching;
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
private readonly ServerConfigTransfer serverConfigTransfer;
private readonly ICrypto cryptoNode; private readonly ICrypto cryptoNode;
private readonly ICrypto cryptoMaster; private readonly ICrypto cryptoMaster;
@@ -25,16 +28,18 @@ namespace linker.plugins.relay.server
RelaySpeedLimit limitTotal = new RelaySpeedLimit(); RelaySpeedLimit limitTotal = new RelaySpeedLimit();
public RelayServerNodeTransfer(IRelayCaching relayCaching, FileConfig fileConfig) public RelayServerNodeTransfer(IRelayCaching relayCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, ServerConfigTransfer serverConfigTransfer)
{ {
this.relayCaching = relayCaching; this.relayCaching = relayCaching;
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayServerConfigTransfer = relayServerConfigTransfer;
this.serverConfigTransfer = serverConfigTransfer;
limitTotal.SetLimit((uint)Math.Ceiling((fileConfig.Data.Server.Relay.Distributed.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0)); limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
ResetBytes(); ResetBytes();
cryptoNode = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Node.MasterSecretKey); cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey);
cryptoMaster = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Master.SecretKey); cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
ReportTask(); ReportTask();
} }
@@ -45,8 +50,8 @@ namespace linker.plugins.relay.server
try try
{ {
IPEndPoint server = nodeid == RelayNodeInfo.MASTER_NODE_ID IPEndPoint server = nodeid == RelayNodeInfo.MASTER_NODE_ID
? new IPEndPoint(IPAddress.Loopback, fileConfig.Data.Server.ServicePort) ? new IPEndPoint(IPAddress.Loopback, serverConfigTransfer.Port)
: await NetworkHelper.GetEndPointAsync(fileConfig.Data.Server.Relay.Distributed.Node.MasterHost, 1802); : await NetworkHelper.GetEndPointAsync(relayServerConfigTransfer.Node.MasterHost, 1802);
ICrypto crypto = nodeid == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode; ICrypto crypto = nodeid == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode;
Socket socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
@@ -103,9 +108,9 @@ namespace linker.plugins.relay.server
/// <returns></returns> /// <returns></returns>
public bool ValidateConnection() public bool ValidateConnection()
{ {
bool res = fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection == 0 || fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection * 2 > connectionNum; bool res = relayServerConfigTransfer.Node.MaxConnection == 0 || relayServerConfigTransfer.Node.MaxConnection * 2 > connectionNum;
if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"relay ValidateConnection false,{connectionNum}/{fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection * 2}"); LoggerHelper.Instance.Debug($"relay ValidateConnection false,{connectionNum}/{relayServerConfigTransfer.Node.MaxConnection * 2}");
return res; return res;
} }
@@ -116,11 +121,11 @@ namespace linker.plugins.relay.server
/// <returns></returns> /// <returns></returns>
public bool ValidateBytes() public bool ValidateBytes()
{ {
bool res = fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal == 0 bool res = relayServerConfigTransfer.Node.MaxGbTotal == 0
|| (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal > 0 && fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes > 0); || (relayServerConfigTransfer.Node.MaxGbTotal > 0 && relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0);
if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"relay ValidateBytes false,{fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes}bytes/{fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal}gb"); LoggerHelper.Instance.Debug($"relay ValidateBytes false,{relayServerConfigTransfer.Node.MaxGbTotalLastBytes}bytes/{relayServerConfigTransfer.Node.MaxGbTotal}gb");
return res; return res;
} }
@@ -132,15 +137,15 @@ namespace linker.plugins.relay.server
public bool AddBytes(ulong length) public bool AddBytes(ulong length)
{ {
bytes += length; bytes += length;
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal == 0) if (relayServerConfigTransfer.Node.MaxGbTotal == 0)
{ {
return true; return true;
} }
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes >= length) if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length)
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes -= length; relayServerConfigTransfer.Node.MaxGbTotalLastBytes -= length;
else fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = 0; else relayServerConfigTransfer.Node.MaxGbTotalLastBytes = 0;
return fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes > 0; return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0;
} }
/// <summary> /// <summary>
@@ -149,7 +154,7 @@ namespace linker.plugins.relay.server
/// <returns></returns> /// <returns></returns>
public uint GetBandwidthLimit() public uint GetBandwidthLimit()
{ {
return (uint)Math.Ceiling((fileConfig.Data.Server.Relay.Distributed.Node.MaxBandwidth * 1024 * 1024) / 8.0); return (uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidth * 1024 * 1024) / 8.0);
} }
/// <summary> /// <summary>
/// 是否需要总限速 /// 是否需要总限速
@@ -172,10 +177,10 @@ namespace linker.plugins.relay.server
private void ResetBytes() private void ResetBytes()
{ {
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalMonth != DateTime.Now.Month) if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month)
{ {
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalMonth = DateTime.Now.Month; relayServerConfigTransfer.Node.MaxGbTotalMonth = DateTime.Now.Month;
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = (ulong)(fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal * 1024 * 1024 * 1024); relayServerConfigTransfer.Node.MaxGbTotalLastBytes = (ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024);
fileConfig.Data.Update(); fileConfig.Data.Update();
} }
} }
@@ -191,9 +196,9 @@ namespace linker.plugins.relay.server
{ {
new RelayNodeInfo{ new RelayNodeInfo{
Id = RelayNodeInfo.MASTER_NODE_ID, Id = RelayNodeInfo.MASTER_NODE_ID,
Host = new IPEndPoint(IPAddress.Any,fileConfig.Data.Server.ServicePort).ToString(), Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(),
MasterHost = new IPEndPoint(IPAddress.Loopback,fileConfig.Data.Server.ServicePort).ToString(), MasterHost = new IPEndPoint(IPAddress.Loopback,serverConfigTransfer.Port).ToString(),
MasterSecretKey = fileConfig.Data.Server.Relay.Distributed.Master.SecretKey, MasterSecretKey = relayServerConfigTransfer.Master.SecretKey,
MaxBandwidth = 0, MaxBandwidth = 0,
MaxConnection = 0, MaxConnection = 0,
MaxBandwidthTotal=0, MaxBandwidthTotal=0,
@@ -203,7 +208,7 @@ namespace linker.plugins.relay.server
Name = "default", Name = "default",
Public = false Public = false
}, },
fileConfig.Data.Server.Relay.Distributed.Node relayServerConfigTransfer.Node
}.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false) }.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false)
.Where(c => string.IsNullOrWhiteSpace(c.Name) == false && string.IsNullOrWhiteSpace(c.Id) == false); .Where(c => string.IsNullOrWhiteSpace(c.Name) == false && string.IsNullOrWhiteSpace(c.Id) == false);
@@ -215,7 +220,7 @@ namespace linker.plugins.relay.server
try try
{ {
ICrypto crypto = node.Id == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode; ICrypto crypto = node.Id == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode;
IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, fileConfig.Data.Server.ServicePort) ?? new IPEndPoint(IPAddress.Any, fileConfig.Data.Server.ServicePort); IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, serverConfigTransfer.Port) ?? new IPEndPoint(IPAddress.Any, serverConfigTransfer.Port);
RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo
@@ -233,7 +238,7 @@ namespace linker.plugins.relay.server
EndPoint = endPoint, EndPoint = endPoint,
}; };
IPEndPoint ep = await NetworkHelper.GetEndPointAsync(node.MasterHost, fileConfig.Data.Server.ServicePort); IPEndPoint ep = await NetworkHelper.GetEndPointAsync(node.MasterHost, serverConfigTransfer.Port);
byte[] content = crypto.Encode(MemoryPackSerializer.Serialize(relayNodeReportInfo)); byte[] content = crypto.Encode(MemoryPackSerializer.Serialize(relayNodeReportInfo));
byte[] data = new byte[content.Length + 1]; byte[] data = new byte[content.Length + 1];

View File

@@ -19,15 +19,16 @@ namespace linker.plugins.relay.server.validator
public sealed class RelayValidatorSecretKey : IRelayValidator public sealed class RelayValidatorSecretKey : IRelayValidator
{ {
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
public RelayValidatorSecretKey(FileConfig fileConfig) public RelayValidatorSecretKey(FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.relayServerConfigTransfer = relayServerConfigTransfer;
} }
public async Task<string> Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) public async Task<string> Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
{ {
if (relayInfo.SecretKey != fileConfig.Data.Server.Relay.SecretKey) if (relayInfo.SecretKey != relayServerConfigTransfer.SecretKey)
{ {
return $"SecretKey validate fail"; return $"SecretKey validate fail";
} }

View File

@@ -0,0 +1,16 @@
using linker.config;
namespace linker.plugins.server
{
public sealed class ServerConfigTransfer
{
public int Port => config.Data.Server.ServicePort;
public ServerCertificateInfo SSL => config.Data.Server.SSL;
private readonly FileConfig config;
public ServerConfigTransfer(FileConfig config)
{
this.config = config;
}
}
}

View File

@@ -13,7 +13,7 @@ namespace linker.plugins.server
public StartupLevel Level => StartupLevel.Normal; public StartupLevel Level => StartupLevel.Normal;
public string Name => "server"; public string Name => "server";
public bool Required => true; public bool Required => true;
public string[] Dependent => new string[] {"messenger", "serialize", "firewall", "signin", "config"}; public string[] Dependent => new string[] { "messenger", "serialize", "firewall", "signin", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal; public StartupLoadType LoadType => StartupLoadType.Normal;
public void AddClient(ServiceCollection serviceCollection, FileConfig config) public void AddClient(ServiceCollection serviceCollection, FileConfig config)
@@ -23,6 +23,7 @@ namespace linker.plugins.server
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)
{ {
serviceCollection.AddSingleton<TcpServer>(); serviceCollection.AddSingleton<TcpServer>();
serviceCollection.AddSingleton<ServerConfigTransfer>();
} }
public void UseClient(ServiceProvider serviceProvider, FileConfig config) public void UseClient(ServiceProvider serviceProvider, FileConfig config)
@@ -31,21 +32,19 @@ namespace linker.plugins.server
public void UseServer(ServiceProvider serviceProvider, FileConfig config) public void UseServer(ServiceProvider serviceProvider, FileConfig config)
{ {
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
LoggerHelper.Instance.Info($"start server"); LoggerHelper.Instance.Info($"start server");
try try
{ {
//服务 //服务
TcpServer tcpServer = serviceProvider.GetService<TcpServer>(); TcpServer tcpServer = serviceProvider.GetService<TcpServer>();
if (config.Data.Server.ServicePort > 0) tcpServer.Start(serverConfigTransfer.Port);
{
tcpServer.Start(config.Data.Server.ServicePort);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
} }
LoggerHelper.Instance.Warning($"server listen:{config.Data.Server.ServicePort}"); LoggerHelper.Instance.Warning($"server listen:{serverConfigTransfer.Port}");
} }
} }

View File

@@ -1,5 +1,4 @@
using linker.libs.extends; using linker.libs.extends;
using linker.plugins.messenger;
using linker.plugins.resolver; using linker.plugins.resolver;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
@@ -22,6 +21,7 @@ namespace linker.plugins.server
public void Start(int port) public void Start(int port)
{ {
if (port <= 0) return;
if (socket == null) if (socket == null)
{ {
socket = BindAccept(port); socket = BindAccept(port);
@@ -61,8 +61,8 @@ namespace linker.plugins.server
{ {
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port); IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.IPv6Only(localEndPoint.AddressFamily, false); //socket.IPv6Only(localEndPoint.AddressFamily, false);
socket.ReuseBind(localEndPoint); socket.Bind(localEndPoint);
socket.Listen(int.MaxValue); socket.Listen(int.MaxValue);
SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs

View File

@@ -1,27 +0,0 @@
using linker.config;
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.sforward
{
public sealed class ConfigSyncSForwardSecretKey : IConfigSync
{
public string Name => "SForwardSecretKey";
private readonly FileConfig fileConfig;
public ConfigSyncSForwardSecretKey(FileConfig fileConfig)
{
this.fileConfig = fileConfig;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.SForward.SecretKey);
}
public void SetData(Memory<byte> data)
{
fileConfig.Data.Client.SForward.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span);
fileConfig.Data.Update();
}
}
}

View File

@@ -38,7 +38,7 @@ namespace linker.plugins.sforward
/// <returns></returns> /// <returns></returns>
public string GetSecretKey(ApiControllerParamsInfo param) public string GetSecretKey(ApiControllerParamsInfo param)
{ {
return forwardTransfer.GetSecretKey(); return forwardTransfer.SecretKey;
} }
/// <summary> /// <summary>
/// 设置密钥 /// 设置密钥
@@ -172,7 +172,7 @@ namespace linker.plugins.sforward
public sealed class SForwardListInfo public sealed class SForwardListInfo
{ {
public ConcurrentDictionary<string,int> List { get; set; } public ConcurrentDictionary<string, int> List { get; set; }
public ulong HashCode { get; set; } public ulong HashCode { get; set; }
} }
} }

View File

@@ -0,0 +1,26 @@
using linker.config;
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.sforward
{
public sealed class SForwardConfigSyncSecretKey : IConfigSync
{
public string Name => "SForwardSecretKey";
private readonly SForwardTransfer sForwardTransfer;
public SForwardConfigSyncSecretKey(SForwardTransfer sForwardTransfer)
{
this.sForwardTransfer = sForwardTransfer;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(sForwardTransfer.SecretKey);
}
public void SetData(Memory<byte> data)
{
sForwardTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
}
}
}

View File

@@ -0,0 +1,23 @@
using linker.config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace linker.plugins.sforward
{
public sealed class SForwardServerConfigTransfer
{
public string SecretKey => config.Data.Server.SForward.SecretKey;
public byte BufferSize => config.Data.Server.SForward.BufferSize;
public int WebPort => config.Data.Server.SForward.WebPort;
public int[] TunnelPortRange => config.Data.Server.SForward.TunnelPortRange;
private readonly FileConfig config;
public SForwardServerConfigTransfer(FileConfig config)
{
this.config = config;
}
}
}

View File

@@ -28,7 +28,7 @@ namespace linker.plugins.sforward
serviceCollection.AddSingleton<SForwardTransfer>(); serviceCollection.AddSingleton<SForwardTransfer>();
serviceCollection.AddSingleton<SForwardClientMessenger>(); serviceCollection.AddSingleton<SForwardClientMessenger>();
serviceCollection.AddSingleton<ConfigSyncSForwardSecretKey>(); serviceCollection.AddSingleton<SForwardConfigSyncSecretKey>();
} }
@@ -39,6 +39,7 @@ namespace linker.plugins.sforward
serviceCollection.AddSingleton<ISForwardServerCahing, SForwardServerCahing>(); serviceCollection.AddSingleton<ISForwardServerCahing, SForwardServerCahing>();
serviceCollection.AddSingleton<ISForwardValidator, Validator>(); serviceCollection.AddSingleton<ISForwardValidator, Validator>();
serviceCollection.AddSingleton<SForwardServerConfigTransfer>();
} }
bool added = false; bool added = false;
@@ -59,12 +60,13 @@ namespace linker.plugins.sforward
public void UseServer(ServiceProvider serviceProvider, FileConfig config) public void UseServer(ServiceProvider serviceProvider, FileConfig config)
{ {
SForwardProxy sForwardProxy = serviceProvider.GetService<SForwardProxy>(); SForwardProxy sForwardProxy = serviceProvider.GetService<SForwardProxy>();
if (config.Data.Server.SForward.WebPort > 0) SForwardServerConfigTransfer sForwardServerConfigTransfer = serviceProvider.GetService<SForwardServerConfigTransfer>();
if (sForwardServerConfigTransfer.WebPort > 0)
{ {
sForwardProxy.Start(config.Data.Server.SForward.WebPort, true, config.Data.Server.SForward.BufferSize,string.Empty); sForwardProxy.Start(sForwardServerConfigTransfer.WebPort, true, sForwardServerConfigTransfer.BufferSize,string.Empty);
LoggerHelper.Instance.Warning($"listen server forward web in {config.Data.Server.SForward.WebPort}"); LoggerHelper.Instance.Warning($"listen server forward web in {sForwardServerConfigTransfer.WebPort}");
} }
LoggerHelper.Instance.Warning($"listen server forward tunnel in {string.Join("-", config.Data.Server.SForward.TunnelPortRange)}"); LoggerHelper.Instance.Warning($"listen server forward tunnel in {string.Join("-", sForwardServerConfigTransfer.TunnelPortRange)}");
} }
} }

View File

@@ -19,6 +19,10 @@ namespace linker.plugins.sforward
public string Name => "sforward"; public string Name => "sforward";
public VersionManager DataVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager();
public VersionManager Version { get; } = new VersionManager();
public string SecretKey => fileConfig.Data.Client.SForward.SecretKey;
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly RunningConfig running; private readonly RunningConfig running;
@@ -28,8 +32,9 @@ namespace linker.plugins.sforward
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>(); private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>();
private readonly OperatingManager operatingManager = new OperatingManager();
public VersionManager Version { get; } = new VersionManager();
public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
{ {
@@ -68,23 +73,17 @@ namespace linker.plugins.sforward
{ {
DataVersion.Add(); DataVersion.Add();
} }
public ConcurrentDictionary<string, int> GetCount() public ConcurrentDictionary<string, int> GetCount()
{ {
return countDic; return countDic;
} }
public string GetSecretKey()
{
return fileConfig.Data.Client.SForward.SecretKey;
}
public void SetSecretKey(string key) public void SetSecretKey(string key)
{ {
fileConfig.Data.Client.SForward.SecretKey = key; fileConfig.Data.Client.SForward.SecretKey = key;
fileConfig.Data.Update(); fileConfig.Data.Update();
} }
private void Start() private void Start()
{ {
uint maxid = running.Data.SForwards.Count > 0 ? running.Data.SForwards.Max(c => c.Id) : 1; uint maxid = running.Data.SForwards.Count > 0 ? running.Data.SForwards.Max(c => c.Id) : 1;
@@ -188,7 +187,6 @@ namespace linker.plugins.sforward
Version.Add(); Version.Add();
} }
public List<SForwardInfo> Get() public List<SForwardInfo> Get()
{ {
return running.Data.SForwards; return running.Data.SForwards;
@@ -258,8 +256,6 @@ namespace linker.plugins.sforward
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max); return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
} }
private readonly OperatingManager operatingManager = new OperatingManager();
/// <summary> /// <summary>
/// 测试本机服务 /// 测试本机服务
/// </summary> /// </summary>

View File

@@ -24,8 +24,9 @@ namespace linker.plugins.sforward.messenger
private readonly SignCaching signCaching; private readonly SignCaching signCaching;
private readonly FileConfig configWrap; private readonly FileConfig configWrap;
private readonly ISForwardValidator validator; private readonly ISForwardValidator validator;
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignCaching signCaching, FileConfig configWrap, ISForwardValidator validator) public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignCaching signCaching, FileConfig configWrap, ISForwardValidator validator, SForwardServerConfigTransfer sForwardServerConfigTransfer)
{ {
this.proxy = proxy; this.proxy = proxy;
proxy.WebConnect = WebConnect; proxy.WebConnect = WebConnect;
@@ -36,6 +37,7 @@ namespace linker.plugins.sforward.messenger
this.signCaching = signCaching; this.signCaching = signCaching;
this.configWrap = configWrap; this.configWrap = configWrap;
this.validator = validator; this.validator = validator;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
} }
/// <summary> /// <summary>
@@ -46,7 +48,7 @@ namespace linker.plugins.sforward.messenger
public async Task Add(IConnection connection) public async Task Add(IConnection connection)
{ {
SForwardAddInfo sForwardAddInfo = MemoryPackSerializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span); SForwardAddInfo sForwardAddInfo = MemoryPackSerializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = configWrap.Data.Server.SForward.BufferSize }; SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = sForwardServerConfigTransfer.BufferSize };
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false) if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{ {
@@ -76,7 +78,7 @@ namespace linker.plugins.sforward.messenger
if (sForwardServerCahing.TryAdd(port, connection.Id)) if (sForwardServerCahing.TryAdd(port, connection.Id))
{ {
proxy.Stop(port); proxy.Stop(port);
result.Message = proxy.Start(port, false, configWrap.Data.Server.SForward.BufferSize, cache.GroupId); result.Message = proxy.Start(port, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
if (string.IsNullOrWhiteSpace(result.Message) == false) if (string.IsNullOrWhiteSpace(result.Message) == false)
{ {
LoggerHelper.Instance.Error(result.Message); LoggerHelper.Instance.Error(result.Message);
@@ -113,7 +115,7 @@ namespace linker.plugins.sforward.messenger
else else
{ {
proxy.Stop(sForwardAddInfo.RemotePort); proxy.Stop(sForwardAddInfo.RemotePort);
string msg = proxy.Start(sForwardAddInfo.RemotePort, false, configWrap.Data.Server.SForward.BufferSize, cache.GroupId); string msg = proxy.Start(sForwardAddInfo.RemotePort, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
if (string.IsNullOrWhiteSpace(msg) == false) if (string.IsNullOrWhiteSpace(msg) == false)
{ {
result.Success = false; result.Success = false;
@@ -314,7 +316,7 @@ namespace linker.plugins.sforward.messenger
{ {
Connection = sign.Connection, Connection = sign.Connection,
MessengerId = (ushort)SForwardMessengerIds.Proxy, MessengerId = (ushort)SForwardMessengerIds.Proxy,
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize }) Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
}).ConfigureAwait(false); }).ConfigureAwait(false);
} }
return false; return false;
@@ -334,7 +336,7 @@ namespace linker.plugins.sforward.messenger
{ {
Connection = sign.Connection, Connection = sign.Connection,
MessengerId = (ushort)SForwardMessengerIds.Proxy, MessengerId = (ushort)SForwardMessengerIds.Proxy,
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize }) Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
}).ConfigureAwait(false); }).ConfigureAwait(false);
} }
return false; return false;
@@ -354,7 +356,7 @@ namespace linker.plugins.sforward.messenger
{ {
Connection = sign.Connection, Connection = sign.Connection,
MessengerId = (ushort)SForwardMessengerIds.ProxyUdp, MessengerId = (ushort)SForwardMessengerIds.ProxyUdp,
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize }) Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
}).ConfigureAwait(false); }).ConfigureAwait(false);
} }
return false; return false;

View File

@@ -10,23 +10,25 @@ namespace linker.plugins.sforward.validator
public sealed class Validator : ISForwardValidator public sealed class Validator : ISForwardValidator
{ {
private readonly FileConfig config; private readonly FileConfig config;
public Validator(FileConfig config) private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
public Validator(FileConfig config, SForwardServerConfigTransfer sForwardServerConfigTransfer)
{ {
this.config = config; this.config = config;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
} }
public async Task<string> Validate(SignCacheInfo signCacheInfo, SForwardAddInfo sForwardAddInfo) public async Task<string> Validate(SignCacheInfo signCacheInfo, SForwardAddInfo sForwardAddInfo)
{ {
if (config.Data.Server.SForward.SecretKey != sForwardAddInfo.SecretKey) if (sForwardServerConfigTransfer.SecretKey != sForwardAddInfo.SecretKey)
{ {
return $"sforward secretKey 【{sForwardAddInfo.SecretKey}】 valid fail"; return $"sforward secretKey 【{sForwardAddInfo.SecretKey}】 valid fail";
} }
if (sForwardAddInfo.RemotePort > 0) if (sForwardAddInfo.RemotePort > 0)
{ {
if (sForwardAddInfo.RemotePort < config.Data.Server.SForward.TunnelPortRange[0] || sForwardAddInfo.RemotePort > config.Data.Server.SForward.TunnelPortRange[1]) if (sForwardAddInfo.RemotePort < sForwardServerConfigTransfer.TunnelPortRange[0] || sForwardAddInfo.RemotePort > sForwardServerConfigTransfer.TunnelPortRange[1])
{ {
return $"sforward tunnel port range {string.Join("-", config.Data.Server.SForward.TunnelPortRange)}"; return $"sforward tunnel port range {string.Join("-", sForwardServerConfigTransfer.TunnelPortRange)}";
} }
} }
await Task.CompletedTask; await Task.CompletedTask;

View File

@@ -0,0 +1,15 @@
using linker.config;
namespace linker.plugins.signIn
{
public sealed class SignInConfigTransfer
{
public string SecretKey => config.Data.Server.SignIn.SecretKey;
private readonly FileConfig config;
public SignInConfigTransfer(FileConfig config)
{
this.config = config;
}
}
}

View File

@@ -1,5 +1,6 @@
using linker.config; using linker.config;
using linker.plugins.signin.messenger; using linker.plugins.signin.messenger;
using linker.plugins.signIn;
using linker.plugins.signIn.args; using linker.plugins.signIn.args;
using linker.startup; using linker.startup;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@@ -37,6 +38,10 @@ namespace linker.plugins.signin
serviceCollection.AddSingleton<SignInArgsTransfer>(); serviceCollection.AddSingleton<SignInArgsTransfer>();
serviceCollection.AddSingleton<SignInArgsTypesLoader>(); serviceCollection.AddSingleton<SignInArgsTypesLoader>();
serviceCollection.AddSingleton<SignInArgsMachineKeyServer>(); serviceCollection.AddSingleton<SignInArgsMachineKeyServer>();
serviceCollection.AddSingleton<SignInConfigTransfer>();
} }
public void UseClient(ServiceProvider serviceProvider, FileConfig config) public void UseClient(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -8,6 +8,8 @@ using linker.plugins.client;
using linker.plugins.messenger; using linker.plugins.messenger;
using linker.plugins.socks5.config; using linker.plugins.socks5.config;
using linker.plugins.decenter; using linker.plugins.decenter;
using linker.plugins.tunnel;
using linker.plugins.tuntap;
namespace linker.plugins.socks5 namespace linker.plugins.socks5
{ {
@@ -23,6 +25,8 @@ namespace linker.plugins.socks5
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly TunnelProxy tunnelProxy; private readonly TunnelProxy tunnelProxy;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
public VersionManager Version { get; } = new VersionManager(); public VersionManager Version { get; } = new VersionManager();
private readonly ConcurrentDictionary<string, Socks5Info> socks5Infos = new ConcurrentDictionary<string, Socks5Info>(); private readonly ConcurrentDictionary<string, Socks5Info> socks5Infos = new ConcurrentDictionary<string, Socks5Info>();
@@ -30,7 +34,7 @@ namespace linker.plugins.socks5
private readonly SemaphoreSlim slim = new SemaphoreSlim(1); private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer) public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
@@ -38,6 +42,8 @@ namespace linker.plugins.socks5
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.tunnelProxy = tunnelProxy; this.tunnelProxy = tunnelProxy;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add(); clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
tunnelProxy.RefreshConfig += RefreshConfig; tunnelProxy.RefreshConfig += RefreshConfig;
@@ -122,7 +128,6 @@ namespace linker.plugins.socks5
}); });
} }
/// <summary> /// <summary>
/// 重启 /// 重启
/// </summary> /// </summary>
@@ -196,11 +201,11 @@ namespace linker.plugins.socks5
{ {
//排除的IP //排除的IP
uint[] excludeIps =//本机局域网IP uint[] excludeIps =//本机局域网IP
config.Data.Client.Tunnel.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
//路由上的IP //路由上的IP
.Concat(config.Data.Client.Tunnel.RouteIPs) .Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP //网卡IP 服务器IP
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address }) .Concat(new IPAddress[] { tuntapConfigTransfer.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP //网卡配置的局域网IP
.Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP)) .Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value) .Select(NetworkHelper.IP2Value)

View File

@@ -28,8 +28,8 @@ namespace linker.plugins.socks5
protected override string TransactionId => "socks5"; protected override string TransactionId => "socks5";
public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig) public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer) : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
{ {
this.clientSignInTransfer = clientSignInTransfer; this.clientSignInTransfer = clientSignInTransfer;
TaskUdp(); TaskUdp();

View File

@@ -1,28 +0,0 @@
using linker.config;
using linker.plugins.config;
using linker.tunnel.transport;
using MemoryPack;
namespace linker.plugins.tunnel
{
public sealed class ConfigSyncTunnelTransports : IConfigSync
{
public string Name => "TunnelTransports";
private readonly FileConfig fileConfig;
public ConfigSyncTunnelTransports(FileConfig fileConfig)
{
this.fileConfig = fileConfig;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Tunnel.Transports);
}
public void SetData(Memory<byte> data)
{
fileConfig.Data.Client.Tunnel.Transports = MemoryPackSerializer.Deserialize<List<TunnelTransportItemInfo>>(data.Span);
fileConfig.Data.Update();
}
}
}

View File

@@ -17,42 +17,30 @@ namespace linker.plugins.tunnel
{ {
public IPAddress LocalIP => clientSignInState.Connection?.LocalAddress.Address ?? IPAddress.Any; public IPAddress LocalIP => clientSignInState.Connection?.LocalAddress.Address ?? IPAddress.Any;
public IPEndPoint ServerHost => clientSignInState.Connection?.Address ?? null; public IPEndPoint ServerHost => clientSignInState.Connection?.Address ?? null;
public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate;
public X509Certificate2 Certificate { get; private set; }
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly FileConfig config;
private readonly RunningConfig running;
private readonly TunnelExcludeIPTransfer excludeIPTransfer; private readonly TunnelExcludeIPTransfer excludeIPTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, FileConfig config, RunningConfig running, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer) public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer)
{ {
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.config = config;
this.running = running;
this.excludeIPTransfer = excludeIPTransfer; this.excludeIPTransfer = excludeIPTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
string path = Path.GetFullPath(clientConfigTransfer.SSL.File);
if (File.Exists(path))
{
Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable);
}
} }
public List<TunnelTransportItemInfo> GetTunnelTransports() public List<TunnelTransportItemInfo> GetTunnelTransports()
{ {
return config.Data.Client.Tunnel.Transports; return tunnelConfigTransfer.Transports;
} }
public void SetTunnelTransports(List<TunnelTransportItemInfo> transports, bool updateVersion) public void SetTunnelTransports(List<TunnelTransportItemInfo> transports, bool updateVersion)
{ {
config.Data.Client.Tunnel.Transports = transports; tunnelConfigTransfer.SetTransports(transports);
config.Data.Update();
} }
public NetworkInfo GetLocalConfig() public NetworkInfo GetLocalConfig()
@@ -60,7 +48,7 @@ namespace linker.plugins.tunnel
var excludeips = excludeIPTransfer.Get(); var excludeips = excludeIPTransfer.Get();
return new NetworkInfo return new NetworkInfo
{ {
LocalIps = config.Data.Client.Tunnel.LocalIPs.Where(c => LocalIps = tunnelConfigTransfer.LocalIPs.Where(c =>
{ {
if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{ {
@@ -78,7 +66,7 @@ namespace linker.plugins.tunnel
return true; return true;
}) })
.ToArray(), .ToArray(),
RouteLevel = config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus, RouteLevel = tunnelConfigTransfer.RouteLevel,
MachineId = clientConfigTransfer.Id MachineId = clientConfigTransfer.Id
}; };
} }

View File

@@ -17,23 +17,23 @@ namespace linker.plugins.tunnel
protected virtual string TransactionId { get; } protected virtual string TransactionId { get; }
protected readonly ConcurrentDictionary<string, ITunnelConnection> connections = new ConcurrentDictionary<string, ITunnelConnection>(); protected readonly ConcurrentDictionary<string, ITunnelConnection> connections = new ConcurrentDictionary<string, ITunnelConnection>();
private readonly RunningConfig runningConfig;
private readonly TunnelTransfer tunnelTransfer; private readonly TunnelTransfer tunnelTransfer;
private readonly RelayTransfer relayTransfer; private readonly RelayTransfer relayTransfer;
private readonly PcpTransfer pcpTransfer; private readonly PcpTransfer pcpTransfer;
private readonly ClientSignInTransfer clientSignInTransfer; private readonly ClientSignInTransfer clientSignInTransfer;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public TunnelBase(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig, ClientConfigTransfer clientConfigTransfer) public TunnelBase(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.runningConfig = runningConfig;
this.tunnelTransfer = tunnelTransfer; this.tunnelTransfer = tunnelTransfer;
this.relayTransfer = relayTransfer; this.relayTransfer = relayTransfer;
this.pcpTransfer = pcpTransfer; this.pcpTransfer = pcpTransfer;
this.clientSignInTransfer = clientSignInTransfer; this.clientSignInTransfer = clientSignInTransfer;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
//监听打洞成功 //监听打洞成功
tunnelTransfer.SetConnectedCallback(TransactionId, OnConnected); tunnelTransfer.SetConnectedCallback(TransactionId, OnConnected);
@@ -127,7 +127,7 @@ namespace linker.plugins.tunnel
{ {
//中继 //中继
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}");
ITunnelConnection connection = await relayTransfer.ConnectAsync(clientConfigTransfer.Id, machineId, TransactionId, runningConfig.Data.Relay.DefaultNodeId).ConfigureAwait(false); ITunnelConnection connection = await relayTransfer.ConnectAsync(clientConfigTransfer.Id, machineId, TransactionId, relayClientConfigTransfer.DefaultNodeId).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}");

View File

@@ -0,0 +1,26 @@
using linker.plugins.config;
using linker.tunnel.transport;
using MemoryPack;
namespace linker.plugins.tunnel
{
public sealed class TunnelConfigSyncTransports : IConfigSync
{
public string Name => "TunnelTransports";
private readonly TunnelConfigTransfer tunnelConfigTransfer;
public TunnelConfigSyncTransports( TunnelConfigTransfer tunnelConfigTransfer)
{
this.tunnelConfigTransfer = tunnelConfigTransfer;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(tunnelConfigTransfer.Transports);
}
public void SetData(Memory<byte> data)
{
tunnelConfigTransfer.SetTransports(MemoryPackSerializer.Deserialize<List<TunnelTransportItemInfo>>(data.Span));
}
}
}

View File

@@ -5,49 +5,58 @@ using linker.plugins.client;
using linker.plugins.decenter; using linker.plugins.decenter;
using linker.plugins.messenger; using linker.plugins.messenger;
using linker.tunnel; using linker.tunnel;
using linker.tunnel.adapter; using linker.tunnel.transport;
using MemoryPack; using MemoryPack;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Net; using System.Net;
using System.Net.Quic; using System.Net.Quic;
using System.Security.Cryptography.X509Certificates;
namespace linker.plugins.tunnel namespace linker.plugins.tunnel
{ {
public sealed class TunnelConfigTransfer:IDecenter public sealed class TunnelConfigTransfer : IDecenter
{ {
public string Name => "tunnel"; public string Name => "tunnel";
public VersionManager DataVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager();
public int RouteLevel => config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus;
public IPAddress[] LocalIPs => config.Data.Client.Tunnel.LocalIPs;
public IPAddress[] RouteIPs => config.Data.Client.Tunnel.RouteIPs;
public List<TunnelTransportItemInfo> Transports => config.Data.Client.Tunnel.Transports;
public X509Certificate2 Certificate { get; private set; }
private readonly FileConfig config; private readonly FileConfig config;
private readonly RunningConfig running; private readonly RunningConfig running;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ITunnelAdapter tunnelAdapter;
private readonly TunnelUpnpTransfer upnpTransfer; private readonly TunnelUpnpTransfer upnpTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
public VersionManager Version { get; } = new VersionManager(); public VersionManager Version { get; } = new VersionManager();
public ConcurrentDictionary<string, TunnelTransportRouteLevelInfo> Config { get; } = new ConcurrentDictionary<string, TunnelTransportRouteLevelInfo>(); public ConcurrentDictionary<string, TunnelTransportRouteLevelInfo> Config { get; } = new ConcurrentDictionary<string, TunnelTransportRouteLevelInfo>();
public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ITunnelAdapter tunnelAdapter, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer) public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer)
{ {
this.config = config; this.config = config;
this.running = running; this.running = running;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.tunnelAdapter = tunnelAdapter;
this.upnpTransfer = upnpTransfer; this.upnpTransfer = upnpTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
string path = Path.GetFullPath(clientConfigTransfer.SSL.File);
if (File.Exists(path))
{
Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable);
}
clientSignInState.NetworkEnabledHandle += (times) => clientSignInState.NetworkEnabledHandle += (times) =>
{ {
RefreshRouteLevel(); TimerHelper.Async(RefreshRouteLevel);
DataVersion.Add();
RefreshPortMap(); RefreshPortMap();
}; };
TestQuic(); TestQuic();
} }
public Memory<byte> GetData() public Memory<byte> GetData()
{ {
TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel(); TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel();
@@ -73,18 +82,21 @@ namespace linker.plugins.tunnel
Version.Add(); Version.Add();
} }
public void SetTransports(List<TunnelTransportItemInfo> transports)
{
config.Data.Client.Tunnel.Transports = transports;
config.Data.Update();
}
/// <summary> /// <summary>
/// 刷新网关等级数据 /// 刷新网关等级数据
/// </summary> /// </summary>
private void RefreshRouteLevel() public void RefreshRouteLevel()
{
TimerHelper.Async(() =>
{ {
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List<IPAddress> ips); config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List<IPAddress> ips);
config.Data.Client.Tunnel.RouteIPs = ips.ToArray(); config.Data.Client.Tunnel.RouteIPs = ips.ToArray();
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
}); DataVersion.Add();
} }
/// <summary> /// <summary>
@@ -168,7 +180,7 @@ namespace linker.plugins.tunnel
} }
else else
{ {
upnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address,18180); upnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address, 18180);
} }
} }
} }

View File

@@ -65,9 +65,9 @@ namespace linker.plugins.tunnel
serviceCollection.AddSingleton<TunnelUpnpTransfer>(); serviceCollection.AddSingleton<TunnelUpnpTransfer>();
serviceCollection.AddSingleton<ConfigSyncTunnelTransports>(); serviceCollection.AddSingleton<TunnelConfigSyncTransports>();
serviceCollection.AddSingleton<TunnelConfigTransfer>();
} }
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)
@@ -83,16 +83,6 @@ namespace linker.plugins.tunnel
public void UseClient(ServiceProvider serviceProvider, FileConfig config) public void UseClient(ServiceProvider serviceProvider, FileConfig config)
{ {
ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService<ClientConfigTransfer>();
LoggerHelper.Instance.Info($"tunnel route level getting.");
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List<IPAddress> ips);
config.Data.Client.Tunnel.RouteIPs = ips.ToArray();
LoggerHelper.Instance.Warning($"route ips:{string.Join(",", ips.Select(c => c.ToString()))}");
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
LoggerHelper.Instance.Warning($"tunnel local ips :{string.Join(",", config.Data.Client.Tunnel.LocalIPs.Select(c => c.ToString()))}");
LoggerHelper.Instance.Warning($"tunnel route level:{config.Data.Client.Tunnel.RouteLevel}");
ITunnelAdapter tunnelAdapter = serviceProvider.GetService<ITunnelAdapter>(); ITunnelAdapter tunnelAdapter = serviceProvider.GetService<ITunnelAdapter>();
TunnelUpnpTransfer upnpTransfer = serviceProvider.GetService<TunnelUpnpTransfer>(); TunnelUpnpTransfer upnpTransfer = serviceProvider.GetService<TunnelUpnpTransfer>();
@@ -117,11 +107,17 @@ namespace linker.plugins.tunnel
TunnelTransfer tunnel = serviceProvider.GetService<TunnelTransfer>(); TunnelTransfer tunnel = serviceProvider.GetService<TunnelTransfer>();
tunnel.LoadTransports(compack, tunnelAdapter, upnpTransfer, transports); tunnel.LoadTransports(compack, tunnelAdapter, upnpTransfer, transports);
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<TunnelExcludeIPTransfer>(); TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<TunnelExcludeIPTransfer>();
TunnelExcludeIPTypesLoader tunnelExcludeIPTypesLoader = serviceProvider.GetService<TunnelExcludeIPTypesLoader>(); TunnelExcludeIPTypesLoader tunnelExcludeIPTypesLoader = serviceProvider.GetService<TunnelExcludeIPTypesLoader>();
ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService<ClientConfigTransfer>();
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
LoggerHelper.Instance.Info($"tunnel route level getting.");
tunnelConfigTransfer.RefreshRouteLevel();
LoggerHelper.Instance.Warning($"route ips:{string.Join(",", tunnelConfigTransfer.RouteIPs.Select(c => c.ToString()))}");
LoggerHelper.Instance.Warning($"tunnel local ips :{string.Join(",", tunnelConfigTransfer.LocalIPs.Select(c => c.ToString()))}");
LoggerHelper.Instance.Warning($"tunnel route level:{tunnelConfigTransfer.RouteLevel}");
} }
public void UseServer(ServiceProvider serviceProvider, FileConfig config) public void UseServer(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -5,15 +5,15 @@ namespace linker.plugins.tuntap
{ {
public sealed class ExcludeIP : ITunnelExcludeIP public sealed class ExcludeIP : ITunnelExcludeIP
{ {
private readonly RunningConfig runningConfig; private readonly TuntapConfigTransfer tuntapConfigTransfer;
public ExcludeIP(RunningConfig runningConfig) public ExcludeIP(TuntapConfigTransfer tuntapConfigTransfer)
{ {
this.runningConfig = runningConfig; this.tuntapConfigTransfer = tuntapConfigTransfer;
} }
public ExcludeIPItem[] Get() public ExcludeIPItem[] Get()
{ {
//网卡IP不参与打洞 //网卡IP不参与打洞
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = runningConfig.Data.Tuntap.IP, Mask = 32 } }; return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } };
} }
} }
} }

View File

@@ -10,8 +10,7 @@ using linker.plugins.tuntap.config;
using linker.tun; using linker.tun;
using linker.plugins.tuntap.lease; using linker.plugins.tuntap.lease;
using linker.plugins.decenter; using linker.plugins.decenter;
using System.Text.RegularExpressions; using linker.plugins.tunnel;
using linker.libs.extends;
namespace linker.plugins.tuntap namespace linker.plugins.tuntap
{ {
@@ -20,15 +19,20 @@ namespace linker.plugins.tuntap
public string Name => "tuntap"; public string Name => "tuntap";
public VersionManager DataVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager();
private TuntapConfigInfo configInfo => runningConfig.Data.Tuntap;
public IPAddress IP=> configInfo.IP;
public bool Running => configInfo.Running;
public TuntapSwitch Switch => configInfo.Switch;
public string DeviceName => "linker";
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly TuntapTransfer tuntapTransfer; private readonly TuntapTransfer tuntapTransfer;
private readonly LeaseClientTreansfer leaseClientTreansfer; private readonly LeaseClientTreansfer leaseClientTreansfer;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0]; private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0];
private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>(); private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>();
@@ -38,30 +42,33 @@ namespace linker.plugins.tuntap
public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos; public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos;
public Action HandleReset { get; set; }
public Action<TuntapVeaLanIPAddress[]> HandleSetIPs { get; set; }
public Action<string,uint> HandleSetIP { get; set; }
public Action<string> HandleRemoveIP { get; set; }
private readonly SemaphoreSlim slim = new SemaphoreSlim(1); private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
public TuntapConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer) public TuntapConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.config = config;
this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.tuntapTransfer = tuntapTransfer; this.tuntapTransfer = tuntapTransfer;
this.leaseClientTreansfer = leaseClientTreansfer; this.leaseClientTreansfer = leaseClientTreansfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
clientSignInState.NetworkEnabledHandle += NetworkEnable; clientSignInState.NetworkEnabledHandle += NetworkEnable;
tuntapProxy.RefreshConfig = RefreshConfig;
tuntapTransfer.OnSetupBefore += () => { DataVersion.Add(); }; tuntapTransfer.OnSetupBefore += () => { DataVersion.Add(); };
tuntapTransfer.OnSetupAfter += () => { DataVersion.Add(); }; tuntapTransfer.OnSetupAfter += () => { DataVersion.Add(); };
tuntapTransfer.OnSetupSuccess += () => { DataVersion.Add(); runningConfig.Data.Tuntap.Running = true; runningConfig.Data.Update(); AddForward(); }; tuntapTransfer.OnSetupSuccess += () => { DataVersion.Add(); configInfo.Running = true; runningConfig.Data.Update(); AddForward(); };
tuntapTransfer.OnShutdownBefore += () => { DataVersion.Add(); }; tuntapTransfer.OnShutdownBefore += () => { DataVersion.Add(); };
tuntapTransfer.OnShutdownAfter += () => { DataVersion.Add(); }; tuntapTransfer.OnShutdownAfter += () => { DataVersion.Add(); };
tuntapTransfer.OnShutdownSuccess += () => { DataVersion.Add(); DeleteForward(); DelRoute(); runningConfig.Data.Tuntap.Running = false; runningConfig.Data.Update(); DataVersion.Add(); }; tuntapTransfer.OnShutdownSuccess += () => { DataVersion.Add(); DeleteForward(); DelRoute(); configInfo.Running = false; runningConfig.Data.Update(); DataVersion.Add(); };
InitConfig();
} }
string groupid = string.Empty; string groupid = string.Empty;
@@ -69,21 +76,13 @@ namespace linker.plugins.tuntap
{ {
if (groupid != clientConfigTransfer.Group.Id) if (groupid != clientConfigTransfer.Group.Id)
{ {
tuntapInfos.Clear(); tuntapProxy.ClearIPs(); tuntapInfos.Clear(); HandleReset();
} }
groupid = clientConfigTransfer.Group.Id; groupid = clientConfigTransfer.Group.Id;
RefreshIP(); RefreshIP();
} }
private void InitConfig()
{
if (runningConfig.Data.Tuntap.Lans.Count == 0 && runningConfig.Data.Tuntap.LanIPs.Length > 0)
{
runningConfig.Data.Tuntap.Lans = runningConfig.Data.Tuntap.LanIPs.Select((a, b) => new TuntapLanInfo { IP = a, PrefixLength = (byte)runningConfig.Data.Tuntap.Masks[b] }).ToList();
}
}
/// <summary> /// <summary>
/// 更新本机网卡信息 /// 更新本机网卡信息
/// </summary> /// </summary>
@@ -92,25 +91,22 @@ namespace linker.plugins.tuntap
{ {
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
IPAddress oldIP = runningConfig.Data.Tuntap.IP; IPAddress oldIP = configInfo.IP;
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength; byte prefixLength = configInfo.PrefixLength;
runningConfig.Data.Tuntap.IP = info.IP ?? IPAddress.Any; configInfo.IP = info.IP ?? IPAddress.Any;
runningConfig.Data.Tuntap.Lans = info.Lans; configInfo.Lans = info.Lans;
runningConfig.Data.Tuntap.PrefixLength = info.PrefixLength; configInfo.PrefixLength = info.PrefixLength;
runningConfig.Data.Tuntap.Switch = info.Switch; configInfo.Switch = info.Switch;
runningConfig.Data.Tuntap.Forwards = info.Forwards; configInfo.Forwards = info.Forwards;
runningConfig.Data.Update(); runningConfig.Data.Update();
TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength }; TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength };
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
await LeaseIP(); await LeaseIP();
bool needReboot = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running if ((oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running)
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running;
if (needReboot)
{ {
await RetstartDevice(); await RetstartDevice();
} }
@@ -123,22 +119,21 @@ namespace linker.plugins.tuntap
DataVersion.Add(); DataVersion.Add();
}); });
} }
public Memory<byte> GetData() public Memory<byte> GetData()
{ {
TuntapInfo info = new TuntapInfo TuntapInfo info = new TuntapInfo
{ {
IP = runningConfig.Data.Tuntap.IP, IP = configInfo.IP,
Lans = runningConfig.Data.Tuntap.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), Lans = configInfo.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
PrefixLength = runningConfig.Data.Tuntap.PrefixLength, PrefixLength = configInfo.PrefixLength,
MachineId = clientConfigTransfer.Id, MachineId = clientConfigTransfer.Id,
Status = tuntapTransfer.Status, Status = tuntapTransfer.Status,
SetupError = tuntapTransfer.SetupError, SetupError = tuntapTransfer.SetupError,
NatError = tuntapTransfer.NatError, NatError = tuntapTransfer.NatError,
SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}", SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}",
Forwards = runningConfig.Data.Tuntap.Forwards, Forwards = configInfo.Forwards,
Switch = runningConfig.Data.Tuntap.Switch Switch = configInfo.Switch
}; };
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add(); Version.Add();
@@ -214,7 +209,13 @@ namespace linker.plugins.tuntap
}); });
} }
/// <summary>
/// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来
/// </summary>
public void RefreshConfig()
{
DataVersion.Add();
}
/// <summary> /// <summary>
/// 刷新IP /// 刷新IP
/// </summary> /// </summary>
@@ -222,8 +223,8 @@ namespace linker.plugins.tuntap
{ {
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
IPAddress oldIP = runningConfig.Data.Tuntap.IP; IPAddress oldIP = configInfo.IP;
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength; byte prefixLength = configInfo.PrefixLength;
await LeaseIP(); await LeaseIP();
while (tuntapTransfer.Status == TuntapStatus.Operating) while (tuntapTransfer.Status == TuntapStatus.Operating)
@@ -231,19 +232,41 @@ namespace linker.plugins.tuntap
await Task.Delay(1000); await Task.Delay(1000);
} }
bool run = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running bool run = (oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running; || configInfo.Running && tuntapTransfer.Status != TuntapStatus.Running;
if (run) if (run)
{ {
tuntapTransfer.Shutdown(); tuntapTransfer.Shutdown();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength); tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
} }
DataVersion.Add(); DataVersion.Add();
}); });
} }
/// <summary> /// <summary>
/// 租赁IP
/// </summary>
/// <returns></returns>
private async Task LeaseIP()
{
if (configInfo.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo))
{
if (tuntapGroup2IPInfo.IP.Equals(configInfo.IP) == false || tuntapGroup2IPInfo.PrefixLength != configInfo.PrefixLength)
{
configInfo.IP = tuntapGroup2IPInfo.IP;
configInfo.PrefixLength = tuntapGroup2IPInfo.PrefixLength;
}
}
LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(configInfo.IP, configInfo.PrefixLength);
configInfo.IP = leaseInfo.IP;
configInfo.PrefixLength = leaseInfo.PrefixLength;
runningConfig.Data.Update();
tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength };
configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
}
/// <summary>
/// 重启网卡 /// 重启网卡
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
@@ -251,7 +274,7 @@ namespace linker.plugins.tuntap
{ {
tuntapTransfer.Shutdown(); tuntapTransfer.Shutdown();
await LeaseIP(); await LeaseIP();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength); tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
} }
/// <summary> /// <summary>
/// 关闭网卡 /// 关闭网卡
@@ -260,36 +283,7 @@ namespace linker.plugins.tuntap
{ {
tuntapTransfer.Shutdown(); tuntapTransfer.Shutdown();
} }
/// <summary>
/// 租赁IP
/// </summary>
/// <returns></returns>
private async Task LeaseIP()
{
if (runningConfig.Data.Tuntap.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo))
{
if (tuntapGroup2IPInfo.IP.Equals(runningConfig.Data.Tuntap.IP) == false || tuntapGroup2IPInfo.PrefixLength != runningConfig.Data.Tuntap.PrefixLength)
{
runningConfig.Data.Tuntap.IP = tuntapGroup2IPInfo.IP;
runningConfig.Data.Tuntap.PrefixLength = tuntapGroup2IPInfo.PrefixLength;
}
}
LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
runningConfig.Data.Tuntap.IP = leaseInfo.IP;
runningConfig.Data.Tuntap.PrefixLength = leaseInfo.PrefixLength;
runningConfig.Data.Update();
tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
}
/// <summary>
/// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来
/// </summary>
public void RefreshConfig()
{
DataVersion.Add();
}
// <summary> // <summary>
/// 添加端口转发 /// 添加端口转发
@@ -314,7 +308,7 @@ namespace linker.plugins.tuntap
} }
private List<LinkerTunDeviceForwardItem> ParseForwardItems() private List<LinkerTunDeviceForwardItem> ParseForwardItems()
{ {
return runningConfig.Data.Tuntap.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList(); return configInfo.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList();
} }
/// <summary> /// <summary>
@@ -334,16 +328,16 @@ namespace linker.plugins.tuntap
TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
routeItems = ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.PrefixLength }).ToArray(); routeItems = ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.PrefixLength }).ToArray();
tuntapTransfer.AddRoute(routeItems, runningConfig.Data.Tuntap.IP); tuntapTransfer.AddRoute(routeItems, configInfo.IP);
tuntapProxy.SetIPs(ips); HandleSetIPs(ips);
foreach (var item in tuntapInfos.Values) foreach (var item in tuntapInfos.Values)
{ {
tuntapProxy.SetIP(item.MachineId, NetworkHelper.IP2Value(item.IP)); HandleSetIP(item.MachineId, NetworkHelper.IP2Value(item.IP));
} }
foreach (var item in tuntapInfos.Values.Where(c => c.IP.Equals(IPAddress.Any))) foreach (var item in tuntapInfos.Values.Where(c => c.IP.Equals(IPAddress.Any)))
{ {
tuntapProxy.RemoveIP(item.MachineId); HandleRemoveIP(item.MachineId);
} }
Version.Add(); Version.Add();
} }
@@ -352,13 +346,13 @@ namespace linker.plugins.tuntap
{ {
//排除的IP //排除的IP
uint[] excludeIps =//本机局域网IP uint[] excludeIps =//本机局域网IP
config.Data.Client.Tunnel.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
//路由上的IP //路由上的IP
.Concat(config.Data.Client.Tunnel.RouteIPs) .Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP //网卡IP 服务器IP
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address }) .Concat(new IPAddress[] { configInfo.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP //网卡配置的局域网IP
.Concat(runningConfig.Data.Tuntap.Lans.Select(c => c.IP)) .Concat(configInfo.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value) .Select(NetworkHelper.IP2Value)
.ToArray(); .ToArray();

View File

@@ -3,7 +3,6 @@ using linker.libs;
using linker.plugins.tuntap.config; using linker.plugins.tuntap.config;
using linker.tun; using linker.tun;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Xml.Linq;
namespace linker.plugins.tuntap namespace linker.plugins.tuntap
{ {
@@ -29,7 +28,7 @@ namespace linker.plugins.tuntap
{ {
TimerHelper.SetInterval(async () => TimerHelper.SetInterval(async () =>
{ {
if (setupTimes > 0 && runningConfig.Data.Tuntap.Running && OperatingSystem.IsWindows()) if (setupTimes > 0 && tuntapConfigTransfer.Running && OperatingSystem.IsWindows())
{ {
await InterfaceCheck().ConfigureAwait(false); await InterfaceCheck().ConfigureAwait(false);
InterfaceOrder(); InterfaceOrder();
@@ -41,7 +40,7 @@ namespace linker.plugins.tuntap
{ {
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
{ {
LoggerHelper.Instance.Error($"tuntap inerface {tuntapTransfer.DeviceName} is down, restarting"); LoggerHelper.Instance.Error($"tuntap inerface {tuntapConfigTransfer.DeviceName} is down, restarting");
linkerTunDeviceAdapter.Shutdown(); linkerTunDeviceAdapter.Shutdown();
await Task.Delay(5000).ConfigureAwait(false); await Task.Delay(5000).ConfigureAwait(false);
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
@@ -52,7 +51,7 @@ namespace linker.plugins.tuntap
} }
private async Task<bool> InterfaceAvailable() private async Task<bool> InterfaceAvailable()
{ {
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapTransfer.DeviceName); NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName);
return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing(); return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing();
} }
private async Task<bool> InterfacePing() private async Task<bool> InterfacePing()
@@ -60,7 +59,7 @@ namespace linker.plugins.tuntap
try try
{ {
using Ping ping = new Ping(); using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(runningConfig.Data.Tuntap.IP, 500); PingReply pingReply = await ping.SendPingAsync(tuntapConfigTransfer.IP, 500);
return pingReply.Status == IPStatus.Success; return pingReply.Status == IPStatus.Success;
} }
catch (Exception) catch (Exception)
@@ -71,7 +70,7 @@ namespace linker.plugins.tuntap
private void InterfaceOrder() private void InterfaceOrder()
{ {
NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapTransfer.DeviceName); NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName);
NetworkInterface first = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(); NetworkInterface first = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault();
if (linker != null && linker.Name != first.Name) if (linker != null && linker.Name != first.Name)
@@ -79,14 +78,14 @@ namespace linker.plugins.tuntap
int metricv4 = 0; int metricv4 = 0;
int metricv6 = 0; int metricv6 = 0;
List<string> commands = new List<string> { List<string> commands = new List<string> {
$"netsh interface ipv4 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv4}", $"netsh interface ipv4 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv4}",
$"netsh interface ipv6 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv6}" $"netsh interface ipv6 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv6}"
}; };
commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() commands.AddRange(NetworkInterface.GetAllNetworkInterfaces()
.Where(c => c.Name != tuntapTransfer.DeviceName) .Where(c => c.Name != tuntapConfigTransfer.DeviceName)
.Select(c => $"netsh interface ipv4 set interface \"{c.Name}\" metric={++metricv4}")); .Select(c => $"netsh interface ipv4 set interface \"{c.Name}\" metric={++metricv4}"));
commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() commands.AddRange(NetworkInterface.GetAllNetworkInterfaces()
.Where(c => c.Name != tuntapTransfer.DeviceName) .Where(c => c.Name != tuntapConfigTransfer.DeviceName)
.Select(c => $"netsh interface ipv6 set interface \"{c.Name}\" metric={++metricv6}")); .Select(c => $"netsh interface ipv6 set interface \"{c.Name}\" metric={++metricv6}"));
CommandHelper.Windows(string.Empty, commands.ToArray()); CommandHelper.Windows(string.Empty, commands.ToArray());
} }

View File

@@ -15,18 +15,14 @@ namespace linker.plugins.tuntap
{ {
private readonly TuntapTransfer tuntapTransfer; private readonly TuntapTransfer tuntapTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy; private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, ClientConfigTransfer clientConfigTransfer) public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ClientConfigTransfer clientConfigTransfer)
{ {
this.tuntapTransfer = tuntapTransfer; this.tuntapTransfer = tuntapTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer;
this.config = config;
this.tuntapProxy = tuntapProxy; this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
PingTask(); PingTask();
@@ -51,10 +47,10 @@ namespace linker.plugins.tuntap
} }
private async Task Ping() private async Task Ping()
{ {
if (tuntapTransfer.Status == TuntapStatus.Running && (runningConfig.Data.Tuntap.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay) if (tuntapTransfer.Status == TuntapStatus.Running && (tuntapConfigTransfer.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay)
{ {
var items = tuntapConfigTransfer.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running); var items = tuntapConfigTransfer.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running);
if ((runningConfig.Data.Tuntap.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect) if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
{ {
var connections = tuntapProxy.GetConnections(); var connections = tuntapProxy.GetConnections();
items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == clientConfigTransfer.Id); items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == clientConfigTransfer.Id);

View File

@@ -26,19 +26,21 @@ namespace linker.plugins.tuntap
private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter; private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter;
private HashSet<uint> ipRefreshCache = new HashSet<uint>(); private HashSet<uint> ipRefreshCache = new HashSet<uint>();
public Action RefreshConfig = () => { };
private readonly RunningConfig runningConfig;
private readonly ClientSignInState clientSignInState;
private readonly ClientSignInTransfer clientSignInTransfer; private readonly ClientSignInTransfer clientSignInTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
public TuntapProxy(ClientConfigTransfer clientConfigTransfer, RunningConfig runningConfig, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter, ClientSignInState clientSignInState) public TuntapProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter, ClientSignInState clientSignInState,RelayClientConfigTransfer relayClientConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer) : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
{ {
this.clientSignInTransfer = clientSignInTransfer; this.clientSignInTransfer = clientSignInTransfer;
this.runningConfig = runningConfig;
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter; this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
this.clientSignInState = clientSignInState; this.tuntapConfigTransfer = tuntapConfigTransfer;
tuntapConfigTransfer.HandleReset += ClearIPs;
tuntapConfigTransfer.HandleSetIPs += SetIPs;
tuntapConfigTransfer.HandleSetIP += SetIP;
tuntapConfigTransfer.HandleRemoveIP += RemoveIP;
} }
protected override void Connected(ITunnelConnection connection) protected override void Connected(ITunnelConnection connection)
@@ -73,7 +75,7 @@ namespace linker.plugins.tuntap
/// <returns></returns> /// <returns></returns>
public async Task Closed(ITunnelConnection connection, object state) public async Task Closed(ITunnelConnection connection, object state)
{ {
RefreshConfig(); tuntapConfigTransfer.RefreshConfig();
Version.Add(); Version.Add();
await Task.CompletedTask; await Task.CompletedTask;
} }
@@ -88,7 +90,7 @@ namespace linker.plugins.tuntap
//IPV4广播组播、IPV6 多播 //IPV4广播组播、IPV6 多播
if (packet.IPV4Broadcast || packet.IPV6Multicast) if (packet.IPV4Broadcast || packet.IPV6Multicast)
{ {
if (connections.IsEmpty == false && (runningConfig.Data.Tuntap.Switch & TuntapSwitch.Multicast) == 0) if (connections.IsEmpty == false && (tuntapConfigTransfer.Switch & TuntapSwitch.Multicast) == 0)
{ {
await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet))); await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet)));
} }
@@ -130,7 +132,7 @@ namespace linker.plugins.tuntap
/// 设置IP等下有连接进来用IP匹配才能知道这个连接是要连谁 /// 设置IP等下有连接进来用IP匹配才能知道这个连接是要连谁
/// </summary> /// </summary>
/// <param name="ips"></param> /// <param name="ips"></param>
public void SetIPs(TuntapVeaLanIPAddress[] ips) private void SetIPs(TuntapVeaLanIPAddress[] ips)
{ {
var dic = ips.GroupBy(c => c.NetWork).ToDictionary(c => c.Key, d => d.Select(e => e.MachineId).ToList()); var dic = ips.GroupBy(c => c.NetWork).ToDictionary(c => c.Key, d => d.Select(e => e.MachineId).ToList());
foreach (var item in dic.Where(c => c.Value.Count > 0)) foreach (var item in dic.Where(c => c.Value.Count > 0))
@@ -151,7 +153,7 @@ namespace linker.plugins.tuntap
/// </summary> /// </summary>
/// <param name="machineId"></param> /// <param name="machineId"></param>
/// <param name="ip"></param> /// <param name="ip"></param>
public void SetIP(string machineId, uint ip) private void SetIP(string machineId, uint ip)
{ {
ip2MachineDic.AddOrUpdate(ip, machineId, (a, b) => machineId); ip2MachineDic.AddOrUpdate(ip, machineId, (a, b) => machineId);
if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId) if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId)
@@ -163,7 +165,7 @@ namespace linker.plugins.tuntap
/// 移除 /// 移除
/// </summary> /// </summary>
/// <param name="machineId"></param> /// <param name="machineId"></param>
public void RemoveIP(string machineId) private void RemoveIP(string machineId)
{ {
foreach (var item in ip2MachineDic.Where(c => c.Value == machineId).ToList()) foreach (var item in ip2MachineDic.Where(c => c.Value == machineId).ToList())
{ {
@@ -197,7 +199,7 @@ namespace linker.plugins.tuntap
if (ipRefreshCache.Contains(ip) == false) if (ipRefreshCache.Contains(ip) == false)
{ {
ipRefreshCache.Add(ip); ipRefreshCache.Add(ip);
RefreshConfig(); tuntapConfigTransfer.RefreshConfig();
} }
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{ {
@@ -208,7 +210,7 @@ namespace linker.plugins.tuntap
} }
public void ClearIPs() private void ClearIPs()
{ {
ip2MachineDic.Clear(); ip2MachineDic.Clear();
ipConnections.Clear(); ipConnections.Clear();

View File

@@ -57,6 +57,7 @@ namespace linker.plugins.tuntap
TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService<TuntapPingTransfer>(); TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService<TuntapPingTransfer>();
TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService<TuntapDeviceStatusTransfer>(); TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService<TuntapDeviceStatusTransfer>();
tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, tuntapProxy);
} }
public void UseServer(ServiceProvider serviceProvider, FileConfig config) public void UseServer(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -16,8 +16,6 @@ namespace linker.plugins.tuntap
public string SetupError => linkerTunDeviceAdapter.SetupError; public string SetupError => linkerTunDeviceAdapter.SetupError;
public string NatError => linkerTunDeviceAdapter.NatError; public string NatError => linkerTunDeviceAdapter.NatError;
public string DeviceName => "linker";
public Action OnSetupBefore { get; set; } = () => { }; public Action OnSetupBefore { get; set; } = () => { };
public Action OnSetupAfter { get; set; } = () => { }; public Action OnSetupAfter { get; set; } = () => { };
public Action OnSetupSuccess { get; set; } = () => { }; public Action OnSetupSuccess { get; set; } = () => { };
@@ -25,11 +23,14 @@ namespace linker.plugins.tuntap
public Action OnShutdownAfter { get; set; } = () => { }; public Action OnShutdownAfter { get; set; } = () => { };
public Action OnShutdownSuccess { get; set; } = () => { }; public Action OnShutdownSuccess { get; set; } = () => { };
public TuntapTransfer(ClientSignInState clientSignInState, LinkerTunDeviceAdapter linkerTunDeviceAdapter, TuntapProxy tuntapProxy, RunningConfig runningConfig) public TuntapTransfer(LinkerTunDeviceAdapter linkerTunDeviceAdapter)
{ {
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter; this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
}
linkerTunDeviceAdapter.Initialize(DeviceName, tuntapProxy); public void Init(string name,ILinkerTunDeviceCallback linkerTunDeviceCallback)
{
linkerTunDeviceAdapter.Initialize(name, linkerTunDeviceCallback);
AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown(); AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown();
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown(); Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
} }

View File

@@ -4,6 +4,18 @@ using MemoryPack;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Net; using System.Net;
namespace linker.client.config
{
public sealed partial class RunningConfigInfo
{
/// <summary>
/// 虚拟网卡配置
/// </summary>
public TuntapConfigInfo Tuntap { get; set; } = new TuntapConfigInfo();
}
}
namespace linker.plugins.tuntap.config namespace linker.plugins.tuntap.config
{ {
[MemoryPackable] [MemoryPackable]
@@ -20,16 +32,6 @@ namespace linker.plugins.tuntap.config
/// </summary> /// </summary>
public byte PrefixLength { get; set; } = 24; public byte PrefixLength { get; set; } = 24;
/// <summary>
/// 局域网IP列表
/// </summary>
[MemoryPackAllowSerialize]
public IPAddress[] LanIPs { get; set; } = Array.Empty<IPAddress>();
/// <summary>
/// 局域网掩码列表与IP列表一一对应
/// </summary>
public int[] Masks { get; set; } = Array.Empty<int>();
/// <summary> /// <summary>
/// 局域网配置列表 /// 局域网配置列表
/// </summary> /// </summary>
@@ -349,14 +351,3 @@ namespace linker.plugins.tuntap.config
} }
} }
namespace linker.client.config
{
public sealed partial class RunningConfigInfo
{
/// <summary>
/// 虚拟网卡配置
/// </summary>
public TuntapConfigInfo Tuntap { get; set; } = new TuntapConfigInfo();
}
}

View File

@@ -4,7 +4,6 @@ using linker.plugins.client;
using linker.plugins.messenger; using linker.plugins.messenger;
using linker.plugins.tuntap.messenger; using linker.plugins.tuntap.messenger;
using linker.libs; using linker.libs;
using linker.libs.extends;
namespace linker.plugins.tuntap.lease namespace linker.plugins.tuntap.lease
{ {

View File

@@ -1,27 +0,0 @@
using linker.config;
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.updater
{
public sealed class ConfigSyncUpdaterSecretKey : IConfigSync
{
public string Name => "UpdaterSecretKey";
private readonly FileConfig fileConfig;
public ConfigSyncUpdaterSecretKey(FileConfig fileConfig)
{
this.fileConfig = fileConfig;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Updater.SecretKey);
}
public void SetData(Memory<byte> data)
{
fileConfig.Data.Client.Updater.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span);
fileConfig.Data.Update();
}
}
}

View File

@@ -23,8 +23,9 @@ namespace linker.plugins.updater
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly AccessTransfer accessTransfer; private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly UpdaterCommonTransfer updaterCommonTransfer;
public UpdaterClientApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) public UpdaterClientApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.updaterTransfer = updaterTransfer; this.updaterTransfer = updaterTransfer;
@@ -33,6 +34,7 @@ namespace linker.plugins.updater
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.accessTransfer = accessTransfer; this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.updaterCommonTransfer = updaterCommonTransfer;
} }
[ClientApiAccessAttribute(ClientApiAccess.Config)] [ClientApiAccessAttribute(ClientApiAccess.Config)]
@@ -50,7 +52,7 @@ namespace linker.plugins.updater
[ClientApiAccessAttribute(ClientApiAccess.Config)] [ClientApiAccessAttribute(ClientApiAccess.Config)]
public void SetInterval(ApiControllerParamsInfo param) public void SetInterval(ApiControllerParamsInfo param)
{ {
updaterTransfer.SetInterval(int.Parse(param.Content)); updaterCommonTransfer.SetInterval(int.Parse(param.Content));
} }
@@ -75,7 +77,7 @@ namespace linker.plugins.updater
{ {
Connection = clientSignInState.Connection, Connection = clientSignInState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer, MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer,
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = config.Data.Client.Updater.SecretKey, Version = param.Content }) Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = param.Content })
}); });
} }
[ClientApiAccessAttribute(ClientApiAccess.UpdateServer)] [ClientApiAccessAttribute(ClientApiAccess.UpdateServer)]
@@ -85,7 +87,7 @@ namespace linker.plugins.updater
{ {
Connection = clientSignInState.Connection, Connection = clientSignInState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ExitServer, MessengerId = (ushort)UpdaterMessengerIds.ExitServer,
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = config.Data.Client.Updater.SecretKey, Version = string.Empty }) Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = string.Empty })
}); });
} }
@@ -123,7 +125,7 @@ namespace linker.plugins.updater
return false; return false;
} }
confirm.SecretKey = config.Data.Client.Updater.SecretKey; confirm.SecretKey = updaterTransfer.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{ {
Connection = clientSignInState.Connection, Connection = clientSignInState.Connection,

View File

@@ -15,17 +15,20 @@ namespace linker.plugins.updater
private ConcurrentDictionary<string, UpdateInfo> updateInfos = new ConcurrentDictionary<string, UpdateInfo>(); private ConcurrentDictionary<string, UpdateInfo> updateInfos = new ConcurrentDictionary<string, UpdateInfo>();
private ConcurrentDictionary<string, LastTicksManager> subscribes = new ConcurrentDictionary<string, LastTicksManager>(); private ConcurrentDictionary<string, LastTicksManager> subscribes = new ConcurrentDictionary<string, LastTicksManager>();
public string SecretKey => fileConfig.Data.Client.Updater.SecretKey;
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly UpdaterHelper updaterHelper; private readonly UpdaterHelper updaterHelper;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly UpdaterCommonTransfer updaterCommonTransfer;
private readonly RunningConfig running; private readonly RunningConfig running;
public VersionManager Version { get; } = new VersionManager(); public VersionManager Version { get; } = new VersionManager();
public UpdaterClientTransfer(FileConfig fileConfig, IMessengerSender messengerSender, ClientSignInState clientSignInState, UpdaterHelper updaterHelper, RunningConfig running, ClientConfigTransfer clientConfigTransfer) public UpdaterClientTransfer(FileConfig fileConfig, IMessengerSender messengerSender, ClientSignInState clientSignInState, UpdaterHelper updaterHelper, RunningConfig running, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
@@ -33,6 +36,7 @@ namespace linker.plugins.updater
this.updaterHelper = updaterHelper; this.updaterHelper = updaterHelper;
this.running = running; this.running = running;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.updaterCommonTransfer = updaterCommonTransfer;
clientSignInState.NetworkFirstEnabledHandle += Init; clientSignInState.NetworkFirstEnabledHandle += Init;
@@ -53,11 +57,6 @@ namespace linker.plugins.updater
fileConfig.Data.Client.Updater.SecretKey = key; fileConfig.Data.Client.Updater.SecretKey = key;
fileConfig.Data.Update(); fileConfig.Data.Update();
} }
public void SetInterval(int sec)
{
fileConfig.Data.Common.UpdateIntervalSeconds = sec;
fileConfig.Data.Update();
}
/// <summary> /// <summary>
/// 所有客户端的更新信息 /// 所有客户端的更新信息
@@ -143,7 +142,7 @@ namespace linker.plugins.updater
{ {
await updaterHelper.GetUpdateInfo(updateInfo); await updaterHelper.GetUpdateInfo(updateInfo);
return true; return true;
}, () => fileConfig.Data.Common.UpdateIntervalSeconds*1000); }, () => updaterCommonTransfer.UpdateIntervalSeconds*1000);
} }
} }

View File

@@ -0,0 +1,24 @@
using linker.config;
namespace linker.plugins.updater
{
public sealed class UpdaterCommonTransfer
{
public string UpdateUrl => fileConfig.Data.Common.UpdateUrl;
public int UpdateIntervalSeconds => fileConfig.Data.Common.UpdateIntervalSeconds;
private readonly FileConfig fileConfig;
public UpdaterCommonTransfer( FileConfig fileConfig)
{
this.fileConfig = fileConfig;
}
public void SetInterval(int sec)
{
fileConfig.Data.Common.UpdateIntervalSeconds = sec;
fileConfig.Data.Update();
}
}
}

View File

@@ -0,0 +1,25 @@
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.updater
{
public sealed class UpdaterConfigSyncSecretKey : IConfigSync
{
public string Name => "UpdaterSecretKey";
private readonly UpdaterClientTransfer updaterClientTransfer;
public UpdaterConfigSyncSecretKey(UpdaterClientTransfer updaterClientTransfer)
{
this.updaterClientTransfer = updaterClientTransfer;
}
public Memory<byte> GetData()
{
return MemoryPackSerializer.Serialize(updaterClientTransfer.SecretKey);
}
public void SetData(Memory<byte> data)
{
updaterClientTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
}
}
}

View File

@@ -1,5 +1,4 @@
using linker.config; using linker.libs;
using linker.libs;
using MemoryPack; using MemoryPack;
using System.Diagnostics; using System.Diagnostics;
using System.IO.Compression; using System.IO.Compression;
@@ -13,10 +12,10 @@ namespace linker.plugins.updater
{ {
private string[] extractExcludeFiles = []; private string[] extractExcludeFiles = [];
private readonly FileConfig fileConfig; private readonly UpdaterCommonTransfer updaterCommonTransfer;
public UpdaterHelper(FileConfig fileConfig) public UpdaterHelper(UpdaterCommonTransfer updaterCommonTransfer)
{ {
this.fileConfig = fileConfig; this.updaterCommonTransfer = updaterCommonTransfer;
ClearFiles(); ClearFiles();
} }
@@ -39,7 +38,7 @@ namespace linker.plugins.updater
updateInfo.Status = UpdateStatus.Checking; updateInfo.Status = UpdateStatus.Checking;
using HttpClient httpClient = new HttpClient(); using HttpClient httpClient = new HttpClient();
string str = await httpClient.GetStringAsync($"{fileConfig.Data.Common.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15)); string str = await httpClient.GetStringAsync($"{updaterCommonTransfer.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15));
string[] arr = str.Split(Environment.NewLine).Select(c => c.Trim('\r').Trim('\n')).ToArray(); string[] arr = str.Split(Environment.NewLine).Select(c => c.Trim('\r').Trim('\n')).ToArray();
@@ -95,7 +94,7 @@ namespace linker.plugins.updater
} }
sb.Append(RuntimeInformation.ProcessArchitecture.ToString().ToLower()); sb.Append(RuntimeInformation.ProcessArchitecture.ToString().ToLower());
string url = $"{fileConfig.Data.Common.UpdateUrl}/{version}/{sb.ToString()}.zip"; string url = $"{updaterCommonTransfer.UpdateUrl}/{version}/{sb.ToString()}.zip";
using HttpClient httpClient = new HttpClient(); using HttpClient httpClient = new HttpClient();
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);

View File

@@ -1,12 +1,20 @@
namespace linker.plugins.updater using linker.config;
namespace linker.plugins.updater
{ {
public sealed class UpdaterServerTransfer public sealed class UpdaterServerTransfer
{ {
public string SecretKey => fileConfig.Data.Server.Updater.SecretKey;
private UpdateInfo updateInfo = new UpdateInfo { Status = UpdateStatus.Checked }; private UpdateInfo updateInfo = new UpdateInfo { Status = UpdateStatus.Checked };
private readonly UpdaterHelper updaterHelper; private readonly UpdaterHelper updaterHelper;
public UpdaterServerTransfer(UpdaterHelper updaterHelper) private readonly FileConfig fileConfig;
public UpdaterServerTransfer(UpdaterHelper updaterHelper, FileConfig fileConfig)
{ {
this.updaterHelper = updaterHelper; this.updaterHelper = updaterHelper;
this.fileConfig = fileConfig;
} }
public UpdateInfo Get() public UpdateInfo Get()

View File

@@ -28,7 +28,9 @@ namespace linker.plugins.updater
serviceCollection.AddSingleton<UpdaterClientMessenger>(); serviceCollection.AddSingleton<UpdaterClientMessenger>();
serviceCollection.AddSingleton<UpdaterClientApiController>(); serviceCollection.AddSingleton<UpdaterClientApiController>();
serviceCollection.AddSingleton<ConfigSyncUpdaterSecretKey>(); serviceCollection.AddSingleton<UpdaterConfigSyncSecretKey>();
serviceCollection.AddSingleton<UpdaterCommonTransfer>();
} }
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)
@@ -37,6 +39,8 @@ namespace linker.plugins.updater
serviceCollection.AddSingleton<UpdaterServerTransfer>(); serviceCollection.AddSingleton<UpdaterServerTransfer>();
serviceCollection.AddSingleton<UpdaterServerMessenger>(); serviceCollection.AddSingleton<UpdaterServerMessenger>();
serviceCollection.AddSingleton<UpdaterCommonTransfer>();
} }
public void UseClient(ServiceProvider serviceProvider, FileConfig config) public void UseClient(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -116,7 +116,7 @@ namespace linker.plugins.updater.messenger
public void ConfirmServer(IConnection connection) public void ConfirmServer(IConnection connection)
{ {
UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span); UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (fileConfig.Data.Server.Updater.SecretKey == confirm.SecretKey) if (updaterServerTransfer.SecretKey == confirm.SecretKey)
{ {
updaterServerTransfer.Confirm(confirm.Version); updaterServerTransfer.Confirm(confirm.Version);
} }
@@ -129,7 +129,7 @@ namespace linker.plugins.updater.messenger
public void ExitServer(IConnection connection) public void ExitServer(IConnection connection)
{ {
UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span); UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (fileConfig.Data.Server.Updater.SecretKey == confirm.SecretKey) if (updaterServerTransfer.SecretKey == confirm.SecretKey)
{ {
Environment.Exit(1); Environment.Exit(1);
} }
@@ -152,7 +152,7 @@ namespace linker.plugins.updater.messenger
} }
//需要密钥 //需要密钥
if ((confirm.All || confirm.GroupAll) && fileConfig.Data.Server.Updater.SecretKey != confirm.SecretKey) if ((confirm.All || confirm.GroupAll) && updaterServerTransfer.SecretKey != confirm.SecretKey)
{ {
connection.Write(Helper.FalseArray); connection.Write(Helper.FalseArray);
return; return;

View File

@@ -1,5 +1,5 @@
v1.6.3 v1.6.3
2024-12-10 17:13:26 2024-12-12 00:29:09
1. 优化UI显示网络计算IP数 1. 优化UI显示网络计算IP数
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
3. 优化网卡的端口转发 3. 优化网卡的端口转发