mirror of
https://github.com/snltty/linker.git
synced 2025-10-30 04:02:13 +08:00
test
This commit is contained in:
5
.github/workflows/dotnet.yml
vendored
5
.github/workflows/dotnet.yml
vendored
@@ -48,13 +48,14 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: '${{ secrets.ACTIONS_TOKEN }}'
|
||||
with:
|
||||
tag_name: v1.1.2.6
|
||||
release_name: v1.1.2.6.${{ steps.date.outputs.today }}
|
||||
tag_name: v1.1.3.1
|
||||
release_name: v1.1.3.1.${{ steps.date.outputs.today }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
body: |
|
||||
1. 托盘检查
|
||||
2. 停止服务清理网卡
|
||||
3. 打洞错误
|
||||
|
||||
- name: upload win x64
|
||||
id: upload-win-x64
|
||||
|
||||
4
.github/workflows/nuget.yml
vendored
4
.github/workflows/nuget.yml
vendored
@@ -36,5 +36,5 @@ jobs:
|
||||
|
||||
- name: Push
|
||||
run: |
|
||||
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.1.2.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.libs/bin/release/linker.libs.1.1.2.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.1.3.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.libs/bin/release/linker.libs.1.1.3.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<Version>1.1.2</Version>
|
||||
<AssemblyVersion>1.1.2.6</AssemblyVersion>
|
||||
<FileVersion>1.1.2.6</FileVersion>
|
||||
<Version>1.1.3</Version>
|
||||
<AssemblyVersion>1.1.3.1</AssemblyVersion>
|
||||
<FileVersion>1.1.3.1</FileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>full</DebugType>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<PublishAot>false</PublishAot>
|
||||
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||
<EnablePreviewFeatures>true</EnablePreviewFeatures>
|
||||
<Version>1.1.2</Version>
|
||||
<Version>1.1.3</Version>
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>snltty</Description>
|
||||
@@ -22,8 +22,8 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>snltty service</PackageReleaseNotes>
|
||||
<AssemblyVersion>1.1.2.6</AssemblyVersion>
|
||||
<FileVersion>1.1.2.6</FileVersion>
|
||||
<AssemblyVersion>1.1.3.1</AssemblyVersion>
|
||||
<FileVersion>1.1.3.1</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -352,23 +352,25 @@ namespace linker.tunnel
|
||||
private void ParseRemoteEndPoint(TunnelTransportInfo tunnelTransportInfo)
|
||||
{
|
||||
//要连接哪些IP
|
||||
IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray();
|
||||
List<IPEndPoint> eps = new List<IPEndPoint>();
|
||||
|
||||
//先尝试内网ipv4
|
||||
foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork))
|
||||
//if (tunnelTransportInfo.Local.Remote.Address.Equals(tunnelTransportInfo.Remote.Remote.Address))
|
||||
{
|
||||
foreach (IPAddress item in tunnelTransportInfo.Remote.LocalIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork))
|
||||
{
|
||||
eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port));
|
||||
eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port));
|
||||
eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1));
|
||||
}
|
||||
}
|
||||
//在尝试外网
|
||||
eps.AddRange(new List<IPEndPoint>{
|
||||
new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port),
|
||||
new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1),
|
||||
});
|
||||
//再尝试IPV6
|
||||
foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6))
|
||||
foreach (IPAddress item in tunnelTransportInfo.Remote.LocalIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6))
|
||||
{
|
||||
eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port));
|
||||
eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port));
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||
<EnablePreviewFeatures>true</EnablePreviewFeatures>
|
||||
<Title>linker tunnel</Title>
|
||||
<Version>1.1.2</Version>
|
||||
<Version>1.1.3</Version>
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>linker tunnel</Description>
|
||||
@@ -17,8 +17,8 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
|
||||
<AssemblyVersion>1.1.2.6</AssemblyVersion>
|
||||
<FileVersion>1.1.2.6</FileVersion>
|
||||
<AssemblyVersion>1.1.3.1</AssemblyVersion>
|
||||
<FileVersion>1.1.3.1</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<EnablePreviewFeatures>true</EnablePreviewFeatures>
|
||||
<ServerGarbageCollection>false</ServerGarbageCollection>
|
||||
<Title>linker</Title>
|
||||
<Version>1.1.2</Version>
|
||||
<Version>1.1.3</Version>
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>linker</Description>
|
||||
@@ -25,8 +25,8 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker</PackageReleaseNotes>
|
||||
<AssemblyVersion>1.1.2.6</AssemblyVersion>
|
||||
<FileVersion>1.1.2.6</FileVersion>
|
||||
<AssemblyVersion>1.1.3.1</AssemblyVersion>
|
||||
<FileVersion>1.1.3.1</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ using linker.tunnel.wanport;
|
||||
using System.Buffers.Binary;
|
||||
using linker.plugins.client;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.tunnel.excludeip;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
@@ -25,17 +26,19 @@ namespace linker.plugins.tunnel
|
||||
private readonly FileConfig config;
|
||||
private readonly RunningConfig running;
|
||||
private readonly RunningConfigTransfer runningConfigTransfer;
|
||||
private readonly ExcludeIPTransfer excludeIPTransfer;
|
||||
|
||||
private string wanPortConfigKey = "tunnelWanPortProtocols";
|
||||
private string transportConfigKey = "tunnelTransports";
|
||||
|
||||
public TunnelAdapter(ClientSignInState clientSignInState, MessengerSender messengerSender, FileConfig config, RunningConfig running, RunningConfigTransfer runningConfigTransfer)
|
||||
public TunnelAdapter(ClientSignInState clientSignInState, MessengerSender messengerSender, FileConfig config, RunningConfig running, RunningConfigTransfer runningConfigTransfer, ExcludeIPTransfer excludeIPTransfer)
|
||||
{
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.messengerSender = messengerSender;
|
||||
this.config = config;
|
||||
this.running = running;
|
||||
this.runningConfigTransfer = runningConfigTransfer;
|
||||
this.excludeIPTransfer = excludeIPTransfer;
|
||||
|
||||
string path = Path.GetFullPath(config.Data.Client.Certificate);
|
||||
if (File.Exists(path))
|
||||
@@ -104,16 +107,15 @@ namespace linker.plugins.tunnel
|
||||
|
||||
public NetworkInfo GetLocalConfig()
|
||||
{
|
||||
var excludeips = excludeIPTransfer.Get();
|
||||
return new NetworkInfo
|
||||
{
|
||||
LocalIps = config.Data.Client.Tunnel.LocalIPs
|
||||
.Where(c => c.Equals(running.Data.Tuntap.IP) == false)
|
||||
.Where(c =>
|
||||
LocalIps = config.Data.Client.Tunnel.LocalIPs.Where(c =>
|
||||
{
|
||||
if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
{
|
||||
uint ip = BinaryPrimitives.ReadUInt32BigEndian(c.GetAddressBytes());
|
||||
foreach (var item in running.Data.Tunnel.ExcludeIPs)
|
||||
foreach (var item in excludeips)
|
||||
{
|
||||
uint maskValue = NetworkHelper.MaskValue(item.Mask);
|
||||
uint ip1 = BinaryPrimitives.ReadUInt32BigEndian(item.IPAddress.GetAddressBytes());
|
||||
|
||||
@@ -12,6 +12,7 @@ using linker.plugins.client;
|
||||
using linker.plugins.server;
|
||||
using linker.plugins.capi;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.tunnel.excludeip;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
@@ -26,8 +27,9 @@ namespace linker.plugins.tunnel
|
||||
private readonly MessengerSender messengerSender;
|
||||
private readonly TunnelConfigTransfer tunnelConfigTransfer;
|
||||
private readonly ITunnelAdapter tunnelMessengerAdapter;
|
||||
private readonly ExcludeIPTransfer excludeIPTransfer;
|
||||
|
||||
public TunnelApiController(FileConfig config, TunnelWanPortTransfer compactTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter)
|
||||
public TunnelApiController(FileConfig config, TunnelWanPortTransfer compactTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter, ExcludeIPTransfer excludeIPTransfer)
|
||||
{
|
||||
this.config = config;
|
||||
this.compactTransfer = compactTransfer;
|
||||
@@ -35,6 +37,7 @@ namespace linker.plugins.tunnel
|
||||
this.messengerSender = messengerSender;
|
||||
this.tunnelConfigTransfer = tunnelConfigTransfer;
|
||||
this.tunnelMessengerAdapter = tunnelMessengerAdapter;
|
||||
this.excludeIPTransfer = excludeIPTransfer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -134,12 +137,12 @@ namespace linker.plugins.tunnel
|
||||
|
||||
public ExcludeIPItem[] GetExcludeIPs(ApiControllerParamsInfo param)
|
||||
{
|
||||
return tunnelConfigTransfer.GetExcludeIPs();
|
||||
return excludeIPTransfer.GetExcludeIPs();
|
||||
}
|
||||
public void SetExcludeIPs(ApiControllerParamsInfo param)
|
||||
{
|
||||
ExcludeIPItem[] info = param.Content.DeJson<ExcludeIPItem[]>();
|
||||
tunnelConfigTransfer.SettExcludeIPs(info);
|
||||
excludeIPTransfer.SettExcludeIPs(info);
|
||||
}
|
||||
|
||||
public sealed class TunnelListInfo
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace linker.plugins.tunnel
|
||||
private readonly RunningConfigTransfer runningConfigTransfer;
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
|
||||
private string exipConfigKey = "excludeIPConfig";
|
||||
|
||||
|
||||
private uint version = 0;
|
||||
public uint ConfigVersion => version;
|
||||
@@ -39,7 +39,7 @@ namespace linker.plugins.tunnel
|
||||
|
||||
|
||||
InitRouteLevel();
|
||||
InitExcludeIP();
|
||||
|
||||
InitConfig();
|
||||
|
||||
TestQuic();
|
||||
@@ -147,37 +147,6 @@ namespace linker.plugins.tunnel
|
||||
}
|
||||
|
||||
|
||||
private void InitExcludeIP()
|
||||
{
|
||||
clientSignInState.NetworkFirstEnabledHandle += () =>
|
||||
{
|
||||
SyncExcludeIP();
|
||||
};
|
||||
runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs);
|
||||
runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs()));
|
||||
}
|
||||
private void SyncExcludeIP()
|
||||
{
|
||||
runningConfigTransfer.Sync(exipConfigKey, MemoryPackSerializer.Serialize(running.Data.Tunnel.ExcludeIPs));
|
||||
}
|
||||
public ExcludeIPItem[] GetExcludeIPs()
|
||||
{
|
||||
return running.Data.Tunnel.ExcludeIPs;
|
||||
}
|
||||
public void SettExcludeIPs(ExcludeIPItem[] ips)
|
||||
{
|
||||
running.Data.Tunnel.ExcludeIPs = ips;
|
||||
running.Data.Update();
|
||||
runningConfigTransfer.IncrementVersion(exipConfigKey);
|
||||
SyncExcludeIP();
|
||||
}
|
||||
private void SettExcludeIPs(Memory<byte> data)
|
||||
{
|
||||
running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize<ExcludeIPItem[]>(data.Span);
|
||||
running.Data.Update();
|
||||
}
|
||||
|
||||
|
||||
bool reboot = false;
|
||||
private void TestQuic()
|
||||
{
|
||||
|
||||
@@ -10,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using linker.tunnel.wanport;
|
||||
using linker.plugins.tunnel.excludeip;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
@@ -54,6 +55,8 @@ namespace linker.plugins.tunnel
|
||||
serviceCollection.AddSingleton<TransportMsQuic>();
|
||||
serviceCollection.AddSingleton<TransportTcpP2PNAT>();
|
||||
|
||||
|
||||
serviceCollection.AddSingleton<ExcludeIPTransfer>();
|
||||
serviceCollection.AddSingleton<TunnelConfigTransfer>();
|
||||
serviceCollection.AddSingleton<ITunnelAdapter, TunnelAdapter>();
|
||||
|
||||
@@ -93,6 +96,10 @@ namespace linker.plugins.tunnel
|
||||
tunnel.Init(compack, tunnelAdapter, transports);
|
||||
|
||||
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
|
||||
|
||||
|
||||
ExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<ExcludeIPTransfer>();
|
||||
excludeIPTransfer.Load(assemblies);
|
||||
}
|
||||
|
||||
public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
|
||||
|
||||
85
linker/plugins/tunnel/excludeip/ExcludeIPTransfer.cs
Normal file
85
linker/plugins/tunnel/excludeip/ExcludeIPTransfer.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using linker.client.config;
|
||||
using linker.libs;
|
||||
using linker.plugins.client;
|
||||
using MemoryPack;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Reflection;
|
||||
|
||||
namespace linker.plugins.tunnel.excludeip
|
||||
{
|
||||
public sealed class ExcludeIPTransfer
|
||||
{
|
||||
private List<IExcludeIP> excludeIPs;
|
||||
private string exipConfigKey = "excludeIPConfig";
|
||||
|
||||
private readonly RunningConfig running;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly RunningConfigTransfer runningConfigTransfer;
|
||||
|
||||
private readonly ServiceProvider serviceProvider;
|
||||
public ExcludeIPTransfer(RunningConfig running, ClientSignInState clientSignInState, RunningConfigTransfer runningConfigTransfer, ServiceProvider serviceProvider)
|
||||
{
|
||||
this.running = running;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.runningConfigTransfer = runningConfigTransfer;
|
||||
this.serviceProvider = serviceProvider;
|
||||
InitExcludeIP();
|
||||
}
|
||||
|
||||
public void Load(Assembly[] assembs)
|
||||
{
|
||||
IEnumerable<Type> types = ReflectionHelper.GetInterfaceSchieves(assembs, typeof(IExcludeIP));
|
||||
excludeIPs = types.Select(c => (IExcludeIP)serviceProvider.GetService(c)).Where(c => c != null).ToList();
|
||||
|
||||
LoggerHelper.Instance.Warning($"load tunnel excludeips :{string.Join(",", types.Select(c => c.Name))}");
|
||||
}
|
||||
|
||||
public List<ExcludeIPItem> Get()
|
||||
{
|
||||
List<ExcludeIPItem> result = new List<ExcludeIPItem>();
|
||||
foreach (var item in excludeIPs)
|
||||
{
|
||||
var ips = item.Get();
|
||||
if (ips != null && ips.Length > 0)
|
||||
{
|
||||
result.AddRange(ips);
|
||||
}
|
||||
}
|
||||
if (running.Data.Tunnel.ExcludeIPs.Length > 0)
|
||||
{
|
||||
result.AddRange(running.Data.Tunnel.ExcludeIPs);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void InitExcludeIP()
|
||||
{
|
||||
clientSignInState.NetworkFirstEnabledHandle += () =>
|
||||
{
|
||||
SyncExcludeIP();
|
||||
};
|
||||
runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs);
|
||||
runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs()));
|
||||
}
|
||||
private void SyncExcludeIP()
|
||||
{
|
||||
runningConfigTransfer.Sync(exipConfigKey, MemoryPackSerializer.Serialize(running.Data.Tunnel.ExcludeIPs));
|
||||
}
|
||||
public ExcludeIPItem[] GetExcludeIPs()
|
||||
{
|
||||
return running.Data.Tunnel.ExcludeIPs;
|
||||
}
|
||||
public void SettExcludeIPs(ExcludeIPItem[] ips)
|
||||
{
|
||||
running.Data.Tunnel.ExcludeIPs = ips;
|
||||
running.Data.Update();
|
||||
runningConfigTransfer.IncrementVersion(exipConfigKey);
|
||||
SyncExcludeIP();
|
||||
}
|
||||
private void SettExcludeIPs(Memory<byte> data)
|
||||
{
|
||||
running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize<ExcludeIPItem[]>(data.Span);
|
||||
running.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
15
linker/plugins/tunnel/excludeip/IExcludeIP.cs
Normal file
15
linker/plugins/tunnel/excludeip/IExcludeIP.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using linker.client.config;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace linker.plugins.tunnel.excludeip
|
||||
{
|
||||
public interface IExcludeIP
|
||||
{
|
||||
public ExcludeIPItem[] Get();
|
||||
}
|
||||
}
|
||||
21
linker/plugins/tuntap/ExcludeIP.cs
Normal file
21
linker/plugins/tuntap/ExcludeIP.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using linker.client.config;
|
||||
using linker.plugins.tunnel.excludeip;
|
||||
|
||||
namespace linker.plugins.tuntap
|
||||
{
|
||||
public sealed class ExcludeIP : IExcludeIP
|
||||
{
|
||||
private readonly RunningConfig runningConfig;
|
||||
public ExcludeIP(RunningConfig runningConfig)
|
||||
{
|
||||
this.runningConfig = runningConfig;
|
||||
}
|
||||
public ExcludeIPItem[] Get()
|
||||
{
|
||||
//网卡IP,和局域网IP。不参与打洞
|
||||
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = runningConfig.Data.Tuntap.IP, Mask = 32 } }
|
||||
.Concat(runningConfig.Data.Tuntap.LanIPs.Select((c, index) => new ExcludeIPItem { IPAddress = c, Mask = (byte)runningConfig.Data.Tuntap.Masks[index] }))
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,9 @@ namespace linker.plugins.tuntap
|
||||
serviceCollection.AddSingleton<TuntapProxy>();
|
||||
|
||||
serviceCollection.AddSingleton<TuntapClientMessenger>();
|
||||
|
||||
|
||||
serviceCollection.AddSingleton<ExcludeIP>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
|
||||
|
||||
Reference in New Issue
Block a user