通过SSH在Linux设备上建立Telnet连接遇到问题求助
解决方案:通过Renci SSH实现端口转发后建立Telnet连接
我之前踩过一模一样的坑!你直接用TcpClient连远程18080端口被拒绝,核心原因是请求没有通过已建立的SSH隧道——大多数情况下,设备上的Telnet服务(18080端口)只允许本地访问,不会直接对外开放。按照「SSH连接→端口转发→Telnet连接」的流程来就能解决,具体步骤如下:
1. 建立SSH连接并创建本地端口转发
用Renci SSH库创建一个本地端口转发,把你本地机器的某个端口(比如12345)映射到远程Linux设备的127.0.0.1:18080(这里用127.0.0.1是因为要从设备内部访问它的Telnet服务,比公网IP更可靠):
using Renci.SshNet; using System.Net.Sockets; // 初始化SSH客户端并连接 using var sshClient = new SshClient("192.168.4.127", "admin", "password12"); sshClient.Connect(); // 创建本地端口转发规则 // 参数说明:本地监听地址、本地端口、远程目标地址、远程端口 var localForward = new ForwardedPortLocal("127.0.0.1", 12345, "127.0.0.1", 18080); // 添加转发规则并启动 sshClient.AddForwardedPort(localForward); localForward.Start();
2. 通过转发端口建立Telnet(TcpClient)连接
现在不要直接连远程的192.168.4.127:18080,而是连接你本地的127.0.0.1:12345——这个端口的所有请求都会通过SSH隧道转发到远程设备的18080端口:
// 连接本地转发端口,而非远程原始端口 using var tcpSocket = new TcpClient("127.0.0.1", 12345); // 接下来就可以正常和Telnet服务交互了 // 比如获取流、发送命令等 var stream = tcpSocket.GetStream(); // ... 后续Telnet操作代码
3. 清理资源(必做)
用完后记得停止端口转发并断开SSH连接,避免资源泄漏:
localForward.Stop(); sshClient.Disconnect();
额外注意事项
- 确认远程Linux设备上的Telnet服务确实绑定了
127.0.0.1(而非仅允许特定IP),可以用netstat -tulpn | grep 18080命令查看 - 无需在Linux设备上开放18080端口的公网访问权限,因为所有流量都走SSH隧道(默认22端口)
- 确保你使用的Renci SSH库是最新版本,旧版本可能存在端口转发的兼容性问题
内容的提问来源于stack exchange,提问作者Anil Gadiyar
相关产品推荐
相关产品推荐

