整理代码

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;
using linker.tunnel.wanport;
using System.Transactions;
namespace linker.tunnel
{
@@ -43,6 +42,7 @@ namespace linker.tunnel
item.OnSendConnectFail = tunnelAdapter.SendConnectFail;
item.OnSendConnectSuccess = tunnelAdapter.SendConnectSuccess;
item.OnConnected = _OnConnected;
item.SetAdapter(tunnelAdapter);
}
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 System.Net;
@@ -61,6 +62,8 @@ namespace linker.tunnel.transport
/// </summary>
public Action<ITunnelConnection> OnConnected { get; set; }
public void SetAdapter(ITunnelAdapter tunnelAdapter);
/// <summary>
/// 连接对方
/// </summary>

View File

@@ -46,27 +46,15 @@ namespace linker.tunnel.transport
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
private IPEndPoint quicListenEP = null;
private readonly ITunnelAdapter tunnelAdapter;
public TransportMsQuic(ITunnelAdapter tunnelAdapter)
private ITunnelAdapter tunnelAdapter;
public TransportMsQuic()
{
_ = QuicListen();
}
public void SetAdapter(ITunnelAdapter 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>

View File

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

View File

@@ -56,8 +56,11 @@ namespace linker.tunnel.transport
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
private readonly ITunnelAdapter tunnelAdapter;
public TransportTcpP2PNAT(ITunnelAdapter tunnelAdapter)
private ITunnelAdapter tunnelAdapter;
public TransportTcpP2PNAT()
{
}
public void SetAdapter(ITunnelAdapter 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 ITunnelAdapter tunnelAdapter;
public TransportTcpPortMap(ITunnelAdapter tunnelAdapter)
private ITunnelAdapter tunnelAdapter;
public TransportTcpPortMap()
{
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{
this.tunnelAdapter = tunnelAdapter;
}
Socket socket;
public async Task Listen(int localPort)
{

View File

@@ -6,6 +6,7 @@ using System.Net;
using System.Net.Sockets;
using System.Text;
using linker.tunnel.wanport;
using linker.tunnel.adapter;
namespace linker.tunnel.transport
{
@@ -52,6 +53,9 @@ namespace linker.tunnel.transport
public TransportUdp()
{
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{
}
/// <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<IPEndPoint, ConnectionCacheInfo> connectionsDic = new ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo>(new IPEndPointComparer());
private readonly ITunnelAdapter tunnelAdapter;
public TransportUdpPortMap(ITunnelAdapter tunnelAdapter)
private ITunnelAdapter tunnelAdapter;
public TransportUdpPortMap()
{
CleanTask();
}
public void SetAdapter(ITunnelAdapter tunnelAdapter)
{
this.tunnelAdapter = tunnelAdapter;
CleanTask();
}
Socket socket;

View File

@@ -13,7 +13,8 @@
@blur="handleEditBlur(scope.row, 'ListenPort')"></el-input>
</template>
<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>
</el-table-column>
@@ -24,7 +25,8 @@
@blur="handleEditBlur(scope.row, 'ConnectAddr')"></el-input>
</template>
<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>
</el-table-column>
@@ -35,7 +37,8 @@
@blur="handleEditBlur(scope.row, 'ConnectPort')"></el-input>
</template>
<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>
</el-table-column>

View File

@@ -7,6 +7,12 @@ namespace linker.plugins.action
{
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;
public ActionTransfer(FileConfig config)
{

View File

@@ -122,7 +122,7 @@ namespace linker.plugins.action
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)
{
@@ -140,7 +140,7 @@ namespace linker.plugins.action
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;
@@ -160,7 +160,7 @@ namespace linker.plugins.action
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)
{
@@ -191,7 +191,7 @@ namespace linker.plugins.action
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;
}
@@ -210,7 +210,7 @@ namespace linker.plugins.action
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)
{
@@ -233,7 +233,7 @@ namespace linker.plugins.action
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;
}

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
using linker.plugins.signIn.args;
using linker.plugins.signin.messenger;
using linker.config;
using linker.plugins.signIn;
namespace linker.plugins.client
{
@@ -36,9 +37,11 @@ namespace linker.plugins.client
public sealed class SignInArgsSecretKeyServer : ISignInArgs
{
private readonly FileConfig fileConfig;
public SignInArgsSecretKeyServer(FileConfig fileConfig)
private readonly SignInConfigTransfer signInConfigTransfer;
public SignInArgsSecretKeyServer(FileConfig fileConfig, SignInConfigTransfer signInConfigTransfer)
{
this.fileConfig = fileConfig;
this.signInConfigTransfer = signInConfigTransfer;
}
public async Task<string> Invoke(string host, Dictionary<string, string> args)
{
@@ -54,9 +57,9 @@ namespace linker.plugins.client
/// <returns></returns>
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";
}

View File

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

View File

@@ -1,5 +1,7 @@
using linker.config;
using linker.plugins.messenger;
using linker.plugins.relay.server;
using linker.plugins.sforward;
using linker.plugins.signin.messenger;
using MemoryPack;
@@ -13,10 +15,12 @@ namespace linker.plugins.flow.messenger
private readonly RelayFlow relayFlow;
private readonly SignCaching signCaching;
private readonly FileConfig fileConfig;
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
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.messengerFlow = messengerFlow;
@@ -24,6 +28,8 @@ namespace linker.plugins.flow.messenger
this.relayFlow = relayFlow;
this.signCaching = signCaching;
this.fileConfig = fileConfig;
this.relayServerConfigTransfer = relayServerConfigTransfer;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
}
[MessengerId((ushort)FlowMessengerIds.List)]
@@ -55,7 +61,7 @@ namespace linker.plugins.flow.messenger
sForwardFlow.Update();
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;
}
@@ -79,7 +85,7 @@ namespace linker.plugins.flow.messenger
{
relayFlow.Update();
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;
}

View File

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

View File

@@ -1,5 +1,6 @@
using linker.config;
using linker.plugins.client;
using linker.plugins.server;
using linker.startup;
using Microsoft.Extensions.DependencyInjection;
@@ -59,8 +60,10 @@ namespace linker.plugins.messenger
{
loaded = true;
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
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>();
}

View File

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

View File

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

View File

@@ -15,13 +15,15 @@ namespace linker.plugins.relay.client
private readonly RunningConfig runningConfig;
private readonly RelayTestTransfer relayTestTransfer;
private readonly RelayTransfer relayTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer)
public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
{
this.config = config;
this.runningConfig = runningConfig;
this.relayTestTransfer = relayTestTransfer;
this.relayTransfer = relayTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
}
/// <summary>
@@ -33,8 +35,7 @@ namespace linker.plugins.relay.client
public bool SetServers(ApiControllerParamsInfo param)
{
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
config.Data.Client.Relay.Servers = [info];
config.Data.Update();
relayClientConfigTransfer.SetServer(info);
return true;
}
@@ -48,8 +49,7 @@ namespace linker.plugins.relay.client
{
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId);
runningConfig.Data.Relay.DefaultNodeId = relayConnectInfo.NodeId;
runningConfig.Data.Update();
relayClientConfigTransfer.SetDefaultNodeId(relayConnectInfo.NodeId);
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 ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
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.relayTransfer = relayTransfer;
this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
TestTask();
}
@@ -39,13 +41,13 @@ namespace linker.plugins.relay.client
{
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)
{
Nodes = await transport.RelayTestAsync(new RelayTestInfo
{
MachineId = clientConfigTransfer.Id,
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey
SecretKey = relayClientConfigTransfer.Server.SecretKey
});
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 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.relayClientConfigTransfer = relayClientConfigTransfer;
}
public void LoadTransports(List<ITransport> list)
@@ -71,7 +73,7 @@ namespace linker.plugins.relay.client
}
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)
{
return null;
@@ -84,10 +86,10 @@ namespace linker.plugins.relay.client
FromMachineName = string.Empty,
RemoteMachineId = remoteMachineId,
RemoteMachineName = string.Empty,
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey,
SecretKey = relayClientConfigTransfer.Server.SecretKey,
TransactionId = transactionId,
TransportName = transport.Name,
SSL = fileConfig.Data.Client.Relay.Server.SSL,
SSL = relayClientConfigTransfer.Server.SSL,
NodeId = nodeId
};

View File

@@ -33,7 +33,6 @@ namespace linker.config
/// 中继服务器列表
/// </summary>
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 FileConfig fileConfig;
private readonly ICrypto crypto;
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.fileConfig = fileConfig;
crypto = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Master.SecretKey);
crypto = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
}

