嵌入式-常见协议(Telnet)
Telnet是一种基于TCP/IP的远程登录协议(RFC854),默认使用TCP 23端口在应用层工作。它通过三次握手建立连接后,会进行选项协商(如回显、终端类型等),使用IAC控制字节(255)管理交互流程。与SSH不同,Telnet以明文传输数据,缺乏加密和认证机制。虽然已不推荐用于安全远程管理,但仍可用于网络调试、协议测试等场景。常见工具包括系统自带的telnet命令、PuTTY等客户端,以
目录
Telnet(Telecommunication Network) 是一种 基于 TCP/IP 协议的远程登录协议,用于在网络中登录到远程主机并执行命令。Telnet 协议的正式标准在 RFC 854。
简单来说,它允许用户通过网络像在本地一样操作远程计算机。
-
协议端口号: 默认使用 TCP 23端口
-
工作层次: 应用层协议
-
传输层协议: 依赖于 TCP(可靠传输)
1)Telnet 的基本原理
当你在本地使用 Telnet 客户端(如 telnet 192.168.1.10)连接远程主机时:
-
建立 TCP 连接(三次握手)
-
客户端 → 服务器:请求连接
-
服务器 → 客户端:确认连接
-
双方 → 确认完成:建立通信通道
-
-
进行 Telnet 协议选项协商(Option Negotiation)
-
例如是否使用回显、是否启用终端类型、是否启用二进制传输等。
-
使用 IAC(Interpret As Command) 字节(值为 255)开头的控制序列。
-
-
登录阶段
-
服务器要求输入用户名、密码
-
如果认证成功,服务器就允许远程执行命令(类似本地 shell)
-
-
数据传输阶段
-
客户端与服务器之间的输入输出是字符流(明文传输)
-
客户端输入 → TCP → 服务器执行 → 输出结果返回客户端显示
-
-
断开连接
-
客户端或服务器发起 TCP 连接关闭(四次挥手)
-

