From 7963552dd01314dcbf04901c5dcce024d3566e8d Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Thu, 20 Jun 2024 10:50:19 +0800 Subject: [PATCH] sync --- cmonitor.tunnel/TunnelTransfer.cs | 46 ++++++++++- .../connection/TunnelConnectionUdp.cs | 2 +- cmonitor.tunnel/transport/ITunnelTransport.cs | 8 +- cmonitor.tunnel/transport/TransportMsQuic.cs | 76 ++----------------- .../transport/TransportTcpNutssb.cs | 68 +---------------- cmonitor.tunnel/transport/TransportUdp.cs | 73 ++---------------- 6 files changed, 71 insertions(+), 202 deletions(-) diff --git a/cmonitor.tunnel/TunnelTransfer.cs b/cmonitor.tunnel/TunnelTransfer.cs index 2ee695e9..4a2169a2 100644 --- a/cmonitor.tunnel/TunnelTransfer.cs +++ b/cmonitor.tunnel/TunnelTransfer.cs @@ -6,7 +6,8 @@ using common.libs; using common.libs.extends; using Microsoft.Extensions.DependencyInjection; using System.Collections.Concurrent; -using System.Collections.Generic; +using System.Net.Sockets; +using System.Net; using System.Reflection; namespace cmonitor.tunnel @@ -137,6 +138,7 @@ namespace cmonitor.tunnel SSL = transportItem.SSL }; OnConnecting(tunnelTransportInfo); + ParseRemoteEndPoint(tunnelTransportInfo); ITunnelConnection connection = await transport.ConnectAsync(tunnelTransportInfo); if (connection != null) { @@ -177,6 +179,7 @@ namespace cmonitor.tunnel if (_transports != null) { OnConnectBegin(tunnelTransportInfo); + ParseRemoteEndPoint(tunnelTransportInfo); _transports.OnBegin(tunnelTransportInfo).ContinueWith((result) => { connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); @@ -283,5 +286,46 @@ namespace cmonitor.tunnel { Logger.Instance.Error($"tunnel connect {tunnelTransportInfo.Remote.MachineId} fail->{tunnelTransportInfo.ToJsonFormat()}"); } + + private void ParseRemoteEndPoint(TunnelTransportInfo tunnelTransportInfo) + { + //要连接哪些IP + IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); + List eps = new List(); + + //先尝试内网ipv4 + foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork)) + { + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); + } + //在尝试外网 + eps.AddRange(new List{ + new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), + new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), + }); + //再尝试IPV6 + foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6)) + { + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); + eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); + } + //本机有V6 + bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); + //本机的局域网ip和外网ip + List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); + eps = eps + //对方是V6,本机也得有V6 + .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) + //端口和本机端口一样,那不应该是换回地址 + .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) + //端口和本机端口一样。那不应该是本机的IP + .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) + .ToList(); + + tunnelTransportInfo.RemoteEndPoints = eps; + } } } diff --git a/cmonitor.tunnel/connection/TunnelConnectionUdp.cs b/cmonitor.tunnel/connection/TunnelConnectionUdp.cs index e8510b49..5718c74d 100644 --- a/cmonitor.tunnel/connection/TunnelConnectionUdp.cs +++ b/cmonitor.tunnel/connection/TunnelConnectionUdp.cs @@ -205,7 +205,7 @@ namespace cmonitor.tunnel.connection public override string ToString() { - return $"TransactionId:{TransactionId},TransportName:{TransportName},ProtocolType:{ProtocolType},Type:{Type},Direction:{Direction},IPEndPoint:{IPEndPoint},RemoteMachineId:{RemoteMachineId},RemoteMachineName:{RemoteMachineName}"; + return this.ToJsonFormat(); } } } diff --git a/cmonitor.tunnel/transport/ITunnelTransport.cs b/cmonitor.tunnel/transport/ITunnelTransport.cs index 40798503..31c636fe 100644 --- a/cmonitor.tunnel/transport/ITunnelTransport.cs +++ b/cmonitor.tunnel/transport/ITunnelTransport.cs @@ -1,5 +1,6 @@ using cmonitor.tunnel.connection; using System.Net; +using System.Text.Json.Serialization; namespace cmonitor.tunnel.transport { @@ -133,8 +134,13 @@ namespace cmonitor.tunnel.transport /// 方向 /// public TunnelDirection Direction { get; set; } - + /// + /// 需要加密 + /// public bool SSL { get; set; } + + [JsonIgnore] + public List RemoteEndPoints { get; set; } } diff --git a/cmonitor.tunnel/transport/TransportMsQuic.cs b/cmonitor.tunnel/transport/TransportMsQuic.cs index c842d430..bb4b683b 100644 --- a/cmonitor.tunnel/transport/TransportMsQuic.cs +++ b/cmonitor.tunnel/transport/TransportMsQuic.cs @@ -163,45 +163,9 @@ namespace cmonitor.tunnel.transport /// private async Task ConnectForward(TunnelTransportInfo tunnelTransportInfo) { - //要连接哪些IP - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - - //先尝试内网ipv4 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //在尝试外网 - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //再尝试IPV6 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); - if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG) { - Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", eps.Select(c => c.ToString()))}"); + Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); @@ -210,7 +174,7 @@ namespace cmonitor.tunnel.transport (UdpClient remoteUdp, UdpClient remoteUdp6) = BindListen(local, taskCompletionSource); //给远端发送一些消息 - foreach (IPEndPoint ep in eps) + foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints) { try { @@ -298,7 +262,10 @@ namespace cmonitor.tunnel.transport } try { - remoteUdp.Close(); + remoteUdp?.Close(); + remoteUdp?.Close(); + remoteUdp6?.Close(); + remoteUdp6?.Dispose(); } catch (Exception) { @@ -311,35 +278,8 @@ namespace cmonitor.tunnel.transport /// private void BindAndTTL(TunnelTransportInfo tunnelTransportInfo) { - //给对方发送TTL消息 - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - foreach (IPAddress item in localIps) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); - IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); - foreach (var ip in eps) + foreach (var ip in tunnelTransportInfo.RemoteEndPoints) { try { @@ -666,7 +606,7 @@ namespace cmonitor.tunnel.transport } } - + /// /// 收到连接失败 /// diff --git a/cmonitor.tunnel/transport/TransportTcpNutssb.cs b/cmonitor.tunnel/transport/TransportTcpNutssb.cs index 9aba67bb..acf7284b 100644 --- a/cmonitor.tunnel/transport/TransportTcpNutssb.cs +++ b/cmonitor.tunnel/transport/TransportTcpNutssb.cs @@ -140,47 +140,12 @@ namespace cmonitor.tunnel.transport private async Task ConnectForward(TunnelTransportInfo tunnelTransportInfo) { - //要连接哪些IP - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - //先尝试内网ipv4 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //在尝试外网 - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //再尝试IPV6 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); - if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG) { - Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", eps.Select(c => c.ToString()))}"); + Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - foreach (IPEndPoint ep in eps) + foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints) { Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); try @@ -234,34 +199,7 @@ namespace cmonitor.tunnel.transport } private void BindAndTTL(TunnelTransportInfo tunnelTransportInfo) { - //给对方发送TTL消息 - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - foreach (IPAddress item in localIps) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); - - //过滤掉不支持IPV6的情况 - IEnumerable sockets = eps.Select(ip => + IEnumerable sockets = tunnelTransportInfo.RemoteEndPoints.Select(ip => { Socket targetSocket = new(ip.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); try diff --git a/cmonitor.tunnel/transport/TransportUdp.cs b/cmonitor.tunnel/transport/TransportUdp.cs index 72a6f9d2..6f71692b 100644 --- a/cmonitor.tunnel/transport/TransportUdp.cs +++ b/cmonitor.tunnel/transport/TransportUdp.cs @@ -95,45 +95,10 @@ namespace cmonitor.tunnel.transport private async Task ConnectForward(TunnelTransportInfo tunnelTransportInfo) { - //要连接哪些IP - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - - //先尝试内网ipv4 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetwork)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //在尝试外网 - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //再尝试IPV6 - foreach (IPAddress item in localIps.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6)) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG) { - Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", eps.Select(c => c.ToString()))}"); + Logger.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); @@ -141,7 +106,7 @@ namespace cmonitor.tunnel.transport //接收远端数据,收到了就是成功了 (UdpClient remoteUdp, UdpClient remoteUdp6) = BindListen(local, taskCompletionSource); - foreach (IPEndPoint ep in eps) + foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints) { try { @@ -208,7 +173,10 @@ namespace cmonitor.tunnel.transport } try { - remoteUdp.Close(); + remoteUdp?.Close(); + remoteUdp?.Close(); + remoteUdp6?.Close(); + remoteUdp6?.Dispose(); } catch (Exception) { @@ -342,35 +310,8 @@ namespace cmonitor.tunnel.transport } private void BindAndTTL(TunnelTransportInfo tunnelTransportInfo) { - //给对方发送TTL消息 - IPAddress[] localIps = tunnelTransportInfo.Remote.LocalIps.Where(c => c.Equals(tunnelTransportInfo.Remote.Local.Address) == false).ToArray(); - List eps = new List(); - foreach (IPAddress item in localIps) - { - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Local.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port)); - eps.Add(new IPEndPoint(item, tunnelTransportInfo.Remote.Remote.Port + 1)); - } - - eps.AddRange(new List{ - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port), - new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address,tunnelTransportInfo.Remote.Remote.Port+1), - }); - //本机有V6 - bool hasV6 = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6); - //本机的局域网ip和外网ip - List localLocalIps = tunnelTransportInfo.Local.LocalIps.Concat(new List { tunnelTransportInfo.Local.Remote.Address }).ToList(); - eps = eps - //对方是V6,本机也得有V6 - .Where(c => (c.AddressFamily == AddressFamily.InterNetworkV6 && hasV6) || c.AddressFamily == AddressFamily.InterNetwork) - //端口和本机端口一样,那不应该是换回地址 - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && c.Address.Equals(IPAddress.Loopback)) == false) - //端口和本机端口一样。那不应该是本机的IP - .Where(c => (c.Port == tunnelTransportInfo.Local.Local.Port && localLocalIps.Any(d => d.Equals(c.Address))) == false) - .ToList(); - IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); - foreach (var ip in eps) + foreach (var ip in tunnelTransportInfo.RemoteEndPoints) { try {