在Linux系统里,telnet是一种基于TCP协议的远程终端登录工具,它允许用户在本地计算机上通过命令行连接并操作远端主机。telnet服务端默认监听23端口,客户端发起连接后,双方以明文方式交换按键指令与输出结果。这种机制诞生于网络还相对可信的年代,设计目标是提供简单的双向字符通信,而不是保障传输安全。理解telnet的本质,要从它的协议交互模型和所处网络环境说起。

telnet的协议原理与通信过程
telnet协议定义在RFC 854中,核心是一个简单的网络虚拟终端(NVT)模型。当Linux主机运行telnetd守护进程后,若有客户端连接23端口,服务端会先发送一些选项协商报文,用来确认是否开启回显、窗口大小调整等扩展功能。协商完成后,用户在客户端敲击的每一个字符都会封装进TCP报文发往服务器,服务器执行命令后将结果原样返回。整个过程没有加密层,所有数据包括输入的用户名和口令都是普通文本。
正因为如此,在交换机的带外管理口、虚拟机内部的隔离网络等可信环境中,telnet依然因其轻量而被使用。但在任何经过不可信网络的链路里,抓包工具几秒内就能看到完整登录凭证。我们可以用一段简单的Python代码模拟telnet客户端向服务端建立连接并读取欢迎信息,帮助理解其明文特性。
import socket
# 模拟telnet客户端连接本地23端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 23))
# 读取服务端欢迎信息,明文返回
data = s.recv(1024)
print(data.decode('utf-8', errors='ignore'))
s.close()
从上面的代码可以看出,telnet通信就是最基础的socket文本读写,没有任何加密封装。这也导致它在现代安全规范里被标记为不安全协议,很多Linux发行版默认不再安装telnet服务端,仅保留客户端供内网设备调试。
Linux下telnet的安装、启动与基础用法
在Ubuntu或Debian系发行版中,若需要telnet服务端,可通过apt-get install telnetd获取,客户端则一般是apt-get install telnet。CentOS或RHEL系则使用yum install telnet-server telnet。安装后,传统方式由xinetd托管telnet服务,需要修改/etc/xinetd.d/telnet中的disable字段为no,再重启xinetd;较新系统也可用systemd直接启动telnet.socket。以下是在CentOS中开放服务的示例。
# 安装服务端和客户端 yum install -y telnet telnet-server # 允许telnet socket监听 systemctl enable telnet.socket systemctl start telnet.socket # 查看23端口状态 ss -tlnp | grep 23
客户端使用也非常直接,在终端输入telnet 192.168.0.1即可连接目标主机,随后按提示输入系统账号与密码。要注意Linux的telnet登录通常禁止使用root直接登入,需先用普通用户登录再su切换,这是一道基础权限围栏。此外,由于telnet不支持密钥认证,所有账号必须设置密码且密码以明文穿越网络。
如果需要验证远端telnet服务是否可达,又不想暴露账号,可借助nc命令做端口探测:nc -vz 192.168.0.1 23,连通会回显succeeded。这种方式比直接telnet更安全,不会触发登录交互。在运维排障时,先确认端口再决定是否用telnet交互,能减少很多无效暴露。
telnet与SSH的核心差异及选型建议
SSH(Secure Shell)同样用于远程登录,但它在传输层做了加密与完整性校验,默认端口是22。与telnet相比,SSH采用非对称加密协商会话密钥,后续通信都用对称加密保护,中间人无法读取内容。此外SSH支持公钥认证,可做到免密且防口令嗅探。下面的表格列出两者关键区别。
| 对比项 | telnet | SSH |
|---|---|---|
| 加密 | 无,全程明文 | 有,传输加密 |
| 默认端口 | 23 | 22 |
| 认证方式 | 仅账号密码 | 密码或公钥 |
| 适用场景 | 内网隔离设备调试 | 几乎所有远程管理 |
从架构思考角度看,当一个系统必须对外提供远程维护能力时,应默认关闭telnet、仅保留SSH,并通过/etc/ssh/sshd_config禁用密码登录、只允许密钥。反过来,在实验室里调试一台不连外网的路由器,telnet因其实现简单、占用资源少,仍是快捷方案。选型核心在于“信任边界”:数据走过的网络是否可信,决定了能否用明文协议。
实践中还有一个常见误区,认为telnet速度比SSH快所以生产环境可用。实际上现代CPU处理SSH加密的损耗微乎其微,而泄露凭证导致的被控代价远超省下的毫秒。因此除了封闭测试网,其他情况都应把telnet视为禁用的历史协议,用SSH或串行控制台替代。理清这一概念,才能避免把调试习惯带进公网环境引发安全事故。