2)Telent与ssh区别
1️⃣ Telnet 是“简单字符流 + 控制码”
-
本质:一种远程字符终端协议
-
数据形式:纯字符流(ASCII)
-
功能:远程发送命令、回显结果
-
特征:无会话管理、无安全设计
-
控制逻辑:通过
IAC命令协商(非常基础)
可以理解为:
Telnet = “在 TCP 上跑一个字符流通道 + 一点点控制码”
2️⃣ SSH 是“安全通信框架 + 远程终端协议”
SSH 不只是“加了密的 Telnet”,而是一个完整的安全通信框架,它内部包含了多个子层:
SSH Transport Layer Protocol
├─ 建立安全信道(加密、完整性、服务器认证)
├─ 密钥交换(Diffie-Hellman / ECDH)
└─ 建立加密通道
SSH User Authentication Protocol
├─ 用户验证(密码 / 公钥 / 多因素)
SSH Connection Protocol
├─ 多通道复用(shell、scp、sftp、port forwarding)
也就是说:
SSH = “安全通道 + 用户认证 + 多会话复用 + 远程Shell协议”
Telnet 没有“独立的通道建立过程”,它只是在 TCP 连接之上直接进行字符和控制字节的交互。而 SSH 则在 TCP 之上先建立一层“安全通道(Secure Channel)”,再在此之上进行命令交互。
从用途上看
| 功能 | Telnet | SSH |
|---|---|---|
| 远程登录 | ✅ | ✅ |
| 文件传输 | ❌ | ✅(SCP / SFTP) |
| 端口转发 | ❌ | ✅(隧道 Tunnel) |
| 代理功能 | ❌ | ✅(可做加密 SOCKS 代理) |
| 多通道并发 | ❌ | ✅ |
| 安全加密 | ❌ | ✅ |
| 密钥登录 | ❌ | ✅ |
从安全性角度理解区别
| 角度 | Telnet | SSH |
|---|---|---|
| 数据加密 | 无 | AES / ChaCha20 |
| 身份认证 | 明文用户名密码 | RSA / ECDSA / Ed25519 / 密钥 |
| 完整性校验 | 无 | HMAC(SHA 系列) |
| 防中间人攻击 | 无 | 有(服务器指纹认证) |
| 防嗅探 | 无 | 有 |
✅ Telnet: 在 TCP 上开一个明文的“命令行窗口”
✅ SSH: 在 TCP 上建立一个“加密的安全通信隧道”,然后在里面跑命令行(或文件传输、隧道等)
3)Telnet协商
在 Telnet 中,协商(Option Negotiation) 是客户端与服务器在建立连接后、正式传输数据前的一步 功能参数协定过程。比如是否启用某些特性(如回显、终端类型、二进制模式等)、哪一方负责执行这些功能
Telnet 是非常老的协议(上世纪 70 年代初),那时:
-
不同终端(比如 VT100、IBM 3270)支持的控制字符、显示方式都不一样
-
有的终端能自己回显输入字符,有的不能
-
有的需要二进制传输,有的只支持 ASCII
因此 Telnet 设计了一个通用机制:
连接一建立,双方就“协商”该连接应该启用哪些功能。
Telnet 协议中所有的控制命令都以 IAC (Interpret As Command) 字节开始,值为 255 (0xFF)。
协商命令格式如下:
IAC <command> <option>
常见命令如下:
| 命令名称 | 十进制值 | 含义 |
|---|---|---|
| IAC | 255 | Interpret As Command(命令起始) |
| DONT | 254 | 拒绝对方使用某选项 |
| DO | 253 | 请求对方使用某选项 |
| WONT | 252 | 拒绝启用某选项 |
| WILL | 251 | 同意启用某选项 |
| SB | 250 | 子选项开始 |
| SE | 240 | 子选项结束 |
| NOP | 241 | 空操作 |
| AYT | 246 | Are You There(测试对方是否在线) |
举例:
IAC DO 1 → 请求对方启用回显
IAC WILL 1 → 对方同意启用回显
| 选项编号 | 名称 | 说明 |
|---|---|---|
| 0 | BINARY | 是否使用二进制模式(否则用ASCII) |
| 1 | ECHO | 是否由服务器回显输入字符 |
| 3 | SUPPRESS-GO-AHEAD | 抑制“Go Ahead”信号(全双工控制) |
| 5 | STATUS | 状态报告 |
| 24 | TERMINAL-TYPE | 终端类型 |
| 31 | NAWS (Negotiate About Window Size) | 窗口大小协商 |
| 32 | TERMINAL-SPEED | 终端速率 |
| 33 | REMOTE-FLOW-CONTROL | 流控 |
| 34 | LINEMODE | 行模式 |
| 36 | ENVIRONMENT | 环境变量传递 |
4)Telnet用途
虽然不再用于安全远程登录,但 Telnet 仍有一些用途:
网络调试
测试某个端口是否可连,例如:
telnet 192.168.1.10 80
可快速检测 HTTP 服务是否开启。
测试应用协议
比如用 Telnet 手动连接 SMTP(邮件)、HTTP(网页)服务器,发送原始命令包。Telnet 可用于测试任意基于 TCP 的明文协议,通过手动输入原始命令与服务器交互,验证协议响应是否正确。
嵌入式设备调试
一些旧设备或嵌入式系统仍内置 Telnet 接口方便维护。
5)常见工具及库
Telnet 工具(客户端 / 调试)
-
telnet (传统命令行客户端)
-
平台:Linux / macOS / Windows(可启用)
-
用途:直接建立 TCP 连接并交互(如
telnet host port)。 -
安装/使用:大多数 Linux 发行版包名
telnet或inetutils-telnet;Windows 需要“启用 Windows 功能”。
-
-
netcat (
nc) / ncat (Nmap)-
平台:跨平台
-
用途:更通用的 TCP/UDP 调试工具,比 telnet 更灵活(可做端口监听、转发、管道等)。
-
示例:
nc host port。
-
-
socat
-
平台:类 Unix
-
用途:更强的双向数据传输工具,能做端口转发、代理、TLS 等。
-
-
PuTTY
-
平台:Windows(有 Linux 版本)
-
用途:图形化 SSH/Telnet 客户端,支持 Telnet 会话选择。
-
-
Tera Term / SecureCRT / ZOC / MobaXterm
-
平台:Windows(部分跨平台)
-
用途:图形化的终端客户端,通常支持 Telnet 与 SSH(调试或远程登录)。
-
Telnet 服务端实现(daemon)
-
telnetd (inetutils / util-linux 变种)
-
平台:Linux/Unix
-
用途:传统 Telnet 服务端,通常通过
inetd/xinetd管理或独立运行。
-
-
BusyBox telnetd
-
平台:嵌入式 Linux(资源受限设备)
-
用途:轻量级 Telnet 服务端,常见于路由器 / 嵌入式设备。
-
-
Windows Telnet Server(历史/可选)
-
平台:Windows(早期版本或作为可选组件)
-
备注:现代 Windows 默认不启用且不推荐在生产环境使用。
-
安全提醒:服务端通常默认不运行(因为明文密码),生产环境应使用 SSH 替代。
常用编程语言的 Telnet 客户端/库(用于实现/解析 Telnet)
(若只想测试协议,也可直接用 tcp socket)
Python
-
telnetlib(标准库)
-
用途:基础 Telnet 客户端(简单发送/接收、登录流程)。
-
示例:
import telnetlib tn = telnetlib.Telnet('host', 23) tn.read_until(b'login: ') tn.write(b'user\n') tn.read_until(b'Password: ') tn.write(b'pass\n') print(tn.read_all().decode())
-
-
telnetlib3(第三方,async、增强)
-
用途:支持 asyncio、更加现代的实现,适合复杂场景。
-
Java
-
Apache Commons Net — TelnetClient
-
用途:成熟的 Java 网络库,包含 Telnet 客户端支持。
-
用法:
org.apache.commons.net.telnet.TelnetClient。
-
C / C++
-
libtelnet(C 库)
-
用途:一个轻量的 Telnet 协议实现库,包含选项协商处理,适合嵌入式或客户端实现。
-
备注:也可以用
libtelnet做服务端/客户端的协商处理。
-
-
Boost.Asio / 原生 sockets
-
用途:通常直接用 socket 编写 Telnet 客户端/服务端(需要自己处理 IAC 协商,或结合 libtelnet)。
-
6)报文传输
Telnet 协议帧类型
| 类型 | 内容 | 举例 |
|---|---|---|
| 普通数据帧 | 普通字符流,用于输入用户名、密码、shell 命令等 | login: root、ls |
| 控制帧 / IAC 命令 | Telnet 选项协商,控制回显、终端类型、行模式等 | IAC DO ECHO(0xFF 0xFD 0x01) |
Telnet 明文传输:用户名、密码、命令、输出全部可被抓包
IAC 命令是可选的,只有在真正连接 Telnet 服务(23端口)时才会协商
用 Telnet 测试其他协议端口时,只是 TCP 明文传输,不会触发 IAC 协商
简单报文示例如下
IAC 选项协商(如果是 Telnet 23)
服务器 → 客户端: IAC DO ECHO (FF FD 01)
客户端 → 服务器: IAC WILL ECHO (FF FB 01)
服务器 → 客户端: IAC DO SUPPRESS-GO-AHEAD (FF FD 03)
客户端 → 服务器: IAC WILL SUPPRESS-GO-AHEAD (FF FB 03)
用户登录
客户端输入: root<Enter>
TCP payload: 72 6F 6F 74 0D 0A
客户端输入: 123456<Enter>
TCP payload: 31 32 33 34 35 36 0D 0A
执行命令 ls
客户端输入: ls<Enter>
TCP payload: 6C 73 0D 0A
服务器 shell 执行 ls → 输出:
file1.txt<CR><LF>
file2.txt<CR><LF>
dir1/<CR><LF>
TCP 发回客户端,客户端显示
输出: file1.txt → 66 69 6C 65 31 2E 74 78 74 0D 0A
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)