mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
191
This commit is contained in:
@@ -119,11 +119,20 @@ namespace linker.tunnel.transport
|
|||||||
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}");
|
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}");
|
||||||
}
|
}
|
||||||
|
|
||||||
IPEndPoint ep = tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)
|
|
||||||
&& tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)
|
|
||||||
? new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.Remote.Port)
|
|
||||||
: tunnelTransportInfo.Remote.Remote;
|
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
var results = (await Task.WhenAll(tunnelTransportInfo.RemoteEndPoints.Select(ConnectAsync).ToList())).Where(c => c.Item1).ToList();
|
||||||
|
if (results.Count == 0) continue;
|
||||||
|
for (int j = 1; j < results.Count; j++) results[j].Item2.SafeClose();
|
||||||
|
|
||||||
|
return mode == TunnelMode.Client
|
||||||
|
? await TcpClient(tunnelTransportInfo, results[0].Item2).ConfigureAwait(false)
|
||||||
|
: await TcpServer(tunnelTransportInfo, results[0].Item2).ConfigureAwait(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
async Task<ValueTuple<bool, Socket>> ConnectAsync(IPEndPoint ep)
|
||||||
{
|
{
|
||||||
Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
||||||
try
|
try
|
||||||
@@ -138,18 +147,14 @@ namespace linker.tunnel.transport
|
|||||||
}
|
}
|
||||||
await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
||||||
|
|
||||||
if (mode == TunnelMode.Client)
|
return (true, targetSocket);
|
||||||
{
|
|
||||||
return await TcpClient(tunnelTransportInfo, targetSocket).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
return await TcpServer(tunnelTransportInfo, targetSocket).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
targetSocket.SafeClose();
|
targetSocket.SafeClose();
|
||||||
}
|
}
|
||||||
|
return (false, null);
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
||||||
{
|
{
|
||||||
|
@@ -149,7 +149,7 @@ namespace linker.tunnel.transport
|
|||||||
|
|
||||||
TaskCompletionSource<IPEndPoint> taskCompletionSource = new TaskCompletionSource<IPEndPoint>(TaskCreationOptions.RunContinuationsAsynchronously);
|
TaskCompletionSource<IPEndPoint> taskCompletionSource = new TaskCompletionSource<IPEndPoint>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
//监听连接
|
//监听连接
|
||||||
Socket remoteUdp = BindListen(tunnelTransportInfo.Local.Local, taskCompletionSource, tunnelTransportInfo.RemoteEndPoints.Select(c=>c.Address).ToList());
|
Socket remoteUdp = BindListen(tunnelTransportInfo.Local.Local, taskCompletionSource, tunnelTransportInfo.RemoteEndPoints.Select(c => c.Address).ToList());
|
||||||
|
|
||||||
//给对方发送简单消息
|
//给对方发送简单消息
|
||||||
foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints)
|
foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints)
|
||||||
@@ -214,7 +214,7 @@ namespace linker.tunnel.transport
|
|||||||
/// <param name="local"></param>
|
/// <param name="local"></param>
|
||||||
/// <param name="tcs"></param>
|
/// <param name="tcs"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Socket BindListen(IPEndPoint local, TaskCompletionSource<IPEndPoint> tcs,List<IPAddress> ips)
|
private Socket BindListen(IPEndPoint local, TaskCompletionSource<IPEndPoint> tcs, List<IPAddress> ips)
|
||||||
{
|
{
|
||||||
local = new IPEndPoint(IPAddress.IPv6Any, local.Port);
|
local = new IPEndPoint(IPAddress.IPv6Any, local.Port);
|
||||||
Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
|
Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
|
||||||
@@ -225,20 +225,9 @@ namespace linker.tunnel.transport
|
|||||||
TimerHelper.Async(async () =>
|
TimerHelper.Async(async () =>
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
while (true)
|
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
|
||||||
{
|
await socket.SendToAsync(endBytes, result.RemoteEndPoint).ConfigureAwait(false);
|
||||||
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
|
tcs.TrySetResult(result.RemoteEndPoint as IPEndPoint);
|
||||||
if (ips.Contains((result.RemoteEndPoint as IPEndPoint).Address))
|
|
||||||
{
|
|
||||||
await socket.SendToAsync(endBytes, result.RemoteEndPoint).ConfigureAwait(false);
|
|
||||||
tcs.TrySetResult(result.RemoteEndPoint as IPEndPoint);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoggerHelper.Instance.Warning($"{Name} connect recv from {result.RemoteEndPoint} {buffer.AsMemory(0, result.ReceivedBytes).GetString()}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
@@ -108,17 +108,12 @@ namespace linker.tunnel.transport
|
|||||||
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}");
|
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}");
|
||||||
}
|
}
|
||||||
|
|
||||||
IPEndPoint ep = tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)
|
|
||||||
&& tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)
|
|
||||||
? new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.Remote.Port)
|
|
||||||
: tunnelTransportInfo.Remote.Remote;
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
IPEndPoint tempEP = new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0);
|
IPEndPoint tempEP = new IPEndPoint(IPAddress.IPv6Any, 0);
|
||||||
Socket targetSocket = new(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
|
Socket targetSocket = new(AddressFamily.InterNetworkV6, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
|
||||||
targetSocket.IPv6Only(ep.AddressFamily, false);
|
targetSocket.IPv6Only(AddressFamily.InterNetworkV6, false);
|
||||||
targetSocket.WindowsUdpBug();
|
targetSocket.WindowsUdpBug();
|
||||||
targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port));
|
targetSocket.ReuseBind(new IPEndPoint(IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port));
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
@@ -126,16 +121,14 @@ namespace linker.tunnel.transport
|
|||||||
{
|
{
|
||||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
{
|
{
|
||||||
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}");
|
LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
targetSocket.SendTo(authBytes, ep);
|
foreach (var item in tunnelTransportInfo.RemoteEndPoints)
|
||||||
recv:;
|
|
||||||
var result = await targetSocket.ReceiveFromAsync(buffer, tempEP).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
|
||||||
if ((result.RemoteEndPoint as IPEndPoint).Equals(ep) == false)
|
|
||||||
{
|
{
|
||||||
goto recv;
|
targetSocket.SendTo(authBytes, item);
|
||||||
}
|
}
|
||||||
|
var result = await targetSocket.ReceiveFromAsync(buffer, tempEP).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
||||||
|
|
||||||
ISymmetricCrypto crypto = mode == TunnelMode.Client ? CryptoFactory.CreateSymmetric(tunnelTransportInfo.Remote.MachineId) : CryptoFactory.CreateSymmetric(tunnelTransportInfo.Local.MachineId);
|
ISymmetricCrypto crypto = mode == TunnelMode.Client ? CryptoFactory.CreateSymmetric(tunnelTransportInfo.Remote.MachineId) : CryptoFactory.CreateSymmetric(tunnelTransportInfo.Local.MachineId);
|
||||||
return new TunnelConnectionUdp
|
return new TunnelConnectionUdp
|
||||||
@@ -150,15 +143,19 @@ namespace linker.tunnel.transport
|
|||||||
TransactionId = tunnelTransportInfo.TransactionId,
|
TransactionId = tunnelTransportInfo.TransactionId,
|
||||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||||
TransportName = tunnelTransportInfo.TransportName,
|
TransportName = tunnelTransportInfo.TransportName,
|
||||||
IPEndPoint = NetworkHelper.TransEndpointFamily(ep),
|
IPEndPoint = NetworkHelper.TransEndpointFamily(result.RemoteEndPoint as IPEndPoint),
|
||||||
Label = string.Empty,
|
Label = string.Empty,
|
||||||
Receive = true,
|
Receive = true,
|
||||||
SSL = tunnelTransportInfo.SSL,
|
SSL = tunnelTransportInfo.SSL,
|
||||||
Crypto = crypto
|
Crypto = crypto
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
{
|
||||||
|
LoggerHelper.Instance.Error(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
targetSocket.SafeClose();
|
targetSocket.SafeClose();
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
v1.9.1
|
v1.9.1
|
||||||
2025-08-31 15:32:22
|
2025-08-31 18:14:23
|
||||||
1. 一些累计更新
|
1. 一些累计更新
|
||||||
2. 服务器转发多节点
|
2. 服务器转发多节点
|
||||||
3. 虚拟网卡下伪造ACK为TCP-in-TCP隧道提速
|
3. 虚拟网卡下伪造ACK为TCP-in-TCP隧道提速
|
||||||
|
Reference in New Issue
Block a user