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()))}");
}
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++)
{
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);
try
@@ -138,18 +147,14 @@ namespace linker.tunnel.transport
}
await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
if (mode == TunnelMode.Client)
{
return await TcpClient(tunnelTransportInfo, targetSocket).ConfigureAwait(false);
}
return await TcpServer(tunnelTransportInfo, targetSocket).ConfigureAwait(false);
return (true, targetSocket);
}
catch (Exception)
{
targetSocket.SafeClose();
}
return (false, null);
}
return null;
}
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);
//监听连接
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)
@@ -214,7 +214,7 @@ namespace linker.tunnel.transport
/// <param name="local"></param>
/// <param name="tcs"></param>
/// <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);
Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
@@ -225,20 +225,9 @@ namespace linker.tunnel.transport
TimerHelper.Async(async () =>
{
byte[] buffer = new byte[1024];
while (true)
{
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
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()}");
}
}
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
await socket.SendToAsync(endBytes, result.RemoteEndPoint).ConfigureAwait(false);
tcs.TrySetResult(result.RemoteEndPoint as IPEndPoint);
});
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()))}");
}
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];
IPEndPoint tempEP = new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0);
Socket targetSocket = new(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
targetSocket.IPv6Only(ep.AddressFamily, false);
IPEndPoint tempEP = new IPEndPoint(IPAddress.IPv6Any, 0);
Socket targetSocket = new(AddressFamily.InterNetworkV6, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
targetSocket.IPv6Only(AddressFamily.InterNetworkV6, false);
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++)
{
@@ -126,16 +121,14 @@ namespace linker.tunnel.transport
{
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);
recv:;
var result = await targetSocket.ReceiveFromAsync(buffer, tempEP).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
if ((result.RemoteEndPoint as IPEndPoint).Equals(ep) == false)
foreach (var item in tunnelTransportInfo.RemoteEndPoints)
{
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);
return new TunnelConnectionUdp
@@ -150,15 +143,19 @@ namespace linker.tunnel.transport
TransactionId = tunnelTransportInfo.TransactionId,
TransactionTag = tunnelTransportInfo.TransactionTag,
TransportName = tunnelTransportInfo.TransportName,
IPEndPoint = NetworkHelper.TransEndpointFamily(ep),
IPEndPoint = NetworkHelper.TransEndpointFamily(result.RemoteEndPoint as IPEndPoint),
Label = string.Empty,
Receive = true,
SSL = tunnelTransportInfo.SSL,
Crypto = crypto
};
}
catch (Exception)
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
}
targetSocket.SafeClose();

View File

@@ -1,5 +1,5 @@
v1.9.1
2025-08-31 15:32:22
2025-08-31 18:14:23
1. 一些累计更新
2. 服务器转发多节点
3. 虚拟网卡下伪造ACK为TCP-in-TCP隧道提速