View File

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

View File

@@ -19,15 +19,16 @@ namespace linker.plugins.relay.server.validator
public sealed class RelayValidatorSecretKey : IRelayValidator
{
private readonly FileConfig fileConfig;
public RelayValidatorSecretKey(FileConfig fileConfig)
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
public RelayValidatorSecretKey(FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer)
{
this.fileConfig = fileConfig;
this.relayServerConfigTransfer = relayServerConfigTransfer;
}
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";
}

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 string Name => "server";
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 void AddClient(ServiceCollection serviceCollection, FileConfig config)
@@ -23,6 +23,7 @@ namespace linker.plugins.server
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
{
serviceCollection.AddSingleton<TcpServer>();
serviceCollection.AddSingleton<ServerConfigTransfer>();
}
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
@@ -31,21 +32,19 @@ namespace linker.plugins.server
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
{
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
LoggerHelper.Instance.Info($"start server");
try
{
//服务
TcpServer tcpServer = serviceProvider.GetService<TcpServer>();
if (config.Data.Server.ServicePort > 0)
{
tcpServer.Start(config.Data.Server.ServicePort);
}
tcpServer.Start(serverConfigTransfer.Port);
}
catch (Exception 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.plugins.messenger;
using linker.plugins.resolver;
using System.Net;
using System.Net.Sockets;
@@ -22,6 +21,7 @@ namespace linker.plugins.server
public void Start(int port)
{
if (port <= 0) return;
if (socket == null)
{
socket = BindAccept(port);
@@ -61,8 +61,8 @@ namespace linker.plugins.server
{
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.IPv6Only(localEndPoint.AddressFamily, false);
socket.ReuseBind(localEndPoint);
//socket.IPv6Only(localEndPoint.AddressFamily, false);
socket.Bind(localEndPoint);
socket.Listen(int.MaxValue);
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>
public string GetSecretKey(ApiControllerParamsInfo param)
{
return forwardTransfer.GetSecretKey();
return forwardTransfer.SecretKey;
}
/// <summary>
/// 设置密钥
@@ -172,7 +172,7 @@ namespace linker.plugins.sforward
public sealed class SForwardListInfo
{
public ConcurrentDictionary<string,int> List { get; set; }
public ConcurrentDictionary<string, int> List { 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<SForwardClientMessenger>();
serviceCollection.AddSingleton<ConfigSyncSForwardSecretKey>();
serviceCollection.AddSingleton<SForwardConfigSyncSecretKey>();
}
@@ -39,6 +39,7 @@ namespace linker.plugins.sforward
serviceCollection.AddSingleton<ISForwardServerCahing, SForwardServerCahing>();
serviceCollection.AddSingleton<ISForwardValidator, Validator>();
serviceCollection.AddSingleton<SForwardServerConfigTransfer>();
}
bool added = false;
@@ -59,12 +60,13 @@ namespace linker.plugins.sforward
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
{
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);
LoggerHelper.Instance.Warning($"listen server forward web in {config.Data.Server.SForward.WebPort}");
sForwardProxy.Start(sForwardServerConfigTransfer.WebPort, true, sForwardServerConfigTransfer.BufferSize,string.Empty);
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 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 RunningConfig running;
@@ -28,8 +32,9 @@ namespace linker.plugins.sforward
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
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)
{
@@ -68,23 +73,17 @@ namespace linker.plugins.sforward
{
DataVersion.Add();
}
public ConcurrentDictionary<string, int> GetCount()
{
return countDic;
}
public string GetSecretKey()
{
return fileConfig.Data.Client.SForward.SecretKey;
}
public void SetSecretKey(string key)
{
fileConfig.Data.Client.SForward.SecretKey = key;
fileConfig.Data.Update();
}
private void Start()
{
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();
}
public List<SForwardInfo> Get()
{
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);
}
private readonly OperatingManager operatingManager = new OperatingManager();
/// <summary>
/// 测试本机服务
/// </summary>

View File

@@ -24,8 +24,9 @@ namespace linker.plugins.sforward.messenger
private readonly SignCaching signCaching;
private readonly FileConfig configWrap;
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;
proxy.WebConnect = WebConnect;
@@ -36,6 +37,7 @@ namespace linker.plugins.sforward.messenger
this.signCaching = signCaching;
this.configWrap = configWrap;
this.validator = validator;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
}
/// <summary>
@@ -46,7 +48,7 @@ namespace linker.plugins.sforward.messenger
public async Task Add(IConnection connection)
{
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)
{
@@ -76,7 +78,7 @@ namespace linker.plugins.sforward.messenger
if (sForwardServerCahing.TryAdd(port, connection.Id))
{
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)
{
LoggerHelper.Instance.Error(result.Message);
@@ -113,7 +115,7 @@ namespace linker.plugins.sforward.messenger
else
{
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)
{
result.Success = false;
@@ -314,7 +316,7 @@ namespace linker.plugins.sforward.messenger
{
Connection = sign.Connection,
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);
}
return false;
@@ -334,7 +336,7 @@ namespace linker.plugins.sforward.messenger
{
Connection = sign.Connection,
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);
}
return false;
@@ -354,7 +356,7 @@ namespace linker.plugins.sforward.messenger
{
Connection = sign.Connection,
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);
}
return false;

View File

@@ -10,23 +10,25 @@ namespace linker.plugins.sforward.validator
public sealed class Validator : ISForwardValidator
{
private readonly FileConfig config;
public Validator(FileConfig config)
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
public Validator(FileConfig config, SForwardServerConfigTransfer sForwardServerConfigTransfer)
{
this.config = config;
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
}
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";
}
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;

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

View File

@@ -8,6 +8,8 @@ using linker.plugins.client;
using linker.plugins.messenger;
using linker.plugins.socks5.config;
using linker.plugins.decenter;
using linker.plugins.tunnel;
using linker.plugins.tuntap;
namespace linker.plugins.socks5
{
@@ -23,6 +25,8 @@ namespace linker.plugins.socks5
private readonly RunningConfig runningConfig;
private readonly TunnelProxy tunnelProxy;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
public VersionManager Version { get; } = new VersionManager();
private readonly ConcurrentDictionary<string, Socks5Info> socks5Infos = new ConcurrentDictionary<string, Socks5Info>();
@@ -30,7 +34,7 @@ namespace linker.plugins.socks5
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.clientSignInState = clientSignInState;
@@ -38,6 +42,8 @@ namespace linker.plugins.socks5
this.runningConfig = runningConfig;
this.tunnelProxy = tunnelProxy;
this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
tunnelProxy.RefreshConfig += RefreshConfig;
@@ -122,7 +128,6 @@ namespace linker.plugins.socks5
});
}
/// <summary>
/// 重启
/// </summary>
@@ -196,11 +201,11 @@ namespace linker.plugins.socks5
{
//排除的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
.Concat(config.Data.Client.Tunnel.RouteIPs)
.Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address })
.Concat(new IPAddress[] { tuntapConfigTransfer.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP
.Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value)

View File

@@ -28,8 +28,8 @@ namespace linker.plugins.socks5
protected override string TransactionId => "socks5";
public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer)
public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
{
this.clientSignInTransfer = clientSignInTransfer;
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 IPEndPoint ServerHost => clientSignInState.Connection?.Address ?? null;
public X509Certificate2 Certificate { get; private set; }
public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate;
private readonly ClientSignInState clientSignInState;
private readonly IMessengerSender messengerSender;
private readonly FileConfig config;
private readonly RunningConfig running;
private readonly TunnelExcludeIPTransfer excludeIPTransfer;
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.messengerSender = messengerSender;
this.config = config;
this.running = running;
this.excludeIPTransfer = excludeIPTransfer;
this.clientConfigTransfer = clientConfigTransfer;
string path = Path.GetFullPath(clientConfigTransfer.SSL.File);
if (File.Exists(path))
{
Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable);
}
this.tunnelConfigTransfer = tunnelConfigTransfer;
}
public List<TunnelTransportItemInfo> GetTunnelTransports()
{
return config.Data.Client.Tunnel.Transports;
return tunnelConfigTransfer.Transports;
}
public void SetTunnelTransports(List<TunnelTransportItemInfo> transports, bool updateVersion)
{
config.Data.Client.Tunnel.Transports = transports;
config.Data.Update();
tunnelConfigTransfer.SetTransports(transports);
}
public NetworkInfo GetLocalConfig()
@@ -60,7 +48,7 @@ namespace linker.plugins.tunnel
var excludeips = excludeIPTransfer.Get();
return new NetworkInfo
{
LocalIps = config.Data.Client.Tunnel.LocalIPs.Where(c =>
LocalIps = tunnelConfigTransfer.LocalIPs.Where(c =>
{
if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
@@ -78,7 +66,7 @@ namespace linker.plugins.tunnel
return true;
})
.ToArray(),
RouteLevel = config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus,
RouteLevel = tunnelConfigTransfer.RouteLevel,
MachineId = clientConfigTransfer.Id
};
}

