This commit is contained in:
snltty
2024-10-20 18:50:45 +08:00
parent 045dd9762e
commit 1aa5664e5d
29 changed files with 315 additions and 273 deletions

View File

@@ -33,11 +33,11 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
with:
tag_name: v1.4.9
release_name: v1.4.9.${{ steps.date.outputs.today }}
tag_name: v1.5.0
release_name: v1.5.0.${{ steps.date.outputs.today }}
draft: false
prerelease: false
body: "1. 新增多分组管理,方便分组切换\r\n2. 增加分组密码,提高分组隔离安全性\r\n3. 优化配置同步,可自由选择同步哪些信息\r\n4. 自动分配虚拟网卡IP\r\n5. 线程池优化\r\n6. 一些UI优化"
body: "1. 新增多分组管理,方便分组切换\r\n2. 增加分组密码,提高分组隔离安全性\r\n3. 优化配置同步,可自由选择同步哪些信息\r\n4. 自动分配虚拟网卡IP\r\n5. 线程池优化\r\n6. 一些UI优化\r\n7. 测试中不要更新不要更新不要更新请使用v1.4.9"
- name: upload-win-x86-oss
id: upload-win-x86-oss
uses: tvrcgo/oss-action@v0.1.1
@@ -47,7 +47,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x86.zip
target-path: /downloads/linker/v1.4.9/linker-win-x86.zip
target-path: /downloads/linker/v1.5.0/linker-win-x86.zip
- name: upload-win-x86
id: upload-win-x86
uses: actions/upload-release-asset@master
@@ -67,7 +67,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x64.zip
target-path: /downloads/linker/v1.4.9/linker-win-x64.zip
target-path: /downloads/linker/v1.5.0/linker-win-x64.zip
- name: upload-win-x64
id: upload-win-x64
uses: actions/upload-release-asset@master
@@ -87,7 +87,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-arm64.zip
target-path: /downloads/linker/v1.4.9/linker-win-arm64.zip
target-path: /downloads/linker/v1.5.0/linker-win-arm64.zip
- name: upload-win-arm64
id: upload-win-arm64
uses: actions/upload-release-asset@master
@@ -107,7 +107,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-x64.zip
target-path: /downloads/linker/v1.4.9/linker-linux-x64.zip
target-path: /downloads/linker/v1.5.0/linker-linux-x64.zip
- name: upload-linux-x64
id: upload-linux-x64
uses: actions/upload-release-asset@master
@@ -127,7 +127,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm.zip
target-path: /downloads/linker/v1.4.9/linker-linux-arm.zip
target-path: /downloads/linker/v1.5.0/linker-linux-arm.zip
- name: upload-linux-arm
id: upload-linux-arm
uses: actions/upload-release-asset@master
@@ -147,7 +147,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm64.zip
target-path: /downloads/linker/v1.4.9/linker-linux-arm64.zip
target-path: /downloads/linker/v1.5.0/linker-linux-arm64.zip
- name: upload-linux-arm64
id: upload-linux-arm64
uses: actions/upload-release-asset@master
@@ -167,7 +167,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
target-path: /downloads/linker/v1.4.9/linker-linux-musl-x64.zip
target-path: /downloads/linker/v1.5.0/linker-linux-musl-x64.zip
- name: upload-linux-musl-x64
id: upload-linux-musl-x64
uses: actions/upload-release-asset@master
@@ -187,7 +187,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
target-path: /downloads/linker/v1.4.9/linker-linux-musl-arm.zip
target-path: /downloads/linker/v1.5.0/linker-linux-musl-arm.zip
- name: upload-linux-musl-arm
id: upload-linux-musl-arm
uses: actions/upload-release-asset@master
@@ -207,7 +207,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
target-path: /downloads/linker/v1.4.9/linker-linux-musl-arm64.zip
target-path: /downloads/linker/v1.5.0/linker-linux-musl-arm64.zip
- name: upload-linux-musl-arm64
id: upload-linux-musl-arm64
uses: actions/upload-release-asset@master
@@ -227,7 +227,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-osx-x64.zip
target-path: /downloads/linker/v1.4.9/linker-osx-x64.zip
target-path: /downloads/linker/v1.5.0/linker-osx-x64.zip
- name: upload-osx-x64
id: upload-osx-x64
uses: actions/upload-release-asset@master
@@ -247,7 +247,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-osx-arm64.zip
target-path: /downloads/linker/v1.4.9/linker-osx-arm64.zip
target-path: /downloads/linker/v1.5.0/linker-osx-arm64.zip
- name: upload-osx-arm64
id: upload-osx-arm64
uses: actions/upload-release-asset@master
@@ -277,7 +277,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-windows-route.zip
target-path: /downloads/linker/v1.4.9/linker-windows-route.zip
target-path: /downloads/linker/v1.5.0/linker-windows-route.zip
- name: upload-windows-route
id: upload-windows-route
uses: actions/upload-release-asset@master

