Telnet
基于 TCP 协议,用于通过一个终端登陆到其他服务器。
#status / growing
#type / concept
[!info] related notes
Telnet
一句话定义
Telnet 是一种应用层远程终端协议(端口 23),通过 TCP 连接在客户端与服务器之间传输键盘输入和屏幕输出,实现远程命令行操作。
核心机制 / 工作原理
连接流程
- 客户端发起 TCP 连接到服务器的 23 端口
- 服务器要求输入用户名和密码(明文)
- 认证通过后,服务器分配一个远程 shell
- 客户端的键盘输入通过 TCP 发送到服务器
- 服务器的输出回显到客户端终端
NVT(Network Virtual Terminal)
Telnet 协议定义了 NVT 这个抽象终端模型:
- 客户端将本地终端格式转换为 NVT 格式发送
- 服务器将 NVT 格式转换为本地终端格式处理
- 两端通过 协商选项(option negotiation) 调整终端参数(如回显、行模式等)
数据传输特点
- 所有数据以明文形式传输,包括用户名和密码
- 基于 TCP,保证可靠传输但无加密
- 每个字符通常单独发送(逐字符模式),延迟敏感
- 默认端口:23(可通过命令行指定其他端口)
最小例子
# 连接到远程服务器(默认端口 23)
telnet 192.168.1.100
# 测试某个端口是否开放(不登录,只看连接)
telnet 10.0.0.1 3306
# 手动发送 HTTP 请求
telnet example.com 80
# 连接后输入:
GET / HTTP/1.1
Host: example.com
# (按两次 Enter 发送请求)
telnet 命令常用操作
在 telnet 会话中可以使用转义命令(Ctrl+] 进入命令模式):
| 命令 | 说明 |
|---|---|
open host [port] | 连接到指定主机和端口 |
close | 关闭当前连接 |
quit | 退出 telnet |
status | 显示当前连接状态 |
set echo | 切换本地回显 |
set term ansi | 设置终端类型 |
send break | 发送中断信号 |
Ctrl+] | 进入命令模式(不关闭连接) |
# 交互示例
$ telnet
telnet> open 192.168.1.100 22
Trying 192.168.1.100...
Connected to 192.168.1.100.
SSH-2.0-OpenSSH_8.9
# 看到 SSH banner,说明端口 22 开放
telnet> close
telnet> quit
Telnet vs SSH 对比
| 维度 | Telnet | SSH |
|---|---|---|
| 端口 | 23 | 22 |
| 加密 | 无(明文) | 全程加密(AES/ChaCha20) |
| 认证 | 用户名/密码 | 密钥认证、密码、证书 |
| 完整性 | 无 | HMAC 校验 |
| 端口转发 | 不支持 | 支持(隧道) |
| 文件传输 | 不支持 | 支持(SCP/SFTP) |
| 协议开销 | 极低 | 略高(加密握手) |
| 现代地位 | 基本废弃 | 标准远程管理协议 |
边界与常见误解
- 误解:Telnet 完全没用了。 实际上它仍用于快速测试 TCP 端口连通性(如
telnet host port),此时只验证连接建立,不涉及登录。 - 误解:Telnet 只能登录。 它本质上是通用的 TCP 客户端,可以手动与任何文本协议交互(HTTP、SMTP、Redis 等)。
- 边界:Telnet 不等于”远程桌面”。 它只传输文本流,不传图形界面。
- 边界:Windows 10/11 默认未安装 Telnet 客户端。 需通过”启用或关闭 Windows 功能”手动开启,或使用 PowerShell 的
Test-NetConnection替代端口测试。 - 安全警告: 绝不要在公网使用 Telnet 管理服务器。所有数据(含密码)可被网络嗅探捕获,且无完整性校验,易被中间人篡改。
现代替代方案
| 替代方案 | 特点 |
|---|---|
| SSH | 远程管理的行业标准,全程加密 |
| Mosh | 面向不稳定网络,支持漫游和断线恢复 |
| Web Terminal | 基于浏览器的终端(Wetty、ttyd) |
| Test-NetConnection | PowerShell 内置,仅测试端口连通性 |
| nc (netcat) | Unix 下的通用 TCP/UDP 工具 |
仍存在的使用场景
- 网络设备(交换机、路由器)的控制台调试(管理口通常只支持 Telnet)
- 快速测试 TCP 端口连通性(
telnet host port) - 遗留系统的维护(老式 Unix 服务器、工业控制系统、嵌入式设备)
- 学习网络协议时的手动交互实验(手动发 HTTP/SMTP 命令)
- 某些 ISP 设备和 VoIP 电话的管理接口