View File

@@ -17,23 +17,23 @@ namespace linker.plugins.tunnel
protected virtual string TransactionId { get; }
protected readonly ConcurrentDictionary<string, ITunnelConnection> connections = new ConcurrentDictionary<string, ITunnelConnection>();
private readonly RunningConfig runningConfig;
private readonly TunnelTransfer tunnelTransfer;
private readonly RelayTransfer relayTransfer;
private readonly PcpTransfer pcpTransfer;
private readonly ClientSignInTransfer clientSignInTransfer;
private readonly ClientSignInState clientSignInState;
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.relayTransfer = relayTransfer;
this.pcpTransfer = pcpTransfer;
this.clientSignInTransfer = clientSignInTransfer;
this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;
//监听打洞成功
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}");
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 (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.messenger;
using linker.tunnel;
using linker.tunnel.adapter;
using linker.tunnel.transport;
using MemoryPack;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Quic;
using System.Security.Cryptography.X509Certificates;
namespace linker.plugins.tunnel
{
public sealed class TunnelConfigTransfer:IDecenter
public sealed class TunnelConfigTransfer : IDecenter
{
public string Name => "tunnel";
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 RunningConfig running;
private readonly ClientSignInState clientSignInState;
private readonly IMessengerSender messengerSender;
private readonly ITunnelAdapter tunnelAdapter;
private readonly TunnelUpnpTransfer upnpTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
public VersionManager Version { get; } = new VersionManager();
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.running = running;
this.clientSignInState = clientSignInState;
this.messengerSender = messengerSender;
this.tunnelAdapter = tunnelAdapter;
this.upnpTransfer = upnpTransfer;
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) =>
{
RefreshRouteLevel();
DataVersion.Add();
TimerHelper.Async(RefreshRouteLevel);
RefreshPortMap();
};
TestQuic();
}
public Memory<byte> GetData()
{
TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel();
@@ -73,18 +82,21 @@ namespace linker.plugins.tunnel
Version.Add();
}
public void SetTransports(List<TunnelTransportItemInfo> transports)
{
config.Data.Client.Tunnel.Transports = transports;
config.Data.Update();
}
/// <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.RouteIPs = ips.ToArray();
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
});
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.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
DataVersion.Add();
}
/// <summary>
@@ -168,7 +180,7 @@ namespace linker.plugins.tunnel
}
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<ConfigSyncTunnelTransports>();
serviceCollection.AddSingleton<TunnelConfigSyncTransports>();
serviceCollection.AddSingleton<TunnelConfigTransfer>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
@@ -83,16 +83,6 @@ namespace linker.plugins.tunnel
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>();
TunnelUpnpTransfer upnpTransfer = serviceProvider.GetService<TunnelUpnpTransfer>();
@@ -117,11 +107,17 @@ namespace linker.plugins.tunnel
TunnelTransfer tunnel = serviceProvider.GetService<TunnelTransfer>();
tunnel.LoadTransports(compack, tunnelAdapter, upnpTransfer, transports);
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<TunnelExcludeIPTransfer>();
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)