View File

@@ -38,6 +38,6 @@ jobs:
- name: Push
run: |
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.4.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.libs/bin/release/linker.libs.1.4.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.tun/bin/release/linker.tun.1.4.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.5.0.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.libs/bin/release/linker.libs.1.5.0.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.tun/bin/release/linker.tun.1.5.0.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol

View File

@@ -27,7 +27,21 @@ namespace linker.libs
}
});
}
public static void SetInterval(Func<Task<bool>> action, int delayMs)
public static void SetInterval(Func<bool> action, Func<int> delay)
{
Task.Run(async () =>
{
while (true)
{
if (action() == false)
{
break;
}
await Task.Delay(delay()).ConfigureAwait(false);
}
});
}
public static void SetInterval(Func<Task<bool>> action, Func<int> delay)
{
Task.Run(async () =>
{
@@ -37,7 +51,7 @@ namespace linker.libs
{
break;
}
await Task.Delay(delayMs).ConfigureAwait(false);
await Task.Delay(delay()).ConfigureAwait(false);
}
});
}

View File

@@ -17,7 +17,7 @@ namespace linker.libs.extends
ref double v = ref value;
fixed (void* p = &v)
{
new Span<byte>(p, 8).CopyTo(memory.Span);
new Span<byte>(p, sizeof(double)).CopyTo(memory.Span);
}
}
#endregion
@@ -32,7 +32,7 @@ namespace linker.libs.extends
ref long v = ref value;
fixed (void* p = &v)
{
new Span<byte>(p, 8).CopyTo(memory.Span);
new Span<byte>(p, sizeof(long)).CopyTo(memory.Span);
}
}
public static unsafe void ToBytes(this long[] value, Memory<byte> memory)
@@ -80,7 +80,7 @@ namespace linker.libs.extends
ref int v = ref value;
fixed (void* p = &v)
{
new Span<byte>(p, 4).CopyTo(memory.Span);
new Span<byte>(p, sizeof(int)).CopyTo(memory.Span);
}
}
public static unsafe void ToBytes(this int[] value, Memory<byte> memory)
@@ -99,7 +99,7 @@ namespace linker.libs.extends
ref uint v = ref value;
fixed (void* p = &v)
{
new Span<byte>(p, 4).CopyTo(memory.Span);
new Span<byte>(p, sizeof(uint)).CopyTo(memory.Span);
}
}
public static unsafe void ToBytes(this uint[] value, Memory<byte> memory)

View File

