This commit is contained in:
snltty
2025-08-31 18:14:23 +08:00
parent ef6d7b97b9
commit 491c0692e8
4 changed files with 35 additions and 44 deletions

View File

@@ -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)
{ {

View File

@@ -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;
} }

View File

@@ -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();

View File

@@ -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隧道提速