局域网内TCP通信正常,VPN远程连接服务器时TCP连接失败求助
TCP远程连接(VPN)故障排查
问题现象
处于服务器所在局域网时,使用本地IP(192.168.1.50)通过TCP发送数据包可正常运行;但通过VPN远程连接时,使用DNS解析获取的服务器IP进行TCP连接,在socket.Connect(destino);处报错,错误信息:
连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应 88.23.154.89:1025
局域网正常运行代码
// 创建Socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 定义目标IP和端口 IPAddress ip = IPAddress.Parse("192.168.1.50"); int puerto = 8888; // 指定消息发送目标 IPEndPoint destino = new IPEndPoint(ip, puerto); try { // 建立连接 socket.Connect(destino); // 创建消息 byte[] mensaje = Encoding.ASCII.GetBytes("shutdown"); // 发送消息 var result = socket.Send(mensaje); } catch (Exception ex) { throw ex; } finally { socket.Close(); }
VPN远程连接报错代码
// 创建Socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 定义目标IP和端口 IPAddress ip = Dns.GetHostAddresses("google.com")[0]; // 示例返回IP:88.23.154.89 int puerto = Convert.ToInt32(ConfigurationManager.AppSettings["PUERTO_SERVIDOR"]); // 指定消息发送目标 IPEndPoint destino = new IPEndPoint(ip, puerto); try { // 建立连接(此处报错) socket.Connect(destino); // 创建消息 byte[] mensaje = Encoding.ASCII.GetBytes("shutdown"); // 发送消息 var result = socket.Send(mensaje); } catch (Exception ex) { throw ex; } finally { socket.Close(); }
排查与解决建议
- 修正DNS解析目标:代码中示例用了
google.com,实际必须替换为你的服务器对应的域名,否则解析的是无关IP,必然无法连接。 - 过滤IPv4地址:
Dns.GetHostAddresses可能返回IPv6地址,导致连接失败,建议只取IPv4地址:IPAddress ip = Dns.GetHostAddresses("你的服务器域名") .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); if (ip == null) { throw new Exception("未找到可用的IPv4地址"); } - 检查服务器监听配置:确保服务器的Socket监听绑定的是
0.0.0.0(所有网卡),而不是仅局域网IP192.168.1.50,否则远程IP无法访问。 - 验证端口与防火墙:
- 确认远程连接使用的端口(配置文件中的
PUERTO_SERVIDOR)与服务器监听端口一致,且服务器本地防火墙、VPN网关防火墙、运营商防火墙均开放该端口的TCP入站规则。 - 可以用
telnet 服务器IP 端口或Test-NetConnection命令测试端口是否可达。
- 确认远程连接使用的端口(配置文件中的
- 检查VPN路由:确认VPN连接后,客户端的路由表是否将服务器IP的流量导向VPN链路,部分VPN仅对特定网段生效,需手动添加路由规则。
- 优化异常处理:捕获异常时不要用
throw ex,会丢失原始栈跟踪信息,直接写throw即可。
内容的提问来源于stack exchange,提问作者Alvaro Vian
相关产品推荐
相关产品推荐

