ubuntu 20.04 默认不启用 telnet 服务,自18.04起改用 systemd socket activation(telnet.socket)而非 inetd;需先确认 telnetd 包版本 ≥0.17-45 且含 /usr/lib/systemd/system/telnet.socket,再执行 sudo systemctl enable --now telnet.socket 并用 ss -tln | grep :23 验证监听,同时放行防火墙端口23并检查 /etc/securetty 与 pam 配置以支持登录。

Ubuntu 默认不启用 Telnet 服务,且自 18.04 起官方已弃用 inetd 方式,改用 telnet.socket(由 systemd socket activation 管理);直接装 telnetd 不等于服务就跑起来了——你得明确用的是哪种后端,否则 systemctl start telnet.socket 会静默失败。
确认系统是否支持 telnet.socket
新版 Ubuntu(20.04+)的 telnetd 包自带 telnet.socket 单元文件,但前提是安装时没被跳过或冲突。执行:
sudo apt install telnetd<br>systemctl list-unit-files | grep telnet
如果输出含 telnet.socket enabled,说明可用;若只有 telnet.service 或为空,说明你装的是旧版兼容包(比如从源手动编译或第三方 repo),不能靠 socket 激活。
- 常见错误现象:
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托管,或退而求其次用nc -l -p 23临时监听(仅调试,无认证)
启用 telnet.socket 并验证监听
确认支持后,启动 socket 并检查端口:
sudo systemctl enable --now telnet.socket<br>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限制(见下节) - 防火墙必须放行:
sudo ufw allow 23/tcp,云服务器还需在控制台安全组里开 23 端口
root 登录失败?检查 /etc/securetty 和 PAM 配置
Telnet 默认禁止 root 直接登录,错误提示通常是 Login incorrect 或连接后立即断开。关键检查点:
-
/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
替代方案:用 xinetd 托管 in.telnetd(兼容性更强)
如果你卡在 socket 激活或权限上,xinetd 是更可控的选择,尤其适合 Ubuntu 16.04–18.04 或定制镜像:
sudo apt install xinetd telnetd<br>sudo tee /etc/xinetd.d/telnet service telnet<br>{<br> disable = no<br> flags = REUSE<br> socket_type = stream<br> wait = no<br> user = root<br> server = /usr/sbin/in.telnetd<br> log_on_failure += USERID<br>}<br>EOF<br>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 就连得上却登不了,且错误日志几乎不报具体原因。