@@ -14,9 +14,9 @@
<Copyright>snltty</Copyright>
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<Version>1.4.9</Version>
<AssemblyVersion>1.4.9</AssemblyVersion>
<FileVersion>1.4.9</FileVersion>
<Version>1.5.0</Version>
<AssemblyVersion>1.5.0</AssemblyVersion>
<FileVersion>1.5.0</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
<Version>1.4.9</Version>
<AssemblyVersion>1.4.9</AssemblyVersion>
<FileVersion>1.4.9</FileVersion>
<Version>1.5.0</Version>
<AssemblyVersion>1.5.0</AssemblyVersion>
<FileVersion>1.5.0</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -28,7 +28,7 @@ namespace linker.tunnel
/// 加载打洞协议
/// </summary>
/// <param name="assembs"></param>
public void Init(TunnelWanPortTransfer compactTransfer, ITunnelAdapter tunnelAdapter, List<ITunnelTransport> transports)
public void LoadTransports(TunnelWanPortTransfer compactTransfer, ITunnelAdapter tunnelAdapter, List<ITunnelTransport> transports)
{
this.compactTransfer = compactTransfer;
this.tunnelAdapter = tunnelAdapter;

View File

@@ -305,7 +305,7 @@ namespace linker.tunnel.connection
public override string ToString()
{
return this.ToJson();
return this.ToJsonFormat();
}
public bool Equals(ITunnelConnection connection)
{

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
<Version>1.4.9</Version>
<AssemblyVersion>1.4.9</AssemblyVersion>
<FileVersion>1.4.9</FileVersion>
<Version>1.5.0</Version>
<AssemblyVersion>1.5.0</AssemblyVersion>
<FileVersion>1.5.0</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -19,7 +19,7 @@ namespace linker.tunnel.wanport
/// 加载所有外网端口协议
/// </summary>
/// <param name="assembs"></param>
public void Init(List<ITunnelWanPortProtocol> tunnelWanPorts)
public void LoadTransports(List<ITunnelWanPortProtocol> tunnelWanPorts)
{
this.tunnelWanPorts = tunnelWanPorts;
LoggerHelper.Instance.Info($"load tunnel wanport compacts:{string.Join(",", tunnelWanPorts.Select(c => c.Name))}");

View File

@@ -26,14 +26,15 @@
3. 优化配置同步,可自由选择同步哪些信息
4. 自动分配虚拟网卡IP
5. 线程池优化
6. 一些UI优化</Description>
6. 一些UI优化
7. 测试中不要更新不要更新不要更新请使用v1.4.9</Description>
<Copyright>snltty</Copyright>
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker</PackageReleaseNotes>
<Version>1.4.9</Version>
<AssemblyVersion>1.4.9</AssemblyVersion>
<FileVersion>1.4.9</FileVersion>
<Version>1.5.0</Version>
<AssemblyVersion>1.5.0</AssemblyVersion>
<FileVersion>1.5.0</FileVersion>
</PropertyGroup>

View File

@@ -54,7 +54,7 @@ namespace linker.plugins.client
}
}
return true;
}, 10000);
}, () => 10000);
}
/// <summary>
@@ -230,7 +230,7 @@ namespace linker.plugins.client
/// <param name="groups"></param>
public void Set(ClientGroupInfo[] groups)
{
config.Data.Client.Groups = groups.DistinctBy(c=>c.Name).ToArray();
config.Data.Client.Groups = groups.DistinctBy(c => c.Name).ToArray();
config.Data.Update();
}

View File

@@ -291,7 +291,7 @@ namespace linker.plugins.forward.proxy
}
return true;
}, 5000);
}, 30000);
}
private void CloseClientSocketUdp(ITunnelConnection connection)

View File

@@ -31,7 +31,7 @@ namespace linker.plugins.relay
}
}
return true;
}, 1000);
}, () => lastTicksManager.DiffLessEqual(5000) ? 1000 : 30000);
}
public void Update()

View File

@@ -293,7 +293,7 @@ namespace linker.plugins.relay
await TaskRelay();
}
return true;
}, 3000);
}, () => lastTicksManager.DiffLessEqual(3000) ? 3000 : 30000);
}
sealed class TestInfo
{

View File

@@ -162,6 +162,7 @@ namespace linker.plugins.relay.transport
{
if (certificate == null)
{
LoggerHelper.Instance.Error($"need ssl");
socket.SafeClose();
return null;
}

View File

@@ -31,7 +31,7 @@ namespace linker.plugins.sforward.proxy
}
}
return true;
}, 1000);
}, () => lastTicksManager.DiffLessEqual(5000) ? 1000 : 30000);
}

View File

