1. 项目概述与背景
最近在给一台新部署的银河麒麟高级服务器操作系统V10(KylinosV10)做基础环境初始化,有个老旧的业务系统需要用到telnet服务进行设备管理。虽然现在SSH是远程管理的绝对主流,但架不住一些特定场景下,比如调试某些只支持telnet的嵌入式设备、或者维护一些遗留系统时,telnet这个“古董”协议还是绕不开的。在银河麒麟V10上,默认是没有安装telnet客户端和服务端的,需要手动操作。这活儿看起来简单,就是几条命令的事,但实际做下来,从包名确认、依赖解决到服务配置,还是有几个细节值得拿出来聊聊,尤其是对于刚接触国产操作系统的朋友。
简单来说,这个任务就是在银河麒麟V10服务器版上,安装并启用telnet的客户端(用于连接其他主机)和服务器端(允许其他主机连接本机)。整个过程会涉及到使用系统自带的包管理器(通常是yum或dnf,银河麒麟V10基于CentOS,所以是yum)、服务管理(systemctl)以及一些基础的安全配置考量。无论你是运维工程师、系统管理员,还是需要在国产化环境中部署应用的开发者,掌握这套标准化的软件安装和服务管理流程,都是必备技能。下面我就把这次实操的完整过程、踩过的坑以及一些优化建议,详细拆解一遍。
2. 核心需求与方案选型解析
2.1 为什么在SSH时代还要用Telnet?
首先得明确一点,除非业务强制要求,否则绝不建议在生产环境启用telnet服务端。原因很简单,telnet协议的所有通信(包括用户名和密码)都是明文传输的,这在现代网络环境下等同于“裸奔”,安全隐患极大。那为什么还要安装它呢?需求主要来自两方面:
- 客户端需求:作为管理机,去连接那些只开放了telnet端口的老旧网络设备(如交换机、路由器、工控设备等)。这时,我们只需要在本机安装telnet客户端即可。
- 服务器端需求:某些遗留的应用程序或测试环境,可能硬编码了使用telnet协议进行通信。在受控的内网环境(如物理隔离的测试网)中,临时启用用于调试或兼容性测试。
对于需求1,我们只安装telnet客户端包。对于需求2,则需要额外安装telnet-server服务端包并启动服务。本次操作假设两种需求都存在,因此会完成全套安装和配置。
2.2 银河麒麟V10的软件源与包管理
银河麒麟高级服务器操作系统V10是基于CentOS(或类似RHEL系)构建的,因此其底层的包管理工具是yum(或dnf,但V10默认仍是yum)。软件包的名字、安装方式与CentOS/RedHat基本一致。
这里有一个关键点:确保你的系统已经正确配置了可用的软件源(repository)。新安装的银河麒麟系统通常会自带官方的源,但有些定制化镜像可能为了精简而移除。你可以通过以下命令检查:
yum repolist all如果能看到启用(enabled)的仓库列表,如base、updates等,就说明源是正常的。如果列表为空或报错,就需要先联系系统提供方或根据官方文档配置软件源。这是后续所有安装操作的基础。
方案选型上,没有其他选择,就是通过yum来安装由麒麟官方或上游社区维护的telnet和telnet-server软件包。这是最稳定、最合规的方式。
3. 详细安装步骤与操作实录
3.1 环境准备与检查
开始之前,请确保你拥有系统的root权限。所有安装操作都需要在管理员身份下进行。
首先,更新一下yum的缓存,确保获取到最新的软件包列表信息。这是一个好习惯,尤其是在新系统上。
yum makecache或者使用更全面的更新命令:
yum update -y如果当前没有其他紧急任务,执行全面更新可以让系统保持最新状态。如果只是安装telnet,makecache就足够了。
3.2 安装Telnet客户端
安装客户端非常简单,一条命令搞定:
yum install -y telnet命令解析:
yum install: yum包管理器的安装命令。-y: 自动回答“yes”,在确认安装时无需手动输入。在脚本中或确定要安装时使用它非常方便。telnet: 客户端软件包的名称。
安装完成后,可以通过以下命令验证客户端是否安装成功:
telnet --help # 或尝试连接一个不存在的地址,看命令是否可用 telnet 127.0.0.1 9999如果出现telnet: connect to address 127.0.0.1: Connection refused之类的提示(表示连接被拒绝,而不是“命令未找到”),那就说明telnet客户端命令已经可用了。
3.3 安装与配置Telnet服务端
第一步:安装服务端包
yum install -y telnet-server系统会自动安装telnet-server包及其可能需要的依赖。
第二步:理解Telnet服务的守护进程在RHEL/CentOS系(包括银河麒麟)中,telnet-server包提供的是由xinetd(扩展互联网服务守护进程)管理的服务。xinetd本身是一个超级守护进程,用于管理很多不常使用的、轻量级的网络服务(如telnet、tftp等),只在有连接请求时才激活对应的服务进程,节省系统资源。
因此,我们需要确保xinetd服务已安装并启用。通常安装telnet-server时会自动安装xinetd作为依赖,但最好确认一下:
systemctl status xinetd如果未安装,则手动安装:
yum install -y xinetd第三步:配置Telnet服务Telnet服务的配置文件位于/etc/xinetd.d/目录下,安装包会提供一个默认的配置文件telnet。
cat /etc/xinetd.d/telnet默认配置可能是禁用的(disable = yes)。我们需要编辑这个文件来启用服务。
vi /etc/xinetd.d/telnet找到disable = yes这一行,将其改为disable = no。如果需要,你还可以修改其他参数,例如:
flags = REUSE: 设置套接字可重用。socket_type = stream: 使用流式套接字(TCP)。wait = no: 服务不等待,即xinetd会为每个新的连接请求派生一个新的服务进程。user = root: 运行服务的用户(出于安全考虑,有些场景会改为非root用户,但telnet本身设计就需要root权限来登录任意用户)。server = /usr/sbin/in.telnetd: telnet守护进程的位置。log_on_failure += USERID: 在日志中记录登录失败的用户ID。
一个启用后的基础配置示例如下:
service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = no }编辑完成后,保存退出。
注意:直接以root运行服务是安全风险之一。但在严格的telnet使用场景下(如隔离测试网),这可能不是首要考虑。如果安全要求高,应考虑彻底不使用telnet。
第四步:启动服务首先,需要启动超级守护进程xinetd,并设置其开机自启。
systemctl enable xinetd --now--now参数表示同时立即启动服务。
然后,由于修改了xinetd的子服务配置(telnet),需要重新加载xinetd的配置,使其生效。
systemctl reload xinetd或者重启xinetd服务:
systemctl restart xinetd第五步:防火墙配置(关键步骤)银河麒麟V10默认可能启用firewalld或iptables作为防火墙。telnet默认使用TCP 23端口,必须允许该端口的入站连接,否则外部无法访问。
如果使用firewalld(默认):
# 查看当前防火墙状态和区域 firewall-cmd --state firewall-cmd --get-active-zones # 添加telnet服务(firewalld预定义了telnet服务,指向23/tcp) firewall-cmd --permanent --add-service=telnet # 或者直接添加端口 # firewall-cmd --permanent --add-port=23/tcp # 重新加载防火墙配置使规则生效 firewall-cmd --reload # 验证规则是否添加成功 firewall-cmd --list-services # 或 firewall-cmd --list-ports如果使用iptables(较旧或特定定制版本):需要直接添加iptables规则,并确保规则持久化。
# 添加允许23端口的规则 iptables -I INPUT -p tcp --dport 23 -j ACCEPT # 保存iptables规则(银河麒麟上保存命令可能因版本而异,通常是) service iptables save # 或 iptables-save > /etc/sysconfig/iptables实操心得:很多朋友安装配置完服务后,发现本地
telnet 127.0.0.1 23能通,但外部机器连不上,十有八九就是防火墙端口没开。务必养成检查防火墙规则的习惯。可以使用ss -tlnp | grep :23或netstat -tlnp | grep :23查看23端口是否处于监听(LISTEN)状态。
4. 功能验证与基础测试
4.1 服务状态检查
检查xinetd及端口监听:
systemctl status xinetd ss -tlnp | grep :23如果状态为
active (running)且能看到xinetd进程在监听23端口,说明服务已正常启动。本地回环测试: 在服务器本机上测试telnet服务是否响应。
telnet 127.0.0.1 23如果连接成功,你会看到类似以下的提示,这表示telnet服务端正在工作:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Kylinos Linux release V10 (Tercel) Kernel 4.19.90-... on an x86_64 login:此时,你可以输入一个有效的系统用户名和密码进行登录测试。注意:root用户默认可能被PAM(可插拔认证模块)策略禁止通过telnet登录,这是安全加固的一部分。可以尝试用普通用户登录。
4.2 远程连接测试
从网络中的另一台Linux或Windows客户端进行测试。
- Linux客户端:
telnet <服务器IP地址> 23 - Windows客户端: 现代Windows默认未安装telnet客户端。可以在“控制面板”->“程序”->“启用或关闭Windows功能”中勾选“Telnet客户端”进行安装。安装后,在CMD或PowerShell中执行:
telnet <服务器IP地址> 23
成功连接并登录即表示整个telnet服务安装配置完成。
5. 安全加固与生产环境考量
再次强调,在互联网或非受信网络环境中启用telnet是极其危险的行为。如果因特殊原因必须在某个环境使用,请务必考虑以下加固措施:
使用防火墙严格限制源IP:不要对所有IP开放23端口。使用firewalld的
--add-rich-rule或iptables的-s参数,只允许特定的管理IP或IP段访问。# firewalld 示例:仅允许192.168.1.100访问 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="telnet" accept' firewall-cmd --reload修改默认端口(安全性提升有限):修改
/etc/services文件可以改变telnet的公认端口,但这不是真正的安全措施,因为端口扫描很容易发现。修改方法复杂且可能影响其他组件,一般不推荐。使用TCP Wrappers进行额外控制:
xinetd通常支持TCP Wrappers。可以通过配置/etc/hosts.allow和/etc/hosts.deny文件来进一步控制访问。# /etc/hosts.allow in.telnetd: 192.168.1.0/255.255.255.0 # /etc/hosts.deny in.telnetd: ALL上述配置允许192.168.1.0/24网段,拒绝所有其他。注意,TCP Wrappers的优先级和兼容性需要根据系统具体配置确认。
强制使用SSH替代:最根本的解决方案。向业务方说明安全风险,推动将客户端或服务端协议升级为SSH。对于需要连接老旧设备的情况,可以考虑在网络上部署一个“跳板机”,该跳板机通过SSH管理,并在其上安装telnet客户端用于连接内网老旧设备。
6. 常见问题排查与解决实录
在实际操作中,你可能会遇到以下问题:
6.1 连接被拒绝 (Connection refused)
- 现象:
telnet <IP> 23后立刻返回Connection refused。 - 可能原因及排查:
- 服务未启动:检查
xinetd服务状态和23端口监听状态(ss -tlnp | grep :23)。 - 配置文件未启用:确认
/etc/xinetd.d/telnet中disable = no。 - 防火墙拦截:这是最常见的原因。检查本地防火墙规则,并确认客户端与服务器之间的网络路径上没有其他防火墙(如云平台安全组、硬件防火墙)拦截了23端口。
- 服务未启动:检查
6.2 连接超时 (Connection timed out)
- 现象:连接长时间无响应,最终超时。
- 可能原因及排查:
- 网络不通:使用
ping命令检查基础网络连通性。 - 中间防火墙丢弃包:网络路径上的防火墙直接丢弃了数据包,而非拒绝。需要逐段排查网络设备策略。
- 服务绑定IP错误:默认
xinetd服务监听在所有IP(0.0.0.0)上。检查配置是否有bind或only_from等指令限制了监听地址。
- 网络不通:使用
6.3 登录失败或立即断开
- 现象:能连接到登录提示符,但输入用户名/密码后登录失败,或连接立即关闭。
- 可能原因及排查:
- PAM安全策略限制:检查
/etc/securetty文件,该文件列出了允许root登录的终端设备。默认可能不包含pts/*(伪终端),导致root无法通过telnet登录。不建议修改此文件来允许root登录,应使用普通用户。 - 用户shell不可用:检查
/etc/passwd中该用户指定的shell(如/bin/bash)是否存在且可执行。 - selinux影响:银河麒麟V10可能默认启用SELinux。SELinux可能会阻止
xinetd或in.telnetd进程的正常操作。可以临时将SELinux设置为宽容模式测试:
注意:这仅是临时测试方法。生产环境如需调整,应使用正确的SELinux布尔值或策略模块,如setenforce 0setsebool -P xinetd_disable_trans=1(具体策略名需根据系统审计日志ausearch或sealert确定)。
- PAM安全策略限制:检查
6.4 软件包安装失败
- 现象:
yum install telnet或yum install telnet-server失败。 - 可能原因及排查:
- 软件源问题:
yum repolist all检查源是否可用。尝试yum clean all && yum makecache。 - 包名差异:极少数情况下,包名可能有细微差别。可以使用
yum search telnet或yum list available | grep telnet来搜索确切的包名。 - 依赖冲突:系统可能与其他软件包存在依赖冲突。仔细阅读
yum报错信息,或尝试使用yum install -y telnet-server --skip-broken(谨慎使用)。
- 软件源问题:
7. 进阶:将Telnet服务封装为Systemd服务(可选)
虽然通过xinetd管理是标准方式,但有些人更喜欢用systemd直接管理服务,感觉更“现代”和统一。我们可以为telnet创建一个自定义的systemd服务单元。
创建服务单元文件:
vi /etc/systemd/system/telnet.service写入以下内容:
[Unit] Description=Telnet Server After=network.target [Service] Type=simple ExecStart=/usr/sbin/in.telnetd -debug 23 StandardInput=socket StandardOutput=inherit StandardError=journal Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target这里使用
-debug参数让in.telnetd在前台运行,便于systemd管理。端口直接指定为23。禁用xinetd的telnet配置,启用新的systemd服务:
# 将xinetd中的telnet服务改回禁用 sed -i 's/disable = no/disable = yes/' /etc/xinetd.d/telnet systemctl reload xinetd # 启用并启动自定义的telnet服务 systemctl daemon-reload systemctl enable telnet.service --now systemctl status telnet.service
注意事项:这种方式绕过了
xinetd,一些原本由xinetd提供的访问控制功能(如/etc/xinetd.d/telnet中的only_from等)将失效,需要依靠防火墙或TCP Wrappers(如果编译时支持)来实现。除非你对systemd管理有强烈偏好,否则对于telnet这种服务,沿用传统的xinetd管理方式更为常见和简单。
整个安装和配置过程就完成了。核心其实就是理解银河麒麟V10作为RHEL系发行版的软件管理逻辑,以及xinetd这个超级守护进程的工作机制。安全永远是悬在头上的剑,时刻提醒自己telnet的局限性,并在条件允许时尽快迁移到更安全的协议上。