You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:14