@@ -284,7 +284,7 @@ namespace linker.plugins.sforward.proxy
}
}
return true;
}, 5000);
}, 60000);
}
}

View File

@@ -101,7 +101,7 @@ namespace linker.plugins.tunnel
};
List<ITunnelWanPortProtocol> compacts = types.Select(c => (ITunnelWanPortProtocol)serviceProvider.GetService(c)).Where(c => c != null).Where(c => string.IsNullOrWhiteSpace(c.Name) == false).ToList();
TunnelWanPortTransfer compack = serviceProvider.GetService<TunnelWanPortTransfer>();
compack.Init(compacts);
compack.LoadTransports(compacts);
types = new List<Type> {
@@ -114,7 +114,7 @@ namespace linker.plugins.tunnel
};
List<ITunnelTransport> transports = types.Select(c => (ITunnelTransport)serviceProvider.GetService(c)).Where(c => c != null).Where(c => string.IsNullOrWhiteSpace(c.Name) == false).ToList();
TunnelTransfer tunnel = serviceProvider.GetService<TunnelTransfer>();
tunnel.Init(compack, tunnelAdapter, transports);
tunnel.LoadTransports(compack, tunnelAdapter, transports);
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<TunnelExcludeIPTransfer>();

View File

@@ -34,6 +34,10 @@ namespace linker.plugins.tuntap
serviceCollection.AddSingleton<ExcludeIP>();
serviceCollection.AddSingleton<TuntapConfigTransfer>();
serviceCollection.AddSingleton<TuntapPingTransfer>();
serviceCollection.AddSingleton<TuntapDeviceStatusTransfer>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
@@ -51,6 +55,9 @@ namespace linker.plugins.tuntap
LeaseClientTreansfer leaseTreansfer = serviceProvider.GetService<LeaseClientTreansfer>();
TuntapConfigTransfer tuntapConfigTransfer = serviceProvider.GetService<TuntapConfigTransfer>();
TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService<TuntapPingTransfer>();
TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService<TuntapDeviceStatusTransfer>();
}
public void UseServer(ServiceProvider serviceProvider, FileConfig config)

View File

