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()))}");
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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隧道提速
|
||||
|
Reference in New Issue
Block a user