Featured image of post Telnet 远程登录与 xinetd 守护:内网老式设备的'最后一根救命稻草'

Telnet 远程登录与 xinetd 守护:内网老式设备的'最后一根救命稻草'

CentOS 7 安装 telnet-server + xinetd,配置 /etc/xinetd.d/telnet,systemd 自启,端口检查,安全加固与 SSH 替代方案对比

背景

在 SSH(默认 22 端口)普及的今天,Telnet(默认 23 端口) 似乎是个远古时代的产物——但实际上,有些场景你必须用 Telnet

  1. 网络设备(华为交换机、Cisco 路由器、H3C 防火墙):很多低端型号只支持 Telnet 管理,SSH 协议栈要么没,要么是付费 License
  2. 老旧服务器:CentOS 5.x、Debian 6 这种古董系统的恢复模式
  3. SSH 配置被改坏进不去系统时,IPMI/ILO 走 Telnet 进单用户模式修复
  4. 嵌入式设备:工业 PLC、工控网关默认 Telnet
  5. 应急通道:内网堡垒机临时开 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 请求
servertelnet 服务程序路径
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 客户端

  • CMDtelnet 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:

维度TelnetSSH
加密明文RSA/AES 加密
端口2322
认证密码密码 / 公私钥 / 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 是远古但仍有用的工具——关键是场景分清

  1. 生产业务 → 用 SSH,别用 Telnet
  2. 内网应急/堡垒机备选 → 可以开 Telnet + 强 ACL
  3. 老设备(交换机、PLC)→ 没办法,Telnet 是唯一选择
  4. 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 启动、端口检查)

使用 Hugo 构建
主题 StackJimmy 设计