☰
CentOS 7离线安装telnet完整指南:内网无外网环境实操
2026/10/2 1:33:15 网站建设 项目流程

做运维的朋友应该都经历过这种场景:机房里的机器没外网,或者客户现场要求严格,所有服务器都隔离在独立网络里,偏偏这时候你需要在机器上排查网络端口通不通、临时调试个设备,想用telnet却发现系统里压根没装。连yum install都用不了,总不能因为装个包就去申请开外网窗口,那审批流程走下来一天都过去了。这种内网离线环境装包的问题我遇到过太多次,所以把CentOS 7离线安装telnet包的完整流程整理成一篇实操笔记,从在联网机器上下载RPM包,到U盘拷进内网,再到配置xinetd启动服务,一步不落讲清楚。不管你是刚开始接触Linux的新手,还是被内网环境折腾过多次的老手,这篇内容都能给你一套拿来就能用的方案。

1. 离线安装的整体思路与方案选型

1.1 为什么会有离线装telnet的需求

很多人第一反应是:"telnet?这老古董现在还装它干嘛?"确实,SSH早就是远程登录的主流,但telnet在实际运维里依然有一席之地。最常见的一个用途就是TCP端口连通性测试——telnet ip port回车,端口通不通一眼就能看出来,比nc、nmap在某些精简系统上还方便。另一个用途是调试老设备,比如光猫、交换机、老款路由器,甚至某些嵌入式设备的管理接口到现在还是telnet协议。

关键问题是,CentOS 7的最小化安装默认不带telnet客户端,更别说telnet-server服务端了。而在真正的生产环境里,服务器往往处在内网隔离区,物理上就没有外网连接,yum install直接报错。还有等保合规要求严格的项目,服务器不允许随便连公网,装任何软件都得走离线流程。这种时候"离线安装"就不是选择题,而是必答题。

1.2 三种主流通用方案的对比

离线安装一个软件包,行业内比较成熟的做法无非以下三种,我先列出来对比一下,方便你根据实际情况选择:

方案适用场景优点缺点
RPM包直接安装(rpm -ivh)包少、依赖简单操作直接、速度快依赖需要手动处理,缺一个装一个
本地Yum源(createrepo搭建)包多、依赖复杂、后续还要装其他软件自动解决依赖关系,一劳永逸需要多一步createrepo初始化
源码编译安装官方没有现成RPM包,或需要定制参数灵活可裁剪编译环境要求高,耗时长,不适合业务紧急的情况

针对telnet这个具体场景,telnet的包结构很清晰(后面会细讲),用第一种方案完全够用。但如果你面对的是一台可能后续还要装其他软件的内网服务器,我强烈建议顺手把第二种方案也做了,一劳永逸。

1.3 我为什么最终推荐"RPM包+本地yum源"组合

说实话,早期我图省事,喜欢直接把所有RPM包拉到内网,然后用rpm -ivh一个个装。telnet这种依赖简单的包还好,但遇到像离线装postgres、装nginx那种依赖一大堆的情况,光处理依赖顺序就能让人崩溃。踩过几次坑之后,我的习惯变成了:无论包多少,只要是在内网机器上装东西,就先建一个本地yum源。

给telnet建本地yum源听起来有点"杀鸡用牛刀",但好处非常实在:yum install telnet会自动处理好xinetd这些依赖,不用我手动盯着依赖关系;后续这台机器再想装vim、net-tools、lrzsz之类的常用工具,把RPM包丢进同一个目录,重新执行一次createrepo就又能直接yum安装了。尤其对内网批量运维,这个优势会越滚越大。

2. 环境准备与核心依赖分析

2.1 确认目标机器的版本和架构

动手之前,先确认两件事:操作系统版本和CPU架构。很多新手栽跟头就栽在这里,在CentOS 7.9上用的包,硬装到CentOS 7.2上,结果报了一堆库版本不兼容的错;或者x86_64的包强行装到ARM机器上,直接拒绝安装。

在目标机器上执行以下命令确认版本信息:

cat /etc/redhat-release uname -m uname -r

正常情况下,你会看到类似这样的输出:

CentOS Linux release 7.9.2009 (Core) x86_64 3.10.0-1160.el7.x86_64

我建议联动机器的CentOS版本最好和目标机器保持一致,至少大版本不能跨(7.x可以兼容7.x,但7和8、7和6之间有本质差异)。如果版本差得太多,哪怕小版本不同,也可能遇到libc.so.6版本过旧或过新导致的不兼容问题。这个步骤30秒搞定,但能省下后面至少半小时的排查时间。

