diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 046431fa..2aa8f046 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -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
diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml
index 6d2444c1..66b22ec9 100644
--- a/.github/workflows/nuget.yml
+++ b/.github/workflows/nuget.yml
@@ -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
diff --git a/linker.libs/linker.libs.csproj b/linker.libs/linker.libs.csproj
index 21013f8f..436ec1bc 100644
--- a/linker.libs/linker.libs.csproj
+++ b/linker.libs/linker.libs.csproj
@@ -14,9 +14,9 @@
snltty
https://github.com/snltty/linker
https://github.com/snltty/linker
- 1.1.2
- 1.1.2.6
- 1.1.2.6
+ 1.1.3
+ 1.1.3.1
+ 1.1.3.1
full
diff --git a/linker.service/linker.service.csproj b/linker.service/linker.service.csproj
index 81185c7b..ec4a4131 100644
--- a/linker.service/linker.service.csproj
+++ b/linker.service/linker.service.csproj
@@ -14,7 +14,7 @@
false
true
true
- 1.1.2
+ 1.1.3
snltty
snltty
snltty
@@ -22,8 +22,8 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
snltty service
- 1.1.2.6
- 1.1.2.6
+ 1.1.3.1
+ 1.1.3.1
diff --git a/linker.tunnel/TunnelTransfer.cs b/linker.tunnel/TunnelTransfer.cs
index 74443f9d..dbf06a1a 100644
--- a/linker.tunnel/TunnelTransfer.cs
+++ b/linker.tunnel/TunnelTransfer.cs
@@ -352,15 +352,17 @@ 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 eps = new List();
//先尝试内网ipv4
- foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork))
+ //if (tunnelTransportInfo.Local.Remote.Address.Equals(tunnelTransportInfo.Remote.Remote.Address))
{
- 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));
+ 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{
@@ -368,7 +370,7 @@ namespace linker.tunnel
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));
@@ -398,7 +400,7 @@ namespace linker.tunnel
///
///
///
- public void StartBackground(string remoteMachineId, string transactionId,int times = 10)
+ public void StartBackground(string remoteMachineId, string transactionId, int times = 10)
{
if (AddBackground(remoteMachineId, transactionId) == false)
{
@@ -432,7 +434,7 @@ namespace linker.tunnel
}
private bool AddBackground(string remoteMachineId, string transactionId)
{
- return backgroundDic.TryAdd(GetBackgroundKey(remoteMachineId, transactionId), true);
+ return backgroundDic.TryAdd(GetBackgroundKey(remoteMachineId, transactionId), true);
}
private void RemoveBackground(string remoteMachineId, string transactionId)
{
diff --git a/linker.tunnel/linker.tunnel.csproj b/linker.tunnel/linker.tunnel.csproj
index 0156fa92..87e1bd01 100644
--- a/linker.tunnel/linker.tunnel.csproj
+++ b/linker.tunnel/linker.tunnel.csproj
@@ -9,7 +9,7 @@
true
true
linker tunnel
- 1.1.2
+ 1.1.3
snltty
snltty
linker tunnel
@@ -17,8 +17,8 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker tunnel
- 1.1.2.6
- 1.1.2.6
+ 1.1.3.1
+ 1.1.3.1
diff --git a/linker/linker.csproj b/linker/linker.csproj
index 03b1400a..167b91a4 100644
--- a/linker/linker.csproj
+++ b/linker/linker.csproj
@@ -17,7 +17,7 @@
true
false
linker
- 1.1.2
+ 1.1.3
snltty
snltty
linker
@@ -25,8 +25,8 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker
- 1.1.2.6
- 1.1.2.6
+ 1.1.3.1
+ 1.1.3.1
diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs
index 3784f1ae..62118815 100644
--- a/linker/plugins/tunnel/TunnelAdapter.cs
+++ b/linker/plugins/tunnel/TunnelAdapter.cs
@@ -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());
diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs
index 1f13792c..ebd9d7a9 100644
--- a/linker/plugins/tunnel/TunnelApiController.cs
+++ b/linker/plugins/tunnel/TunnelApiController.cs
@@ -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;
}
///
@@ -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();
- tunnelConfigTransfer.SettExcludeIPs(info);
+ excludeIPTransfer.SettExcludeIPs(info);
}
public sealed class TunnelListInfo
diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs
index 6aaaa7e4..22469cd0 100644
--- a/linker/plugins/tunnel/TunnelConfigTransfer.cs
+++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs
@@ -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 data)
- {
- running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize(data.Span);
- running.Data.Update();
- }
-
-
bool reboot = false;
private void TestQuic()
{
diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs
index 70bc6ed9..55f5ed2a 100644
--- a/linker/plugins/tunnel/TunnelStartup.cs
+++ b/linker/plugins/tunnel/TunnelStartup.cs
@@ -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();
serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
@@ -93,6 +96,10 @@ namespace linker.plugins.tunnel
tunnel.Init(compack, tunnelAdapter, transports);
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService();
+
+
+ ExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService();
+ excludeIPTransfer.Load(assemblies);
}
public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
diff --git a/linker/plugins/tunnel/excludeip/ExcludeIPTransfer.cs b/linker/plugins/tunnel/excludeip/ExcludeIPTransfer.cs
new file mode 100644
index 00000000..0ed2a655
--- /dev/null
+++ b/linker/plugins/tunnel/excludeip/ExcludeIPTransfer.cs
@@ -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 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 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 Get()
+ {
+ List result = new List();
+ 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 data)
+ {
+ running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize(data.Span);
+ running.Data.Update();
+ }
+ }
+}
diff --git a/linker/plugins/tunnel/excludeip/IExcludeIP.cs b/linker/plugins/tunnel/excludeip/IExcludeIP.cs
new file mode 100644
index 00000000..4a142cfb
--- /dev/null
+++ b/linker/plugins/tunnel/excludeip/IExcludeIP.cs
@@ -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();
+ }
+}
diff --git a/linker/plugins/tuntap/ExcludeIP.cs b/linker/plugins/tuntap/ExcludeIP.cs
new file mode 100644
index 00000000..d1230668
--- /dev/null
+++ b/linker/plugins/tuntap/ExcludeIP.cs
@@ -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();
+ }
+ }
+}
diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs
index beb0e50c..ff16ede2 100644
--- a/linker/plugins/tuntap/TuntapStartup.cs
+++ b/linker/plugins/tuntap/TuntapStartup.cs
@@ -16,7 +16,7 @@ namespace linker.plugins.tuntap
public StartupLevel Level => StartupLevel.Normal;
public string Name => "tuntap";
public bool Required => false;
- public string[] Dependent => new string[] {"messenger", "relay", "tunnel", "signin", "serialize", "config" };
+ public string[] Dependent => new string[] { "messenger", "relay", "tunnel", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
@@ -33,6 +33,9 @@ namespace linker.plugins.tuntap
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
+
+
+ serviceCollection.AddSingleton();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)