@@ -24,8 +24,10 @@ namespace linker.plugins.tuntap.client
private readonly RunningConfig runningConfig;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly LeaseClientTreansfer leaseClientTreansfer;
private readonly TuntapPingTransfer pingTransfer;
public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapConfigTransfer tuntapConfigTransfer, LeaseClientTreansfer leaseClientTreansfer)
public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapConfigTransfer tuntapConfigTransfer, LeaseClientTreansfer leaseClientTreansfer, TuntapPingTransfer pingTransfer)
{
this.messengerSender = messengerSender;
this.tuntapTransfer = tuntapTransfer;
@@ -35,6 +37,7 @@ namespace linker.plugins.tuntap.client
this.runningConfig = runningConfig;
this.tuntapConfigTransfer = tuntapConfigTransfer;
this.leaseClientTreansfer = leaseClientTreansfer;
this.pingTransfer = pingTransfer;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -96,9 +99,7 @@ namespace linker.plugins.tuntap.client
{
if (config.Data.Client.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false;
tuntapTransfer.Shutdown();
await tuntapConfigTransfer.RefreshIPForce();
tuntapTransfer.Setup();
await tuntapConfigTransfer.RetstartDevice();
}
else
{
@@ -124,7 +125,7 @@ namespace linker.plugins.tuntap.client
if (param.Content == config.Data.Client.Id)
{
if (config.Data.Client.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false;
tuntapTransfer.Shutdown();
tuntapConfigTransfer.StopDevice();
}
else
{
@@ -191,11 +192,15 @@ namespace linker.plugins.tuntap.client
return await leaseClientTreansfer.GetNetwork();
}
/// <summary>
/// 订阅ping
/// </summary>
/// <param name="param"></param>
public void SubscribePing(ApiControllerParamsInfo param)
{
tuntapConfigTransfer.SubscribePing();
pingTransfer.SubscribePing();
}
}
public sealed class TuntabListInfo
{
public ConcurrentDictionary<string, TuntapInfo> List { get; set; }
@@ -206,5 +211,4 @@ namespace linker.plugins.tuntap.client
public ConcurrentDictionary<string, ITunnelConnection> List { get; set; }
public ulong HashCode { get; set; }
}
}
}

View File

@@ -9,8 +9,6 @@ using linker.plugins.client;
using linker.plugins.messenger;
using linker.plugins.tuntap.config;
using linker.tun;
using linker.tunnel.connection;
using System.Net.NetworkInformation;
using linker.plugins.tuntap.lease;
namespace linker.plugins.tuntap.client
@@ -22,32 +20,25 @@ namespace linker.plugins.tuntap.client
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig;
private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter;
private readonly TuntapTransfer tuntapTransfer;
private readonly LeaseClientTreansfer leaseClientTreansfer;
private string deviceName = "linker";
public VersionManager Version { get; } = new VersionManager();
private readonly ConcurrentDictionary<string, TuntapInfo> tuntapInfos = new ConcurrentDictionary<string, TuntapInfo>();
public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos;
public LinkerTunDeviceRouteItem[] RouteItems { get; private set; } = [];
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
public TuntapConfigTransfer(MessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, LinkerTunDeviceAdapter linkerTunDeviceAdapter, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer)
public TuntapConfigTransfer(MessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer)
{
this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState;
this.config = config;
this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig;
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
this.tuntapTransfer = tuntapTransfer;
this.leaseClientTreansfer = leaseClientTreansfer;
PingTask();
clientSignInState.NetworkEnabledHandle += NetworkEanble;
clientSignInState.NetworkEnabledHandle += (times) => RefreshIP();
tuntapTransfer.OnSetupBefore += () => { NotifyConfig(); };
tuntapTransfer.OnSetupAfter += () => { NotifyConfig(); };
@@ -58,9 +49,58 @@ namespace linker.plugins.tuntap.client
tuntapTransfer.OnShutdownSuccess += () => { NotifyConfig(); DeleteForward(); DelRoute(); runningConfig.Data.Tuntap.Running = false; runningConfig.Data.Update(); };
}
private void NetworkEanble(int times)
/// <summary>
/// 刷新IP
/// </summary>
public void RefreshIP()
{
TimerHelper.Async(async () =>
{
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength;
await LeaseIP();
while (tuntapTransfer.Status == TuntapStatus.Operating)
{
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);
if (run)
{
tuntapTransfer.Shutdown();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
}
NotifyConfig();
});
}
/// <summary>
/// 重启网卡
/// </summary>
/// <returns></returns>
public async Task RetstartDevice()
{
tuntapTransfer.Shutdown();
await LeaseIP();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
}
/// <summary>
/// 关闭网卡
/// </summary>
public void StopDevice()
{
tuntapTransfer.Shutdown();
}
/// <summary>
/// 租赁IP
/// </summary>
/// <returns></returns>
private async Task LeaseIP()
{
if (runningConfig.Data.Tuntap.Group2IP.TryGetValue(config.Data.Client.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo))
{
@@ -77,71 +117,8 @@ namespace linker.plugins.tuntap.client
runningConfig.Data.Tuntap.PrefixLength = leaseInfo.PrefixLength;
runningConfig.Data.Update();
}
if (tuntapTransfer.Status == TuntapStatus.Running && times > 0)
{
tuntapTransfer.Shutdown();
tuntapTransfer.Setup();
}
if (times == 0)
{
LoggerHelper.Instance.Debug($"tuntap initialize->{runningConfig.Data.Tuntap.Running}");
if (runningConfig.Data.Tuntap.Running)
{
tuntapTransfer.Shutdown();
LoggerHelper.Instance.Debug($"tuntap should be run");
tuntapTransfer.Setup();
}
}
NotifyConfig();
});
}
/// <summary>
/// 刷新IP
/// </summary>
public void RefreshIP()
{
if (runningConfig.Data.Tuntap.Running || runningConfig.Data.Tuntap.IP.Equals(IPAddress.Any) == false)
{
TimerHelper.Async(async () =>
{
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
byte prefixLength = runningConfig.Data.Tuntap.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 tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(config.Data.Client.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
while (tuntapTransfer.Status == TuntapStatus.Operating)
{
await Task.Delay(1000);
}
if ((oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && tuntapTransfer.Status == TuntapStatus.Running)
{
tuntapTransfer.Shutdown();
tuntapTransfer.Setup();
}
NotifyConfig();
});
}
}
public async Task RefreshIPForce()
{
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 tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(config.Data.Client.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
}
/// <summary>
@@ -177,7 +154,7 @@ namespace linker.plugins.tuntap.client
if (tuntapTransfer.Status == TuntapStatus.Running && needReboot)
{
tuntapTransfer.Shutdown();
tuntapTransfer.Setup();
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
}
else
{
@@ -275,6 +252,11 @@ namespace linker.plugins.tuntap.client
/// <returns></returns>
private TuntapInfo GetLocalInfo()
{
if (runningConfig.Data.Tuntap.LanIPs.Length == 0)
{
runningConfig.Data.Tuntap.LanIPs = [clientSignInState.Connection.LocalAddress.Address];
runningConfig.Data.Tuntap.Masks = [24];
}
TuntapInfo info = new TuntapInfo
{
IP = runningConfig.Data.Tuntap.IP,
@@ -458,51 +440,5 @@ namespace linker.plugins.tuntap.client
};
}
private readonly LastTicksManager lastTicksManager = new LastTicksManager();
public void SubscribePing()
{
lastTicksManager.Update();
}
private void PingTask()
{
TimerHelper.SetInterval(async () =>
{
if (tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffLessEqual(5000))
{
await Ping();
}
return true;
}, 3000);
TimerHelper.SetInterval(async () =>
{
if (tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffGreater(15000))
{
await Ping();
}
return true;
}, 30000);
}
private async Task Ping()
{
if (tuntapTransfer.Status == TuntapStatus.Running && (runningConfig.Data.Tuntap.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay)
{
var items = tuntapInfos.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)
{
var connections = tuntapProxy.GetConnections();
items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == config.Data.Client.Id);
}
foreach (var item in items)
{
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(item.IP, 500);
item.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1;
Version.Add();
}
}
}
}
}

View File

@@ -0,0 +1,68 @@
using linker.client.config;
using linker.libs;
using linker.plugins.tuntap.config;
using linker.tun;
using System.Net.NetworkInformation;
namespace linker.plugins.tuntap.client
{
public sealed class TuntapDeviceStatusTransfer
{
private readonly RunningConfig runningConfig;
private readonly TuntapTransfer tuntapTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter;
private ulong setupTimes = 0;
public TuntapDeviceStatusTransfer(RunningConfig runningConfig, TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter)
{
this.runningConfig = runningConfig;
this.tuntapTransfer = tuntapTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
tuntapTransfer.OnSetupSuccess += () => { setupTimes++; };
}
private void CheckTuntapStatusTask()
{
TimerHelper.SetInterval(async () =>
{
if (setupTimes > 0 && runningConfig.Data.Tuntap.Running && OperatingSystem.IsWindows())
{
await InterfaceCheck().ConfigureAwait(false);
}
return true;
}, () => 15000);
}
private async Task InterfaceCheck()
{
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
{
LoggerHelper.Instance.Error($"tuntap inerface {tuntapTransfer.DeviceName} is down, restarting");
linkerTunDeviceAdapter.Shutdown();
await Task.Delay(5000).ConfigureAwait(false);
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
{
await tuntapConfigTransfer.RetstartDevice();
}
}
}
private async Task<bool> InterfaceAvailable()
{
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapTransfer.DeviceName);
return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing();
}
private async Task<bool> InterfacePing()
{
try
{
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(runningConfig.Data.Tuntap.IP, 500);
return pingReply.Status == IPStatus.Success;
}
catch (Exception)
{
return false;
}
}
}
}

