ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7离线安装telnet完整指南:内网无外网环境实操

CentOS 7离线安装telnet完整指南:内网无外网环境实操 做运维的朋友应该都经历过这种场景机房里的机器没外网或者客户现场要求严格所有服务器都隔离在独立网络里偏偏这时候你需要在机器上排查网络端口通不通、临时调试个设备想用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-utilsyum 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_rpm3.2 把包搬到内网机器并完成安装到了内网机器上先把包解压出来mkdir /root/telnet_rpm tar xzf telnet_rpm.tar.gz -C /root/telnet_rpm --strip-components3接下来的安装有两种路径。路径一直接用rpm安装。cd /root/telnet_rpm rpm -ivh xinetd*.rpm rpm -ivh telnet*.rpm telnet-server*.rpm注意安装顺序先装xinetd再装telnet-server。如果提示依赖缺失就用rpm -ivh把所有包一起装rpm -ivh *.rpmrpm会自行判断顺序。这里有个坑提醒一下尽量不要为了省事直接加--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] nameLocal RPM Repository baseurlfile:///opt/local_rpm enabled1 gpgcheck0清理缓存后就可以直接yum安装了yum clean all yum makecache yum install -y telnet telnet-server xinetd本地yum源最大的优势是依赖关系交给yum处理你不需要关心先装谁后装谁而且每多放一个RPM包进去重新执行一次createrepoyum源就多一个可用的软件。这个习惯帮我在内网环境省下了太多时间。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,pid2345,fd7))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-port23/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-completionvim最小化系统里没有完整的vim只有vi。lrzsz内网环境下上传下载文件的利器sz/rz命令配合Xshell或FinalShell非常好用。net-tools提供ifconfig、netstat等老牌命令很多老脚本依赖它。ncnetcat另一个端口排查神器和telnet互补。lsof查看进程打开了哪些文件、端口被谁占用。把这些常用的装一遍之后你会发现内网机器的基础运维能力基本齐了。以后再有新机器进来把那个/opt/local_rpm目录一拷createrepo一跑所有常用工具直接yum装上连外网都不需要。我自己的习惯是每交付一批内网服务器都会顺手把本地yum源搭好并把常用工具包一次性放进去。这看起来是一次性的工作量但后面每次给内网机器装软件省下的沟通成本、审批成本、等待时间都远超当时那几个小时的投入。说白了运维的很多巧活本质都是前期把笨功夫下足了后面才能做到随取随用。
返回列表