Ubuntu 20.04 默认不会启用 Telnet 服务。从 Ubuntu 18.04 开始,系统架构已经切换为 systemd socket activation(即 telnet.socket),不再依赖传统的 inetd 方式。要在 Ubuntu 中开启 Telnet,首先需要确认 telnetd 软件包版本不低于 0.17-45,并确保系统内存在 /usr/lib/systemd/system/telnet.socket 文件。随后执行 sudo systemctl enable --now telnet.socket,再通过 ss -tln | grep :23 检查 23 端口是否处于监听状态。同时别忽略防火墙放行 23 端口,并核对 /etc/securetty 与 PAM 配置,确保 Telnet 登录功能可以正常使用。

Ubuntu 默认状态下并未开启 Telnet 服务,而且自 18.04 版本起,传统的 inetd 启动方式已经被逐步淘汰,改由 systemd socket activation 管理的 telnet.socket 接管。这里有一个常见误区:仅仅安装 telnetd 并不意味着 Ubuntu Telnet 服务已经可用——关键在于你当前系统采用的是哪种后端机制,否则在执行 systemctl start telnet.socket 时,很可能出现没有明显报错却无法生效的情况。
确认系统是否支持 telnet.socket
较新的 Ubuntu 版本(20.04 及以上)通常在 telnetd 包中自带 telnet.socket 单元文件,但前提是安装过程未被跳过,也没有被其他软件包冲突覆盖。可以执行:
sudo apt install telnetd
systemctl list-unit-files | grep telnet
如果输出中包含 telnet.socket enabled,说明当前系统支持通过 socket 方式启用 Telnet;如果只看到 telnet.service,或者没有任何结果,则说明你安装的可能是旧版兼容包(例如手动编译版本或第三方仓库版本),这类环境通常无法依靠 socket activation 直接启动。
- 常见报错现象:执行
systemctl start telnet.socket后,ss -tln | grep :23依然没有监听结果,且systemctl status telnet.socket显示failed to load unit - 常见原因:某些精简版镜像(例如部分云服务器镜像)删除了
/usr/lib/systemd/system/telnet.socket,或者telnetd版本过旧(可用apt show telnetd查看,低于 0.17-45 一般不包含 socket 支持) - 解决思路:可以改用
xinetd来托管 Telnet 服务,或者临时使用nc -l -p 23进行端口监听测试(仅适合调试场景,不带身份认证)
启用 telnet.socket 并验证监听
确认系统支持后,就可以在 Ubuntu 上正式启动 Telnet 服务并检查监听状态:
sudo systemctl enable --now telnet.socket
sudo ss -tln | grep ':23'
正常情况下,应看到类似 LISTEN 0 128 *:23 *:* 的结果。需要注意以下几点:
telnet.socket属于“按需激活”模式:只有首次客户端连接时,才会拉起in.telnetd进程,因此刚执行完启动命令后,ps aux | grep telnet可能暂时看不到相关进程- 如果
ss没有任何输出,建议检查sudo systemctl status telnet.socket是否出现Failed to listen on /dev/tty。这通常与in.telnetd的权限或终端配置有关,需要确认/etc/securetty中包含ttyS0,或者按需注释掉pam_securetty限制(详见下文) - 防火墙必须放行 23 端口:例如执行
sudo ufw allow 23/tcp;如果是云服务器,还需要在云平台控制台的安全组规则中开放 TCP 23 端口
root 登录失败?检查 /etc/securetty 和 PAM 配置
Telnet 服务默认通常会禁止 root 用户直接远程登录,常见表现是提示 Login incorrect,或者连接建立后立刻断开。排查 Ubuntu Telnet 登录失败时,重点检查以下配置:
/etc/securetty文件中是否列出了ttyS0(串口终端)或pts/0(伪终端)?由于 Telnet 登录实际走的是pts/*,而默认配置往往只保留本地控制台终端名/etc/pam.d/login中是否存在auth [success=ok default=ignore] pam_securetty.so这一行?如果存在,root 一般无法通过网络方式直接登录- 临时处理方法(仅用于测试):
sudo mv /etc/securetty /etc/securetty.bak,或者将pam_securetty.so这一行注释掉 - 更安全、更推荐的做法:创建普通用户并加入
sudo组,尽量避免直接暴露 root 账户进行 Telnet 登录
替代方案:用 xinetd 托管 in.telnetd(兼容性更强)
如果你在 Ubuntu 开启 Telnet 的过程中卡在 socket 激活、权限限制或兼容性问题上,使用 xinetd 托管 in.telnetd 往往更加灵活可控,尤其适合 Ubuntu 16.04–18.04 或某些定制化系统镜像:
sudo apt install xinetd telnetd
sudo tee /etc/xinetd.d/telnet <<'EOF'
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
EOF
sudo systemctl restart xinetd
配置时还要留意以下细节:
disable = no必须使用小写写法,若写成NO或False,配置通常不会生效xinetd默认会监听所有网络接口;如果只希望内网访问,可以添加bind = 192.168.1.100(请替换为实际内网 IP)in.telnetd的安装路径可能因系统架构不同而变化,例如在 arm64 环境下可能位于/usr/bin/in.telnetd,建议使用find /usr -name 'in.telnetd'进行确认
真正棘手的问题通常并不是安装软件包本身,而是 in.telnetd 启动后会依次读取 /etc/securetty 和 pam.d/login 配置文件——只要这两处设置稍有偏差,就会出现 Telnet 可以连接但无法登录的情况,而且日志信息往往并不会明确指出具体原因。
