目录

1)Telnet 的基本原理

2)Telent与ssh区别

3)Telnet协商

4)Telnet用途

5)常见工具及库

6)报文传输


Telnet(Telecommunication Network) 是一种 基于 TCP/IP 协议的远程登录协议,用于在网络中登录到远程主机并执行命令。Telnet 协议的正式标准在 RFC 854
简单来说,它允许用户通过网络像在本地一样操作远程计算机。

  • 协议端口号: 默认使用 TCP 23端口

  • 工作层次: 应用层协议

  • 传输层协议: 依赖于 TCP(可靠传输)


1)Telnet 的基本原理

当你在本地使用 Telnet 客户端(如 telnet 192.168.1.10)连接远程主机时:

  1. 建立 TCP 连接(三次握手)

    • 客户端 → 服务器:请求连接

    • 服务器 → 客户端:确认连接

    • 双方 → 确认完成:建立通信通道

  2. 进行 Telnet 协议选项协商(Option Negotiation)

    • 例如是否使用回显、是否启用终端类型、是否启用二进制传输等。

    • 使用 IAC(Interpret As Command) 字节(值为 255)开头的控制序列。

  3. 登录阶段

    • 服务器要求输入用户名、密码

    • 如果认证成功,服务器就允许远程执行命令(类似本地 shell)

  4. 数据传输阶段

    • 客户端与服务器之间的输入输出是字符流(明文传输)

    • 客户端输入 → TCP → 服务器执行 → 输出结果返回客户端显示

  5. 断开连接

    • 客户端或服务器发起 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 发行版包名 telnetinetutils-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: rootls
控制帧 / 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

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