View File

@@ -5,15 +5,15 @@ namespace linker.plugins.tuntap
{
public sealed class ExcludeIP : ITunnelExcludeIP
{
private readonly RunningConfig runningConfig;
public ExcludeIP(RunningConfig runningConfig)
private readonly TuntapConfigTransfer tuntapConfigTransfer;
public ExcludeIP(TuntapConfigTransfer tuntapConfigTransfer)
{
this.runningConfig = runningConfig;
this.tuntapConfigTransfer = tuntapConfigTransfer;
}
public ExcludeIPItem[] Get()
{
//网卡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.plugins.tuntap.lease;
using linker.plugins.decenter;
using System.Text.RegularExpressions;
using linker.libs.extends;
using linker.plugins.tunnel;
namespace linker.plugins.tuntap
{
@@ -20,15 +19,20 @@ namespace linker.plugins.tuntap
public string Name => "tuntap";
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 ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig;
private readonly TuntapTransfer tuntapTransfer;
private readonly LeaseClientTreansfer leaseClientTreansfer;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0];
private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>();
@@ -38,30 +42,33 @@ namespace linker.plugins.tuntap
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);
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.clientSignInState = clientSignInState;
this.config = config;
this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig;
this.tuntapTransfer = tuntapTransfer;
this.leaseClientTreansfer = leaseClientTreansfer;
this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
clientSignInState.NetworkEnabledHandle += NetworkEnable;
tuntapProxy.RefreshConfig = RefreshConfig;
tuntapTransfer.OnSetupBefore += () => { 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.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;
@@ -69,21 +76,13 @@ namespace linker.plugins.tuntap
{
if (groupid != clientConfigTransfer.Group.Id)
{
tuntapInfos.Clear(); tuntapProxy.ClearIPs();
tuntapInfos.Clear(); HandleReset();
}
groupid = clientConfigTransfer.Group.Id;
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>
@@ -92,25 +91,22 @@ namespace linker.plugins.tuntap
{
TimerHelper.Async(async () =>
{
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength;
IPAddress oldIP = configInfo.IP;
byte prefixLength = configInfo.PrefixLength;
runningConfig.Data.Tuntap.IP = info.IP ?? IPAddress.Any;
runningConfig.Data.Tuntap.Lans = info.Lans;
runningConfig.Data.Tuntap.PrefixLength = info.PrefixLength;
runningConfig.Data.Tuntap.Switch = info.Switch;
runningConfig.Data.Tuntap.Forwards = info.Forwards;
configInfo.IP = info.IP ?? IPAddress.Any;
configInfo.Lans = info.Lans;
configInfo.PrefixLength = info.PrefixLength;
configInfo.Switch = info.Switch;
configInfo.Forwards = info.Forwards;
runningConfig.Data.Update();
TuntapGroup2IPInfo 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);
TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength };
configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
await LeaseIP();
bool needReboot = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running;
if (needReboot)
if ((oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running)
{
await RetstartDevice();
}
@@ -123,22 +119,21 @@ namespace linker.plugins.tuntap
DataVersion.Add();
});
}
public Memory<byte> GetData()
{
TuntapInfo info = new TuntapInfo
{
IP = runningConfig.Data.Tuntap.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(),
PrefixLength = runningConfig.Data.Tuntap.PrefixLength,
IP = configInfo.IP,
Lans = configInfo.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
PrefixLength = configInfo.PrefixLength,
MachineId = clientConfigTransfer.Id,
Status = tuntapTransfer.Status,
SetupError = tuntapTransfer.SetupError,
NatError = tuntapTransfer.NatError,
SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}",
Forwards = runningConfig.Data.Tuntap.Forwards,
Switch = runningConfig.Data.Tuntap.Switch
Forwards = configInfo.Forwards,
Switch = configInfo.Switch
};
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add();
@@ -214,7 +209,13 @@ namespace linker.plugins.tuntap
});
}
/// <summary>
/// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来
/// </summary>
public void RefreshConfig()
{
DataVersion.Add();
}
/// <summary>
/// 刷新IP
/// </summary>
@@ -222,8 +223,8 @@ namespace linker.plugins.tuntap
{
TimerHelper.Async(async () =>
{
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength;
IPAddress oldIP = configInfo.IP;
byte prefixLength = configInfo.PrefixLength;
await LeaseIP();
while (tuntapTransfer.Status == TuntapStatus.Operating)
@@ -231,19 +232,41 @@ namespace linker.plugins.tuntap
await Task.Delay(1000);
}
bool run = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running;
bool run = (oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running
|| configInfo.Running && tuntapTransfer.Status != TuntapStatus.Running;
if (run)
{
tuntapTransfer.Shutdown();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
}
DataVersion.Add();
});
}
/// <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>
/// <returns></returns>
@@ -251,7 +274,7 @@ namespace linker.plugins.tuntap
{
tuntapTransfer.Shutdown();
await LeaseIP();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
}
/// <summary>
/// 关闭网卡
@@ -260,36 +283,7 @@ namespace linker.plugins.tuntap
{
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>
/// 添加端口转发
@@ -314,7 +308,7 @@ namespace linker.plugins.tuntap
}
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>
@@ -334,16 +328,16 @@ namespace linker.plugins.tuntap
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();
tuntapTransfer.AddRoute(routeItems, runningConfig.Data.Tuntap.IP);
tuntapTransfer.AddRoute(routeItems, configInfo.IP);
tuntapProxy.SetIPs(ips);
HandleSetIPs(ips);
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)))
{
tuntapProxy.RemoveIP(item.MachineId);
HandleRemoveIP(item.MachineId);
}
Version.Add();
}
@@ -352,13 +346,13 @@ namespace linker.plugins.tuntap
{
//排除的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
.Concat(config.Data.Client.Tunnel.RouteIPs)
.Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address })
.Concat(new IPAddress[] { configInfo.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP
.Concat(runningConfig.Data.Tuntap.Lans.Select(c => c.IP))
.Concat(configInfo.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value)
.ToArray();

View File

@@ -3,7 +3,6 @@ using linker.libs;
using linker.plugins.tuntap.config;
using linker.tun;
using System.Net.NetworkInformation;
using System.Xml.Linq;
namespace linker.plugins.tuntap
{
@@ -29,7 +28,7 @@ namespace linker.plugins.tuntap
{
TimerHelper.SetInterval(async () =>
{
if (setupTimes > 0 && runningConfig.Data.Tuntap.Running && OperatingSystem.IsWindows())
if (setupTimes > 0 && tuntapConfigTransfer.Running && OperatingSystem.IsWindows())
{
await InterfaceCheck().ConfigureAwait(false);
InterfaceOrder();
@@ -41,7 +40,7 @@ namespace linker.plugins.tuntap
{
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();
await Task.Delay(5000).ConfigureAwait(false);
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
@@ -52,7 +51,7 @@ namespace linker.plugins.tuntap
}
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();
}
private async Task<bool> InterfacePing()
@@ -60,7 +59,7 @@ namespace linker.plugins.tuntap
try
{
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;
}
catch (Exception)
@@ -71,7 +70,7 @@ namespace linker.plugins.tuntap
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();
if (linker != null && linker.Name != first.Name)
@@ -79,14 +78,14 @@ namespace linker.plugins.tuntap
int metricv4 = 0;
int metricv6 = 0;
List<string> commands = new List<string> {
$"netsh interface ipv4 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv4}",
$"netsh interface ipv6 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv6}"
$"netsh interface ipv4 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv4}",
$"netsh interface ipv6 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv6}"
};
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}"));
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}"));
CommandHelper.Windows(string.Empty, commands.ToArray());
}

View File

@@ -15,18 +15,14 @@ namespace linker.plugins.tuntap
{
private readonly TuntapTransfer tuntapTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig;
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.tuntapConfigTransfer = tuntapConfigTransfer;
this.config = config;
this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig;
this.clientConfigTransfer = clientConfigTransfer;
PingTask();
@@ -51,10 +47,10 @@ namespace linker.plugins.tuntap
}
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);
if ((runningConfig.Data.Tuntap.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
{
var connections = tuntapProxy.GetConnections();
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 HashSet<uint> ipRefreshCache = new HashSet<uint>();
public Action RefreshConfig = () => { };
private readonly RunningConfig runningConfig;
private readonly ClientSignInState clientSignInState;
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)
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer)
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, clientConfigTransfer, relayClientConfigTransfer)
{
this.clientSignInTransfer = clientSignInTransfer;
this.runningConfig = runningConfig;
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)
@@ -73,7 +75,7 @@ namespace linker.plugins.tuntap
/// <returns></returns>
public async Task Closed(ITunnelConnection connection, object state)
{
RefreshConfig();
tuntapConfigTransfer.RefreshConfig();
Version.Add();
await Task.CompletedTask;
}
@@ -88,7 +90,7 @@ namespace linker.plugins.tuntap
//IPV4广播组播、IPV6 多播
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)));
}
@@ -130,7 +132,7 @@ namespace linker.plugins.tuntap
/// 设置IP等下有连接进来用IP匹配才能知道这个连接是要连谁
/// </summary>
/// <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());
foreach (var item in dic.Where(c => c.Value.Count > 0))
@@ -151,7 +153,7 @@ namespace linker.plugins.tuntap
/// </summary>
/// <param name="machineId"></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);
if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId)
@@ -163,7 +165,7 @@ namespace linker.plugins.tuntap
/// 移除
/// </summary>
/// <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())
{
@@ -197,7 +199,7 @@ namespace linker.plugins.tuntap
if (ipRefreshCache.Contains(ip) == false)
{
ipRefreshCache.Add(ip);
RefreshConfig();
tuntapConfigTransfer.RefreshConfig();
}
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
@@ -208,7 +210,7 @@ namespace linker.plugins.tuntap
}
public void ClearIPs()
private void ClearIPs()
{
ip2MachineDic.Clear();
ipConnections.Clear();

View File

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

View File

@@ -16,8 +16,6 @@ namespace linker.plugins.tuntap
public string SetupError => linkerTunDeviceAdapter.SetupError;
public string NatError => linkerTunDeviceAdapter.NatError;
public string DeviceName => "linker";
public Action OnSetupBefore { get; set; } = () => { };
public Action OnSetupAfter { get; set; } = () => { };
public Action OnSetupSuccess { get; set; } = () => { };
@@ -25,11 +23,14 @@ namespace linker.plugins.tuntap
public Action OnShutdownAfter { get; set; } = () => { };
public Action OnShutdownSuccess { get; set; } = () => { };
public TuntapTransfer(ClientSignInState clientSignInState, LinkerTunDeviceAdapter linkerTunDeviceAdapter, TuntapProxy tuntapProxy, RunningConfig runningConfig)
public TuntapTransfer(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();
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
}

View File

@@ -4,6 +4,18 @@ using MemoryPack;
using System.Collections.Concurrent;
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
{
[MemoryPackable]
@@ -20,16 +32,6 @@ namespace linker.plugins.tuntap.config
/// </summary>
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>
@@ -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.tuntap.messenger;
using linker.libs;
using linker.libs.extends;
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 AccessTransfer accessTransfer;
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.updaterTransfer = updaterTransfer;
@@ -33,6 +34,7 @@ namespace linker.plugins.updater
this.runningConfig = runningConfig;
this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer;
this.updaterCommonTransfer = updaterCommonTransfer;
}
[ClientApiAccessAttribute(ClientApiAccess.Config)]
@@ -50,7 +52,7 @@ namespace linker.plugins.updater
[ClientApiAccessAttribute(ClientApiAccess.Config)]
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,
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)]
@@ -85,7 +87,7 @@ namespace linker.plugins.updater
{
Connection = clientSignInState.Connection,
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;
}
confirm.SecretKey = config.Data.Client.Updater.SecretKey;
confirm.SecretKey = updaterTransfer.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{
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, LastTicksManager> subscribes = new ConcurrentDictionary<string, LastTicksManager>();
public string SecretKey => fileConfig.Data.Client.Updater.SecretKey;
private readonly FileConfig fileConfig;
private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState;
private readonly UpdaterHelper updaterHelper;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly UpdaterCommonTransfer updaterCommonTransfer;
private readonly RunningConfig running;
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.messengerSender = messengerSender;
@@ -33,6 +36,7 @@ namespace linker.plugins.updater
this.updaterHelper = updaterHelper;
this.running = running;
this.clientConfigTransfer = clientConfigTransfer;
this.updaterCommonTransfer = updaterCommonTransfer;
clientSignInState.NetworkFirstEnabledHandle += Init;
@@ -53,11 +57,6 @@ namespace linker.plugins.updater
fileConfig.Data.Client.Updater.SecretKey = key;
fileConfig.Data.Update();
}
public void SetInterval(int sec)
{
fileConfig.Data.Common.UpdateIntervalSeconds = sec;
fileConfig.Data.Update();
}
/// <summary>
/// 所有客户端的更新信息
@@ -143,7 +142,7 @@ namespace linker.plugins.updater
{
await updaterHelper.GetUpdateInfo(updateInfo);
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 System.Diagnostics;
using System.IO.Compression;
@@ -13,10 +12,10 @@ namespace linker.plugins.updater
{
private string[] extractExcludeFiles = [];
private readonly FileConfig fileConfig;
public UpdaterHelper(FileConfig fileConfig)
private readonly UpdaterCommonTransfer updaterCommonTransfer;
public UpdaterHelper(UpdaterCommonTransfer updaterCommonTransfer)
{
this.fileConfig = fileConfig;
this.updaterCommonTransfer = updaterCommonTransfer;
ClearFiles();
}
@@ -39,7 +38,7 @@ namespace linker.plugins.updater
updateInfo.Status = UpdateStatus.Checking;
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();
@@ -95,7 +94,7 @@ namespace linker.plugins.updater
}
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 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 string SecretKey => fileConfig.Data.Server.Updater.SecretKey;
private UpdateInfo updateInfo = new UpdateInfo { Status = UpdateStatus.Checked };
private readonly UpdaterHelper updaterHelper;
public UpdaterServerTransfer(UpdaterHelper updaterHelper)
private readonly FileConfig fileConfig;
public UpdaterServerTransfer(UpdaterHelper updaterHelper, FileConfig fileConfig)
{
this.updaterHelper = updaterHelper;
this.fileConfig = fileConfig;
}
public UpdateInfo Get()

View File

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

View File

@@ -116,7 +116,7 @@ namespace linker.plugins.updater.messenger
public void ConfirmServer(IConnection connection)
{
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);
}
@@ -129,7 +129,7 @@ namespace linker.plugins.updater.messenger
public void ExitServer(IConnection connection)
{
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);
}
@@ -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);
return;

View File

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