From 491c0692e8a8875c3a88792592f6f77fce84e578 Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Sun, 31 Aug 2025 18:14:23 +0800 Subject: [PATCH] 191 --- .../transport/TransportTcpP2PNAT.cs | 25 +++++++++------ src/linker.tunnel/transport/TransportUdp.cs | 21 +++---------- .../transport/TransportUdpP2PNAT.cs | 31 +++++++++---------- version.txt | 2 +- 4 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs index 787f84dc..67f57629 100644 --- a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -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> 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) { diff --git a/src/linker.tunnel/transport/TransportUdp.cs b/src/linker.tunnel/transport/TransportUdp.cs index 674c10b6..28c05519 100644 --- a/src/linker.tunnel/transport/TransportUdp.cs +++ b/src/linker.tunnel/transport/TransportUdp.cs @@ -149,7 +149,7 @@ namespace linker.tunnel.transport TaskCompletionSource taskCompletionSource = new TaskCompletionSource(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 /// /// /// - private Socket BindListen(IPEndPoint local, TaskCompletionSource tcs,List ips) + private Socket BindListen(IPEndPoint local, TaskCompletionSource tcs, List 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; } diff --git a/src/linker.tunnel/transport/TransportUdpP2PNAT.cs b/src/linker.tunnel/transport/TransportUdpP2PNAT.cs index aacafaf0..9a3a141b 100644 --- a/src/linker.tunnel/transport/TransportUdpP2PNAT.cs +++ b/src/linker.tunnel/transport/TransportUdpP2PNAT.cs @@ -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(); diff --git a/version.txt b/version.txt index cdd44498..ca726549 100644 --- a/version.txt +++ b/version.txt @@ -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隧道提速