2.2 telnet的依赖关系到底有哪些

telnet在CentOS 7里的包结构相对清晰,主要涉及三个包:

  • telnet:客户端程序,依赖基本的glibc库,通常不会缺。
  • telnet-server:服务端程序,注意它本身不直接监听23端口,而是交给xinetd托管。
  • xinetd:扩展的超级守护进程,telnet-server和很多老式服务(如rsync的老版本、rsh等)都由它来统一管理。

这三者的关系可以理解成:telnet-server是"业务程序",但它的开关由xinetd这个"管家"控制。当你访问23端口时,xinetd会临时唤醒telnet-server来处理连接,连接结束又把它挂起。所以安装了telnet-server之后必须同时装xinetd,启动也是启动xinetd,这是一个最容易忽略的细节。

在联网机器上准备RPM包时,可以用下面这个命令查看某个rpm包的依赖关系,非常直观:

rpm -qpR telnet-server-0.17-65.el7_8.x86_64.rpm

它的输出会列出这个包需要的所有共享库和依赖包,比如libc.so.6、libwrap.so.0、xinetd等。这样你在拷贝到内网之前,就能提前知道该把哪些包一起带过去。

2.3 准备安装源的三种具体渠道

离线环境的RPM包从哪里来?根据我自己的实际操作经验,主要有三个渠道,按照优先级排序:

渠道一:用CentOS 7安装ISO镜像。

这个方法最省事,自带的Packages目录里包含了telnet和xinetd。操作如下:

mkdir /mnt/cdrom mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/cdrom ls /mnt/cdrom/Packages/ | grep -E "^telnet|^xinetd"

挂载之后你就能看到类似telnet-0.17-64.el7.x86_64.rpm、telnet-server-0.17-64.el7.x86_64.rpm、xinetd-2.3.15-14.el7.x86_64.rpm这些文件,直接复制出来用即可。手边有ISO的话强烈推荐这个方式,镜像文件本身还可以当作系统安装盘复用。

渠道二:在一台能联网的CentOS 7机器上用yum下载。

这个方式适合你手边没有ISO,但有一台网络正常的同版本机器的场景,详细操作在下一章展开。它能自动把依赖包也一起拉下来,是最"正规"的办法。

渠道三:从已经装过telnet的机器上导出。

rpm -qa | grep telnet查到已安装的包名,再到/var/cache/yum缓存目录或者rpm -ql找到文件路径,把这些RPM原样拷走。这个方式有局限性,因为缓存不一定还在,而且依赖情况不直观,所以只作为补充手段。

3. 完整实操:从获取RPM包到启动服务

3.1 在联网机器上把RPM包全部拉下来

假设你手里有一台能上外网的CentOS 7机器,准备把telnet相关的包全部下载到本地目录。我推荐用yumdownloader工具,它可以自动解析依赖并批量下载。

第一步,如果系统里还没有yumdownloader,先安装yum-utils:

yum install -y yum-utils

第二步,创建目录并用--resolve参数把所有依赖包一次性拉下来:

mkdir -p /root/telnet_rpm cd /root/telnet_rpm yumdownloader --resolve telnet telnet-server xinetd

--resolve这个参数很关键,它会把依赖的共享库包也一并下载。比如有时候telnet-server会依赖libtirpc等库,如果没有--resolve,你只带走三个主包,到内网一装还是会报错。下载完成后,用ls -lh检查一下文件列表,正常会有telnet、telnet-server、xinetd三个核心包,可能还有一两个额外的依赖库。

如果yumdownloader不可用,也可以尝试:

yum install --downloadonly --downloaddir=/root/telnet_rpm telnet telnet-server

这个命令需要系统先安装yum-plugin-downloadonly插件,新版CentOS 7里可能已经内置,具体看提示。两种方式二选一即可,效果相同。

最后把/root/telnet_rpm目录拷到U盘或通过scp传到内网机器,建议整个目录打包传过去,别只拷单个文件:

tar czf telnet_rpm.tar.gz /root/telnet_rpm

3.2 把包搬到内网机器并完成安装

到了内网机器上,先把包解压出来:

mkdir /root/telnet_rpm tar xzf telnet_rpm.tar.gz -C /root/telnet_rpm --strip-components=3

接下来的安装有两种路径。

路径一:直接用rpm安装。

cd /root/telnet_rpm rpm -ivh xinetd*.rpm rpm -ivh telnet*.rpm telnet-server*.rpm