View File

@@ -0,0 +1,67 @@
using linker.client.config;
using linker.libs;
using linker.plugins.tuntap.config;
using linker.tunnel.connection;
using System.Net.NetworkInformation;
using System.Net;
using linker.config;
namespace linker.plugins.tuntap.client
{
public sealed class TuntapPingTransfer
{
private readonly TuntapTransfer tuntapTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly FileConfig config;
private readonly TuntapProxy tuntapProxy;
private readonly RunningConfig runningConfig;
public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig)
{
this.tuntapTransfer = tuntapTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
this.config = config;
this.tuntapProxy = tuntapProxy;
this.runningConfig = runningConfig;
PingTask();
}
private readonly LastTicksManager lastTicksManager = new LastTicksManager();
public void SubscribePing()
{
lastTicksManager.Update();
}
private void PingTask()
{
TimerHelper.SetInterval(async () =>
{
if (tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffLessEqual(5000))
{
await Ping();
}
return true;
}, () => tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffLessEqual(5000) ? 3000 : 30000);
}
private async Task Ping()
{
if (tuntapTransfer.Status == TuntapStatus.Running && (runningConfig.Data.Tuntap.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)
{
var connections = tuntapProxy.GetConnections();
items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == config.Data.Client.Id);
}
foreach (var item in items)
{
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(item.IP, 500);
item.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1;
tuntapConfigTransfer.Version.Add();
}
}
}
}
}

