上个季度处理客户机房那台CentOS 7服务器时,我算是把“离线安装”这件事彻底折腾明白了。系统装好之后,需要用telnet去调试一台老式网络交换机,结果发现那是一台完全不连通外网的内网机器,yum源配了等于白配——你连不上任何镜像站,所有软件包都得自己想办法塞进去。也就是从那次之后,我把“linux centos7 离线安装telnet包”这件事的几种可行路径全部捋了一遍,今天把踩过的坑和验证过的方案一起写出来。
先说清楚:这篇文章不是只讲一条命令,而是告诉你离线环境下,安装telnet到底有哪几条路可以走,每条路适合什么场景、会遇到什么坑、怎么排错。无论你面对的是一台完全物理隔离的机器、一个有局域网但没外网的环境,还是十几台机器都要批量装的集群,都能在里面找到对应的方案。
1. 需求从哪来:为什么要在离线的CentOS 7上装telnet
1.1 telnet没死,只是你用得少了
放在2024年的语境下,很多人一听telnet第一反应是“上古时代的协议”。但真到实际生产环境里你会发现,有些场景它绕不开:老型号的网络交换机、路由器、光猫,管理口默认只开telnet;某些内网设备厂商的调试工具至今只支持telnet协议;甚至很多运维老手至今习惯用telnet 192.168.1.10 80这种方式快速探测端口通不通,效果比nc还要直观——能弹出banner就说明端口活着。
而CentOS 7虽然已经进入维护周期尾声,但存量服务器数量依然非常大,尤其在国内的政企、金融、教育行业,大量业务系统还在CentOS 7上跑。这些机器很多部署在隔离网段,没外网权限,连个简单的telnet客户端都装不上,这时候“离线安装telnet包”就是一个非常真实、非常具体的需求。
1.2 “离线”两个字,决定了你的安装路线
离线安装最核心的难点不是软件包本身,而是依赖处理。在线环境下一条yum install -y telnet完事,yum会自动把依赖关系全部理清;离线环境下,yum找不到仓库,所有依赖都得你手动准备好。
所以在动手之前,必须先明确一个问题:你说的“离线”到底是哪种离线?
- 完全物理隔离,机器任何网络都不通:这时候只能用U盘或光盘往机器里拷RPM包,本地rpm命令硬装。
- 有局域网但没有外网:可以在一台机器上挂载CentOS 7 ISO镜像做成局域网源,其他机器通过IP访问。
- 机器数量多、后续还要装其他包:建议直接搭一个局域网镜像仓库,一次配置,长期受益。
这三条路线不是互斥的,我在实际项目里经常是组合使用:先拿RPM包应急把telnet跑起来,再后面抽空把ISO源配好,方便后续装别的软件。
2. 开工前先看清:版本、依赖和离线边界
2.1 一分钟确认系统版本和架构
这一步很多人跳过,但恰恰是离线安装成败的第一关。telnet的RPM包是区分版本和CPU架构的,CentOS 7.5和CentOS 7.9的依赖可能不同,x86_64和aarch64的包更不能混用。
上机器先执行两条命令:
cat /etc/redhat-release uname -m大概率会看到类似结果:
CentOS Linux release 7.9.2009 (Core) x86_64记下这个输出。后面下载RPM包、配置yum源时,都要和这里的版本、架构保持一致。如果你在ARM服务器上硬装x86_64的包,rpm会直接报“wrong architecture”。
2.2 telnet相关包到底有哪些、依赖谁
离线安装telnet,核心涉及两个包:
telnet:客户端,提供telnet命令telnet-server:服务端,提供telnetd服务
很多人只装了客户端就去启动服务,自然找不到telnet.socket。反过来,只装服务端不装客户端,命令行里敲telnet也找不到命令。实际使用中,如果你只是想测端口连通性,装客户端就够了;如果是被调试方(让别的机器连过来),才需要装服务端。
关键点是服务端的依赖。用rpm -qpR可以提前查看一个包依赖哪些东西:
rpm -qpR telnet-server-0.17-64.el7.x86_64.rpm输出里通常会有这些关键依赖:
libc.so.6(GLIBC_2.4)(64bit):glibc运行库,minimal安装自带libpam.so.0()(64bit):PAM认证库,自带libwrap.so.0()(64bit):TCP Wrappers访问控制库,这个最容易缺systemd:系统服务管理,自带
libwrap.so.0对应的软件包是tcp_wrappers-libs。CentOS 7 minimal安装时默认没有这个库,所以直接硬装telnet-server大概率会报“libwrap.so.0 is needed”。这个细节很多教程不会提,但实际踩坑概率极高,后面我会专门展开。
2.3 离线环境的三条路线怎么选
这里用一张表把三条路线说清楚,帮你做决策。
| 方案 | 适用场景 | 依赖解决能力 | 操作复杂度 | 适合机器数量 |
|---|---|---|---|---|
| RPM包硬装 | 完全隔离、紧急单机 | 弱,需手动补依赖 | 低 | 1~2台 |
| ISO本地yum源 | 有局域网,单机或少量机器 | 强,自动解决 | 中 | 1~10台 |
| 局域网HTTP源 | 多台机器批量部署 | 强,自动解决 | 高 | 10台以上 |
我的经验是:能搭源就别硬装。RPM硬装虽然命令简单,但一旦依赖缺失,你需要一个包一个包去网上找,找错了版本又是新的灾难。而本地ISO源一旦配好,后续任何安装都变成yum install xxx一句话的事。
3. 单机最快方案:RPM包直接安装和它的依赖陷阱
3.1 从哪搞到对应版本的RPM包
既然机器离线,你首先得在在线环境把需要的包准备好的。主要有三个渠道:
渠道一:用yumdownloader在联网机器上下载。
在任意一台能联网、CentOS 7系统上执行:
yum install -y yum-utils mkdir -p /root/telnet_rpm yumdownloader --resolve --destdir=/root/telnet_rpm telnet telnet-server--resolve参数会自动把依赖包一起下载下来,这比手动一个个找包靠谱得多。下载完成后,把整个/root/telnet_rpm目录拷到U盘。
渠道二:从CentOS官方镜像站手动下载。
如果你手头没有联网的CentOS 7机器,直接用浏览器打开镜像站目录也行:
http://mirror.centos.org/centos/7/os/x86_64/Packages/在页面里搜索telnet和telnet-server,下载对应x86_64的RPM文件。另外如果缺libwrap,还要在同一个目录下找到tcp_wrappers-libs。
渠道三:从CentOS 7 ISO镜像的Packages目录直接拷贝。
如果你已经有一份CentOS 7的DVD或Everything版ISO,挂载后直接去/mnt/cdrom/Packages/目录下拷贝需要的包,这是最推荐的方式,后面讲ISO源时也会用到。
3.2 安装命令与依赖一次吃透
把RPM包传到离线机器后(建议放同一个目录,比如/root/telnet_rpm),进入该目录执行:
cd /root/telnet_rpm rpm -ivh telnet-*.rpm telnet-server-*.rpm如果运气好,依赖齐全,会看到两个包都安装成功。但更常见的情况是报错:
error: Failed dependencies: libwrap.so.0()(64bit) is needed by telnet-server-0.17-64.el7.x86_64这时候不要慌,把tcp_wrappers-libs也加进安装列表:
rpm -ivh tcp_wrappers-libs-*.rpm telnet-*.rpm telnet-server-*.rpm三个包一起装,rpm能自动处理它们之间的依赖。如果还缺别的库,用同样的方式把对应RPM包找来一并安装。这正是离线硬装的麻烦之处——你必须把依赖链上的每个环节都提前备齐。
安装完成后验证一下:
rpm -qa | grep telnet which telnet能看到telnet和telnet-server两个包都列出,且telnet命令能找到,就说明客户端装好了。
3.3 硬装时最常踩的三个坑
这个方案我实际用下来,有三个高频坑值得专门说一下。
坑一:只装telnet不装telnet-server,然后找不到服务。这属于对软件包结构不熟悉。telnet是客户端,telnet-server才是服务端,两个是独立的RPM包。想被远程连接,必须两个都装。
坑二:libwrap依赖缺失。前面已经强调过,这是最容易被忽略的依赖。有些教程会让你去装xinetd,实际上在CentOS 7里telnet-server默认通过systemd socket方式运行,并不需要xinetd。但libwrap这个库是硬依赖,少它跑不起来。
坑三:用rpm -ivh单个装,遇到依赖就卡住。一次性把所有包放一起装,让rpm自己处理内部依赖,比一个个装省心得多。如果某个包已经有旧版本,用rpm -Uvh替代rpm -ivh做升级安装。
4. 治本方案:用CentOS 7 ISO搭本地yum源
4.1 挂载ISO:光驱和镜像文件两种姿势
如果机器有光驱,直接把CentOS 7安装光盘放进去:
mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdrom如果是ISO镜像文件,需要用loop方式挂载:
mkdir -p /mnt/cdrom mount -o loop /root/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom挂载成功后可以看到/mnt/cdrom/Packages/目录,里面有成百上千个RPM包,这就是一个天然的软件仓库。
这里有个细节:CentOS 7的ISO分为DVD版和Everything版。DVD版包含常用软件包,覆盖telnet完全没问题;Everything版几乎是全量包,适合离线装复杂软件。如果只是装telnet,DVD版就够了。
4.2 写repo配置并替换原有源
挂载ISO之后,需要把它配置成yum源。先把原有的repo文件全部备份移走,避免干扰:
mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/然后新建一个本地仓库配置文件:
vim /etc/yum.repos.d/local.repo写入以下内容:
[local] name=CentOS7-Local baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0更新缓存:
yum clean all yum makecache这里说下gpgcheck=0的原因:CentOS 7 ISO里自带的RPM-GPG-KEY-CentOS-7签名密钥文件在RPM-PUBLIC-KEY里,如果启用gpgcheck需要额外导入密钥:
rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-7但如果只是在内网临时使用,gpgcheck=0更省事。这是我个人的经验:内网环境没有外部攻击面,签名校验的实际意义有限,优先保证功能可用。
4.3 验证yum源和安装结果
配置好之后,可以先用以下命令确认yum识别到了新仓库:
yum repolist看到local仓库且有包数量统计,就说明ISO源生效了。然后直接安装:
yum install -y telnet telnet-server相比RPM硬装,yum会自动把tcp_wrappers-libs等依赖全部装上,不用你操心。这就是本地ISO源最舒服的地方——依赖问题被yum机制彻底接管。
安装完成后,同样验证:
rpm -qa | grep telnet这套方案我建议作为离线安装的默认首选。只要机器有光驱或能读ISO,一次性配置好,后面所有软件都能装。
5. 多人多机场景:局域网HTTP源搭建
5.1 服务器端:从ISO建目录并共享
如果机房里有十几台机器都要装telnet,挨个配本地ISO源效率太低。更聪明的做法是:挑一台机器把ISO内容共享到局域网,其他机器通过HTTP访问这个源。
先在一台能访问外网或有ISO镜像的机器上操作。假设这台机器IP是192.168.1.10,把它作为源服务器。
mkdir -p /var/www/html/centos7 cp -r /mnt/cdrom/* /var/www/html/centos7/CentOS 7 ISO自带了repodata目录,里面就是yum源需要的元数据,所以这里不需要执行createrepo命令。很多人在这里会犯一个错误:自己下载了一堆RPM包散放在目录里,以为把它当成源就行,结果yum报错找不到repodata——那是散包才需要createrepo生成元数据。ISO自带的库已经生成好了。
然后安装并启动HTTP服务:
yum install -y httpd systemctl start httpd systemctl enable httpd用浏览器访问http://192.168.1.10/centos7/,能看到目录列表就说明共享成功。
5.2 客户端配置:一个repo文件搞定
其他需要安装telnet的机器上,把旧repo备份后,新建一个lan源配置文件:
vim /etc/yum.repos.d/lan.repo内容:
[lan] name=CentOS7-LAN baseurl=http://192.168.1.10/centos7 enabled=1 gpgcheck=0然后照旧:
yum clean all yum makecache yum install -y telnet telnet-server这套方案的好处是:所有机器共享同一个源,以后装任何软件包都直接yum install,不需要再单独找包。而且源服务器上还可以继续补充其他离线RPM包(比如内网专用软件),用createrepo更新元数据后,整个局域网都能用。
有一点要提醒:源服务器的HTTP端口是80,如果它自己开了firewalld,记得放行:
firewall-cmd --permanent --add-service=http firewall-cmd --reload6. 安装完不算完:socket启动、防火墙与安全加固
6.1 telnet.socket的正确启动姿势
CentOS 7里,telnet-server装好之后,默认的服务单元是telnet.socket,不是传统的telnetd独立进程。这是systemd的socket激活机制——有连接进来才启动服务,平时不占资源。
启动并设置开机自启:
systemctl start telnet.socket systemctl enable telnet.socket systemctl status telnet.socket然后确认23端口确实在监听:
ss -tlnp | grep :23正常会看到类似:
LISTEN 0 128 *:23 *:*如果这里什么都看不到,先别急着排查防火墙,多半是telnet.socket没启动成功。用journalctl -u telnet.socket看下日志。
放行防火墙端口:
firewall-cmd --permanent --add-port=23/tcp firewall-cmd --reload6.2 常见故障排查手册
以下是我实际调试时遇到过的几类问题,整理成表格方便对照。
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
本机telnet 127.0.0.1报Connection refused | telnet.socket没起来 | systemctl start telnet.socket,检查状态 |
| 局域网机器连接超时 | firewalld没放行23端口 | firewall-cmd --permanent --add-port=23/tcp后reload |
| 连接后提示No route to host | 网络不通或防火墙丢弃 | 检查网段路由、ping连通性 |
| 用户名输完很久才进密码界面 | DNS反向解析慢 | 在/etc/hosts里加上客户端IP和主机名对应关系 |
| root用户登录被拒 | /etc/securetty没有对应终端 | 用普通用户登录后su切换,不建议放开root |
| 端口在监听但外部连不进 | 云安全组/前置防火墙拦截 | 检查所有链路防火墙规则 |
排错的核心思路是:先确认进程,再确认监听,再确认防火墙,最后才怀疑PAM和终端配置。很多人一上来就改配置文件,结果发现是firewalld根本没放行,白折腾。
6.3 临时好用,别当长期方案
telnet最大的硬伤是明文传输,账号密码在网上裸奔。所以即使离线内网环境,我也不建议长期开启telnet服务。正确姿势是这样的:
- 限制来源IP:用firewalld富规则只允许特定网段访问23端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="23" protocol="tcp" accept' firewall-cmd --reload这样即使有人扫描到23端口,也无法直接访问。
不要放开root的telnet登录:保持
/etc/securetty默认状态,root不能直接telnet登录,先用普通用户登录再切换到root。这是默认行为,别为了图省事去改它。用完立即关闭:调试完设备后,立刻停掉服务:
systemctl disable --now telnet.socket这一步很多人会忘记,我在交付文档里会特别标注“telnet为临时调试开放,测试完成后请关闭”。实际上,我每次给客户做完这套操作,都会留一张纸条:telnet已按需求开放,测试完成后请通知我关闭23端口。这个习惯帮我挡掉了至少三次安全审计问题。既然是离线环境,说明安全边界本来就靠流程兜着,收尾做得干不干净,恰恰是运维经验的真正分水岭。
如果你是长期需要远程管理,建议直接上SSH;如果有些设备只支持telnet,那可以在telnet外面套一层stunnel之类的TLS隧道,把明文封装起来。内网环境相对可控,但安全这根弦永远不能松。