注意安装顺序,先装xinetd再装telnet-server。如果提示依赖缺失,就用rpm -ivh把所有包一起装:

rpm -ivh *.rpm

rpm会自行判断顺序。这里有个坑提醒一下:尽量不要为了省事直接加--nodeps参数,强行跳过依赖检查虽然在当时能装上,但后续服务起不来的时候你都不知道是哪个底层库没到位,排查起来更痛苦。

路径二:搭建本地yum源(推荐)。

如果你预计这台内网机器后续还要装别的软件,强烈建议走这一步:

mv /root/telnet_rpm/*.rpm /opt/local_rpm/ yum install -y createrepo createrepo /opt/local_rpm

然后在/etc/yum.repos.d/目录下新建一个本地源配置文件,比如local.repo,内容如下:

[local] name=Local RPM Repository baseurl=file:///opt/local_rpm enabled=1 gpgcheck=0

清理缓存后就可以直接yum安装了:

yum clean all yum makecache yum install -y telnet telnet-server xinetd

本地yum源最大的优势是依赖关系交给yum处理,你不需要关心先装谁后装谁,而且每多放一个RPM包进去重新执行一次createrepo,yum源就多一个可用的软件。这个习惯帮我在内网环境省下了太多时间。

3.3 配置xinetd并启动telnet服务

安装完成之后,telnet服务端默认是被禁用的,需要改一下xinetd的配置。在CentOS 7中,telnet的xinetd配置文件位于/etc/xinetd.d/telnet。用vim打开它,找到下面这一行:

disable = yes

把它改成:

disable = no

保存退出。然后启动xinetd服务,并设置开机自启:

systemctl restart xinetd systemctl enable xinetd

这里再次强调,telnet服务在CentOS 7里是由xinetd管理的,不是直接systemctl start telnet。很多新手在这一步卡住,执行systemctl start telnet会提示找不到服务,其实并不是你装错了,而是服务托管的架构就是这样的逻辑。

启动后用下面的命令验证服务是否在监听23端口:

ss -tlnp | grep :23

能看到类似这样的输出,就说明telnet服务已经正常监听了:

LISTEN 0 64 0.0.0.0:23 0.0.0.0:* users:(("xinetd",pid=2345,fd=7))

3.4 用telnet做端口测试的日常姿势

服务起来了,除了远程登录用,telnet最常用的场景其实是TCP端口测试。我平时排查网络故障时经常这样用:

telnet 192.168.1.100 3306

如果端口通,屏幕会显示Connected to 192.168.1.100,然后进入一个空白的等待界面,说明TCP三次握手成功。如果端口不通,会卡住一段时间后提示Connection refused或者Connection timed out。

这时候按Ctrl+],然后输入quit`回车退出,就能回到shell。这个小技巧在排查MySQL端口、Redis端口、Web服务端口的时候非常管用,比来回切工具效率高得多。

4. 常见问题与排查技巧实录

4.1 安装时报依赖缺失

离线安装最经典的问题就是"缺依赖"。你在内网机器上执行rpm -ivh *.rpm时报了一堆libxxx.so.2()(64bit) is needed的错。这个问题的本质是:你在联网机器上准备包的时候,--resolve没有把所有的依赖库都拉全,或者目标机器的库版本比预期更老。

排查思路分三步:

  • 看报错信息里到底缺哪个库或哪个包。
  • 回到联网机器上用yum provides "libxxx.so.2"查询这个库由哪个包提供,然后yumdownloader --resolve把对应包补下载。
  • 如果只是单个库文件缺失,可以直接在联网机器上找到这个.so文件拷贝进内网,放到/usr/lib64/目录下(注意架构匹配),然后执行ldconfig刷新缓存。

这里我再推荐一个从rootfs角度检查依赖的方法:

ldd /usr/sbin/telnet-server

它会列出telnet-server依赖的所有共享库,一眼就能看出来缺哪个。这个方法在离线环境排查依赖问题时堪称神器。

4.2 服务启动不了或端口不监听

启动xinetd后ss -tlnp | grep :23没输出,先说结论:八成是配置文件里的disable没改成no。xinetd的机制就是默认禁用不常见服务,安装完后不改配置直接重启,等于没有启动任何东西。

排查顺序如下:

  • 先确认xinetd确实在运行:systemctl status xinetd。
  • 再看telnet的配置文件:grep disable /etc/xinetd.d/telnet,必须是no。
  • 如果配置没错还是不监听,手动执行telnet 127.0.0.1 23看看报什么错。

有一个容易被忽略的地方是,xinetd启动时如果发现配置文件有语法错误,会直接忽略该服务并且不报错,所以改完配置后最好用/usr/sbin/xinetd -t做一次语法检查。我一开始吃了两次这个亏,后来就养成了改完配置先检查语法的习惯。

4.3 连不上但报错信息五花八门

telnet客户端连接不上,常见的报错就那么几种,我用一个表总结一下:

报错信息可能原因解决方向
Connection refused服务没监听,或端口没起来按4.2的方法排查服务状态
Connection timed out防火墙丢弃了请求,或网络层不通检查防火墙规则、路由和物理链路
Unable to connect to remote host: Connection refused目标机器端口被防火墙ACL限制检查firewalld/iptables规则
连接后直接断开用户终端类别不匹配设置终端类型为vt100再登录

这里我特别强调一下防火墙的问题。CentOS 7默认启用了firewalld,即使telnet服务已经在本地监听了23端口,如果不放行防火墙规则,外部机器连过来依然会超时。放行命令:

firewall-cmd --add-port=23/tcp --permanent firewall-cmd --reload

如果是线上服务器,还要检查云平台的安全组策略,有时候服务器本地防火墙没问题,但流量在更外层就被安全组拦住了,这个需要到云控制台去设置。

4.4 防火墙和安全组导致的"装好了却用不了"

我曾经在一台内网服务器上折腾了近半小时,telnet服务监听正常,本地登录正常,但旁边机器就是连不进来。最后排查下来是firewalld默认zone是drop,而且23/tcp没有加入允许列表。

这类问题定位时,我建议直接用两步判断法:第一步,在目标机器本机执行telnet 127.0.0.1 23,能通说明服务没问题;第二步,在执行telnet的客户端机器上执行ping 目标IP确认网络通。如果本机能通、远程不通,那90%是防火墙或安全组拦截了。

用这个思路,先排除服务侧问题,再定位网络层问题,效率会高很多。特别是在内网多跳的环境里,中间路由器的ACL也可能拦端口,这种就找网络组的人配合排查。

5. 安全提醒与同思路扩展

5.1 telnet这条路到底能不能走

回到我一开始提到的场景,telnet服务端这种老协议,在现在的安全体系里确实是被嫌弃的,因为它所有通信内容都是明文传输,账号密码在网络里裸奔,抓包工具一抓一个准。所以在实际生产环境里,我很少真的把telnet-server开着长期运行,更多是用telnet客户端做端口测试,或者在内网测试环境兼职远程登录。

如果你确实需要内网远程登录,我建议还是优先用SSH。离线安装openssh-server的流程和本文思路完全一致,甚至更简单,因为SSH服务是systemd直接管理的,没有xinetd这一层壳。

如果万不得已必须开telnet-server,请至少做到以下几点:

  • 只在隔离的内网环境中使用,不暴露到公网。
  • 用完就关:systemctl stop xinetd。
  • 在xinetd配置里通过only_from限制允许访问的IP范围。
  • 定期检查/var/log/secure里的登录日志。

安全不是某个单一操作能保证的,而是一系列限制叠加出来的。我这边的原则很简单:能用SSH就不用telnet,必须用telnet就限IP、限时间、用完即关。

5.2 同一套离线思路还能装什么

这套离线安装方法论,真的不止能用在一个telnet身上。既然你已经搭好了本地yum源,建议直接把下面这些高频运维工具一股脑下载下来丢进/opt/local_rpm,免得下次再来一回:

yumdownloader --resolve vim lrzsz tree net-tools nc lsof bash-completion
  • vim:最小化系统里没有完整的vim,只有vi。
  • lrzsz:内网环境下上传下载文件的利器,sz/rz命令配合Xshell或FinalShell非常好用。
  • net-tools:提供ifconfig、netstat等老牌命令,很多老脚本依赖它。
  • nc:netcat,另一个端口排查神器,和telnet互补。
  • lsof:查看进程打开了哪些文件、端口被谁占用。

把这些常用的装一遍之后,你会发现内网机器的基础运维能力基本齐了。以后再有新机器进来,把那个/opt/local_rpm目录一拷,createrepo一跑,所有常用工具直接yum装上,连外网都不需要。

我自己的习惯是,每交付一批内网服务器,都会顺手把本地yum源搭好,并把常用工具包一次性放进去。这看起来是一次性的工作量,但后面每次给内网机器装软件,省下的沟通成本、审批成本、等待时间,都远超当时那几个小时的投入。说白了,运维的很多"巧活",本质都是前期把笨功夫下足了,后面才能做到随取随用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询