背景
在 SSH(默认 22 端口)普及的今天,Telnet(默认 23 端口) 似乎是个远古时代的产物——但实际上,有些场景你必须用 Telnet:
- 网络设备(华为交换机、Cisco 路由器、H3C 防火墙):很多低端型号只支持 Telnet 管理,SSH 协议栈要么没,要么是付费 License
- 老旧服务器:CentOS 5.x、Debian 6 这种古董系统的恢复模式
- SSH 配置被改坏进不去系统时,IPMI/ILO 走 Telnet 进单用户模式修复
- 嵌入式设备:工业 PLC、工控网关默认 Telnet
- 应急通道:内网堡垒机临时开 Telnet,作为 SSH 失联的备选
Telnet 最大的问题:明文传输——账号、密码、命令全部裸奔在网络上。所以:
生产环境永远不要用 Telnet 暴露在公网。本篇主要讲内网应急和老设备管理场景。
一、Telnet 与 xinetd 的关系
关键概念:现代 Linux 上 Telnet 不再独立运行,而是由 xinetd(Extended Internet Daemon)超级守护进程按需启动。
1
2
3
4
5
6
7
8
9
10
11
12
| [客户端] ──TCP:23──> xinetd 监听 23
│
│ 收到连接
│
│ fork 子进程:/usr/sbin/in.telnetd
↓
in.telnetd 接管这个连接
│
│ 验证账号
│ 启动 shell
↓
用户登录
|
为什么用 xinetd?
- 老式服务(telnet/ftp/tftp/rsh)每个都跑一个守护进程太浪费
- xinetd 统一监听端口,按需启动服务,资源占用低
- 集中管理(ACL、限速、日志)
二、安装
2.1 CentOS 7
1
2
| yum install telnet-server
yum install xinetd
|
2.2 Ubuntu/Debian
1
| apt install telnetd xinetd
|
2.3 启动与开机自启
1
2
3
4
5
6
7
8
9
| # CentOS 7(用 systemd socket 激活)
systemctl enable telnet.socket
systemctl enable xinetd
systemctl start telnet.socket
systemctl start xinetd
# Ubuntu(直接启动 xinetd)
systemctl enable xinetd
systemctl start xinetd
|
检查服务:
1
2
3
| systemctl status telnet.socket
systemctl status xinetd
# 应都是 active (running)
|
检查端口:
1
2
| ss -tan | grep :23
# 应看到 LISTEN 0 128 [::]:23 [::]:*
|
三、配置 /etc/xinetd.d/telnet
1
| vim /etc/xinetd.d/telnet
|
关键配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| service telnet
{
disable = no # 启用(yes = 禁用)
flags = REUSE # 端口复用
socket_type = stream # TCP
wait = no # 多线程(yes = 单线程)
user = root
server = /usr/sbin/in.telnetd
server_args = -h # 不显示 banner(更隐蔽)
log_on_failure += USERID # 失败日志记账号
log_on_success += PID HOST EXIT # 成功日志记 PID、来源、退出码
# 访问控制
only_from = 10.0.0.0/8 192.168.0.0/16 # 只允许内网
# no_access = 0.0.0.0/0 # 黑名单(与 only_from 二选一)
# 限速
per_source = 5 # 单 IP 最大并发 5
cps = 50 10 # 每秒 50 新连接,超额等 10 秒
}
|
配置项详解:
| 选项 | 作用 |
|---|
disable = no | 启用本服务(默认配置常是 yes) |
flags = REUSE | 端口可复用,紧急重启服务不用等 TIME_WAIT |
wait = no | 多线程(一个连接一个进程,互不阻塞) |
user = root | 以 root 身份 fork 子进程处理 telnet 请求 |
server | telnet 服务程序路径 |
only_from | 白名单 IP 段(强烈建议) |
no_access | 黑名单 IP 段 |
per_source | 单 IP 最大并发连接数 |
cps | 新连接速率限制(防爆破) |
log_on_failure | 失败日志加 USERID(记尝试的用户) |
log_on_success | 成功日志加 PID/HOST/EXIT |
reload 配置:
1
2
| # 不用 restart,xinetd 自动重载
killall -HUP xinetd
|
四、允许 root 登录(默认禁用)
Telnet 默认不允许 root 直接登录(/etc/securetty 控制)——这是安全设计,但有时候确实需要。
临时开放:
1
2
| mv /etc/securetty /etc/securetty.bak
# 现在 root 可以 Telnet 登录
|
永久开放(不推荐):保持 /etc/securetty.bak 即可。
正确做法:用普通账号登录,再 su - 切 root。这样至少有审计日志。
五、客户端使用
5.1 Linux 客户端
1
2
3
4
5
6
7
8
| telnet <server-ip> 23
# Trying 10.8.33.21...
# Connected to 10.8.33.21.
# Escape character is '^]'.
#
# login: root
# Password:
# [root@server ~]#
|
退出:按 Ctrl + ],输入 quit 回车。
5.2 Windows 客户端
- CMD:
telnet 10.8.33.21 - PuTTY:选 Telnet 协议
- MobaXterm:新建 Session → Telnet
5.3 自动化脚本
1
2
3
4
5
| # 批量检查 Telnet 端口(巡检用)
for ip in $(cat hosts.txt); do
echo -n "$ip: "
timeout 3 bash -c "echo > /dev/tcp/$ip/23" 2>/dev/null && echo "open" || echo "closed"
done
|
六、常见问题
6.1 连不上,端口无响应
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 检查 xinetd 是否启动
systemctl status xinetd
# 检查 23 端口是否监听
ss -tan | grep :23
# 检查防火墙
iptables -L -n | grep 23
# 或
firewall-cmd --list-ports | grep 23
# 开放
firewall-cmd --add-port=23/tcp --permanent
firewall-cmd --reload
|
6.2 连得上但立刻断开
症状:显示 login: 后输入用户名,断开。
原因:/etc/securetty 没配或被改名,或者 PAM 模块拒绝。
对策:
1
2
3
4
5
| # 恢复 securetty
mv /etc/securetty.bak /etc/securetty # 如果之前移走了
# 或者在 securetty 末尾加
echo "pts/0" >> /etc/securetty
echo "pts/1" >> /etc/securetty
|
6.3 中文乱码
Telnet 客户端和服务端字符集不一致导致。对策:
1
2
3
4
5
| # 客户端
LANG=zh_CN.UTF-8 telnet <ip>
# 服务端
echo 'LANG=zh_CN.UTF-8' >> /etc/environment
|
或者直接用 SSH 替代——SSH 字符集协商完善,没有这个问题。
6.4 速度极慢
原因:TCP 窗口、MTU 不匹配。
对策:
1
2
| sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.core.rmem_max=16777216
|
七、安全加固
如果必须在生产用 Telnet(内网专线也算):
7.1 强访问控制
1
2
3
| # /etc/xinetd.d/telnet
only_from = 10.0.0.0/8 # 严格内网白名单
bind = 10.8.33.21 # 只在内网 IP 监听
|
7.2 改端口(防自动化扫描)
1
2
| # /etc/services
telnet 2323/tcp # 改 23 → 2323
|
1
2
| # /etc/xinetd.d/telnet
port = 2323
|
1
2
| # 客户端连 2323
telnet <ip> 2323
|
7.3 强密码 + 锁定策略
1
2
3
4
| # 失败 3 次锁定 10 分钟
yum install pam_tally2
# /etc/pam.d/login 加:
auth required pam_tally2.so deny=3 unlock_time=600
|
7.4 用 SSL 包装(stelnet)
OpenSSH 自带的 stelnet(SSH 包装 Telnet)能让 Telnet 流量走 SSH 加密隧道:
1
2
| ssh -L 2323:localhost:23 user@jumphost
# 本地连 2323 实际走 SSH 到 jumphost 再 Telnet
|
八、SSH 替代方案
能用 SSH 就别用 Telnet——所有现代 Linux 默认装 SSH:
| 维度 | Telnet | SSH |
|---|
| 加密 | 明文 | RSA/AES 加密 |
| 端口 | 23 | 22 |
| 认证 | 密码 | 密码 / 公私钥 / MFA |
| 性能 | 略快(无加密开销) | CPU 多耗 1-3% |
| 工具支持 | 老设备专用 | 全平台 |
| 审计 | xinetd 简单日志 | PAM + auditd 完整 |
| 推荐 | 内网应急/老设备 | 生产默认 |
给老设备开 SSH 的方案:
- Cisco:进入配置模式
crypto key generate rsa 启 SSH - 华为:类似
local-user ... service-type ssh - H3C:开启 STelnet 服务
- 老服务器:先 Telnet 进去,再装
openssh-server
九、卸载
1
2
3
4
5
6
7
8
9
10
| # CentOS
systemctl stop telnet.socket xinetd
yum remove telnet-server xinetd -y
yum autoremove -y
rm -f /etc/xinetd.d/telnet
# Ubuntu
systemctl stop xinetd
apt remove telnetd xinetd -y
apt autoremove -y
|
小结
Telnet 是远古但仍有用的工具——关键是场景分清:
- 生产业务 → 用 SSH,别用 Telnet
- 内网应急/堡垒机备选 → 可以开 Telnet + 强 ACL
- 老设备(交换机、PLC)→ 没办法,Telnet 是唯一选择
- SSH 失联恢复 → IPMI/ILO 的 Telnet 救场
用 Telnet 的 4 条铁律:
- 必须
only_from 白名单 - 禁用 root 登录(用普通账号 + su)
- 强密码策略 + 失败锁定
- 定期审计
/var/log/secure / /var/log/auth.log
下一步:
- 商业方案:Cisco ACS / Huawei iMaster NCE 集中认证
- 自建堡垒机:JumpServer、Teleport(Telnet/SSH 统一代理 + 审计)
- 应急通道:IPMI/ILO 的 Telnet 救场(保留一份 BIOS/IPMI 文档)
源文档:os/linux/第三方tools/net/telnet/telnet.md(xinetd 配置、systemd 启动、端口检查)