View File

@@ -1,7 +1,6 @@
using linker.client.config;
using linker.libs;
using System.Net;
using System.Net.NetworkInformation;
using linker.plugins.client;
using linker.plugins.tuntap.config;
using linker.tun;
@@ -10,15 +9,17 @@ namespace linker.plugins.tuntap.client
{
public sealed class TuntapTransfer
{
private readonly RunningConfig runningConfig;
private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter;
private string deviceName = "linker";
private OperatingManager operatingManager = new OperatingManager();
public TuntapStatus Status => operatingManager.Operating ? TuntapStatus.Operating : (TuntapStatus)(byte)linkerTunDeviceAdapter.Status;
public string Error => linkerTunDeviceAdapter.Error;
public string Error1 => linkerTunDeviceAdapter.Error1;
public string DeviceName => "linker";
public Action OnSetupBefore { get; set; } = () => { };
public Action OnSetupAfter { get; set; } = () => { };
public Action OnSetupSuccess { get; set; } = () => { };
@@ -26,25 +27,19 @@ namespace linker.plugins.tuntap.client
public Action OnShutdownAfter { get; set; } = () => { };
public Action OnShutdownSuccess { get; set; } = () => { };
private ulong setupTimes = 0;
public TuntapTransfer(ClientSignInState clientSignInState, LinkerTunDeviceAdapter linkerTunDeviceAdapter, TuntapProxy tuntapProxy, RunningConfig runningConfig)
{
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
this.runningConfig = runningConfig;
linkerTunDeviceAdapter.Initialize(deviceName, tuntapProxy);
linkerTunDeviceAdapter.Initialize(DeviceName, tuntapProxy);
AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown();
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
CheckTuntapStatusTask();
}
/// <summary>
/// 运行网卡
/// </summary>
public void Setup()
public void Setup(IPAddress ip,byte prefixLength)
{
if (operatingManager.StartOperation() == false)
{
@@ -55,14 +50,13 @@ namespace linker.plugins.tuntap.client
OnSetupBefore();
try
{
if (runningConfig.Data.Tuntap.IP.Equals(IPAddress.Any))
if (ip.Equals(IPAddress.Any))
{
return;
}
linkerTunDeviceAdapter.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength, 1400);
linkerTunDeviceAdapter.Setup(ip, prefixLength, 1400);
if (string.IsNullOrWhiteSpace(linkerTunDeviceAdapter.Error))
{
setupTimes++;
linkerTunDeviceAdapter.SetNat();
OnSetupSuccess();
}
@@ -135,51 +129,5 @@ namespace linker.plugins.tuntap.client
linkerTunDeviceAdapter.DelRoute(ips);
}
private void CheckTuntapStatusTask()
{
TimerHelper.SetInterval(async () =>
{
if (setupTimes > 0 && runningConfig.Data.Tuntap.Running && OperatingSystem.IsWindows())
{
await InterfaceCheck().ConfigureAwait(false);
}
return true;
}, 15000);
}
private async Task InterfaceCheck()
{
if (await InterfaceAvailable() == false && operatingManager.Operating == false)
{
LoggerHelper.Instance.Error($"tuntap inerface {deviceName} is down, restarting");
linkerTunDeviceAdapter.Shutdown();
await Task.Delay(5000).ConfigureAwait(false);
if (await InterfaceAvailable() == false && operatingManager.Operating == false)
{
Setup();
}
}
}
private async Task<bool> InterfaceAvailable()
{
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == deviceName);
return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing();
}
private async Task<bool> InterfacePing()
{
try
{
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(runningConfig.Data.Tuntap.IP, 500);
return pingReply.Status == IPStatus.Success;
}
catch (Exception)
{
return false;
}
}
}
}

View File

@@ -84,7 +84,7 @@ namespace linker.plugins.tuntap.lease
});
return true;
}, 30000);
}, () => 60000);
}
}
}

View File

@@ -6,7 +6,6 @@ using linker.plugins.tuntap.client;
using linker.plugins.tuntap.config;
using linker.plugins.tuntap.lease;
using MemoryPack;
using System.Net;
namespace linker.plugins.tuntap.messenger
{
@@ -31,12 +30,7 @@ namespace linker.plugins.tuntap.messenger
[MessengerId((ushort)TuntapMessengerIds.Run)]
public void Run(IConnection connection)
{
TimerHelper.Async(async () =>
{
tuntapTransfer.Shutdown();
await tuntapConfigTransfer.RefreshIPForce();
tuntapTransfer.Setup();
});
_ = tuntapConfigTransfer.RetstartDevice();
}
/// <summary>
@@ -46,7 +40,7 @@ namespace linker.plugins.tuntap.messenger
[MessengerId((ushort)TuntapMessengerIds.Stop)]
public void Stop(IConnection connection)
{
tuntapTransfer.Shutdown();
tuntapConfigTransfer.StopDevice();
}
/// <summary>

View File

@@ -80,17 +80,18 @@ namespace linker.plugins.updater
}
private readonly LastTicksManager lastTicksManager = new LastTicksManager();
public void Subscribe(string machineId)
{
if (subscribes.TryGetValue(machineId, out LastTicksManager lastTicksManager) == false)
if (subscribes.TryGetValue(machineId, out LastTicksManager _lastTicksManager) == false)
{
lastTicksManager = new LastTicksManager();
subscribes.TryAdd(machineId, lastTicksManager);
_lastTicksManager = new LastTicksManager();
subscribes.TryAdd(machineId, _lastTicksManager);
}
//距离上次订阅超过一分钟,需要立即更新一次
bool needUpdate = lastTicksManager.DiffGreater(60 * 1000);
bool needUpdate = _lastTicksManager.DiffGreater(60 * 1000);
_lastTicksManager.Update();
lastTicksManager.Update();
if (needUpdate)
@@ -119,7 +120,7 @@ namespace linker.plugins.updater
Update(updateInfo);
}
return true;
}, 1000);
}, () => lastTicksManager.DiffLessEqual(5000) ? 1000 : 15000);
}
private void LoadTask()
@@ -128,7 +129,7 @@ namespace linker.plugins.updater
{
await updaterHelper.GetUpdateInfo(updateInfo);
return true;
}, 15000);
}, () => 30000);
}
}

View File

@@ -1,8 +1,9 @@
v1.4.9
2024-10-18 17:15:48
v1.5.0
2024-10-20 18:50:45
1. 新增多分组管理,方便分组切换
2. 增加分组密码,提高分组隔离安全性
3. 优化配置同步,可自由选择同步哪些信息
4. 自动分配虚拟网卡IP
5. 线程池优化
6. 一些UI优化
7. 测试中不要更新不要更新不要更新请使用v1.4.9