Linux虚拟机telnet连接失败排查:安装配置到防火墙与root登录全指南

Linux虚拟机telnet连接失败排查:安装配置到防火墙与root登录全指南 简介这是一份面向Linux入门用户及虚拟化实验者的PDF参考文档专门解决在VMware虚拟机环境下通过telnet从Windows主机远程登录Linux的配置难题。文档以Red Hat Linux 9为例首先引导读者检查telnet与telnet-server是否安装并给出从安装盘获取rpm包、用rpm -ivh安装的具体命令随后说明通过ntsysv勾选或在/etc/xinetd.d/telnet中将disable改为no来启动服务再用telnet localhost验证是否成功。网络部分重点比较三种虚拟机连接方式host-only需将vmnet1设为共享并让虚拟机IP同网段bridge需与主机真实IP同网段并设置网关和DNSNAT则无需配置IP并提供ping测试方法。此外文档还补充了修改防火墙iptables规则放行23端口、注释/etc/pam.d/login中的securetty行以允许root登录以及使用SSH Secure Shell Client进行远程操作和文件传输的做法覆盖telnet与SSH两种远程访问方式。整份资源仅1个PDF文件大小34KB紧凑实用目前已有149人学习适合需要快速搭建远程实验环境、复习telnet配置的读者参考。1. 虚拟机里的 Linux 为什么 Telnet 连不上先看三件套在用 VMWare 装好 Linux 之后十个人里至少有八个会在“怎么连进去”这一步卡住。telnet 是大多数教程的第一选择实际连的时候却最容易翻车服务到底装没装、防火墙放不放行、虚拟机的网段和主机通不通三件事只要有一件没对上终端里只会给你一串含义模糊的报错。更麻烦的是网上能找到的笔记大多是从 Red Hat 9 时代传下来的rpm 包名、xinetd 配置都和 CentOS 5 以后的体系对不上。这篇文章就把从检查、安装、配置、网络选型到排错的全链路讲清楚并且专门拆解 root 无法登录这个最容易踩的坑。无论你手头是老掉牙的 Red Hat 9 还是 CentOS 5看完都能照着做完而不是对着网上的命令片段干瞪眼。2. 从 RPM 到 xinetdtelnet-server 的安装与启动2.1 先分清 telnet-client 和 telnet-server开机第一件事不是急着敲命令而是先确认缺什么。telnet 分两个包telnet是客户端telnet-server是服务端。很多教程只跟你说了rpm -q telnet如果返回了版本号就误以为服务端也装好了实际上默认安装里只有客户端服务端几乎总要单独装。# 查看本机是否已经装有 telnet 相关包 rpm -qa | grep telnet执行结果分三种可能只出现telnet-0.17-39.el5说明只有客户端服务端没装这是最常见的情况。同时出现telnet和telnet-server服务端早就装好了直接跳去改配置。什么都没有那客户端和服务端都得装多数时候需要先装客户端因为后面排错要用到telnet localhost这个命令。这里有一个很多人忽略的前提telnet-server不是独立服务它挂在 xinetd 下面。也就是说要先有 xinetd 这个超级守护进程再放置 telnet 服务。CentOS 5 默认没有安装 xinetd这就是后文要先装 xinetd 再装 telnet-server 的原因。2.2 从本地光盘安装 telnet-server如果机器不能访问 yum 源找安装盘是最稳的方案。以 CentOS 5.5 i386 DVD 为例挂载、查找、安装三步可以连续完成# 建立挂载点并挂载 DVD mount /dev/cdrom /mnt/cdr # 进入软件包目录 cd /mnt/cdr/CentOS # 查找 telnet-server 的完整包名 find . -name telnet-server* # 安装 xinetd注意它的依赖要先解决 rpm -ivh xinetd-2.3.14-10.el5.i386.rpm # 再安装 telnet-server rpm -ivh telnet-server-0.17-39.el5.i386.rpm这里要说明两点第一不同版本光盘目录结构不一样RH9 的包在安装盘 3CentOS 5 的包在/mnt/cdr/CentOS下面如果find没输出用ls /mnt/cdr | head先看看顶层结构第二telnet-server 的 RPM 只解决文件放置安装完成之后/etc/xinetd.d/telnet这个配置文件才会出现此前即使你手动创建同名文件xinetd 也不会正常将它加载。下表总结了两个版本的差异方便你判断正在操作的老系统到底是哪种操作项Red Hat Linux 9CentOS 5.x / RHEL 5.xxinetd 是否默认存在存在不默认安装telnet-server 包名telnet-server-0.17-25.i386.rpmtelnet-server-0.17-39.el5.i386.rpm挂载命令mount /dev/cdrom /mnt/cdr同上包所在目录安装盘 3/mnt/cdr/CentOS安装后配置文件/etc/xinetd.d/telnet同上2.3 改配置把 disable 从 yes 改成 no安装完包之后telnet 默认是禁用的。配置文件里的disable yes这一行就是开关。用 vim 打开文件vi /etc/xinetd.d/telnet典型的内容如下service telnet { flags REUSE socket_type stream wait no user root server /usr/sbin/in.telnetd log_on_failure USERID disable yes }把最后一行改成disable no然后保存退出。这里要注意的是socket_type stream和wait no它们表示 telnet 是流式 TCP 服务每个连接都会 fork 出独立的 in.telnetd 进程这两个参数不用动很多人手痒改成wait yes反而让连接全部挂起。改完之后要重启 xinetd 才会加载新配置service xinetd restart如果配置文件里没有disable这一行那也是正常的旧版本默认就是启用直接重启 xinetd 即可。2.4 验证服务是否真的起来了验证分两步第一步看端口第二步做本地回环测试。# 确认 23 端口正在监听 netstat -tunlp | grep 23 # 本地回环测试 telnet localhost第一条命令如果只看到tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN说明 telnetd 已经正常挂到 xinetd 下。第二条命令telnet localhost会出现Escape character is ^]然后提示输入用户名密码说明服务本身没有问题剩下的问题全在网络路径和防火墙层面。如果netstat看不到 23 端口请立刻执行rpm -qa | grep telnet-server确认 RPM 是否真的装上。我踩过的坑是包名写错把 telnet-server-0.17-39.el5 写成了 telnet-server-0.17-39rpm 会报错找不到包但如果你用通配符去匹配它可能会装错版本最后 xinetd 根本读不到 telnet 的配置。3. 桥接、NAT、host-only虚拟机网络选型与连通性排查3.1 host-only最容易踩的还不是网段而是共享设置host-only 模式的初衷是建立一个封闭的虚拟网络只有主机和虚拟机组成虚拟机不能直接访问外网。但很多网上的笔记把 host-only 给玩歪了把主机真实网卡设置成 Internet 连接共享指向 VMnet1然后虚拟机通过这个共享上网。具体操作是这样的先在 VMware 里把虚拟机网卡选成 host-only然后在主机的“网络连接”里找到 VMnet1 对应的网卡在属性里选择“共享”并把共享指向 VMnet1。之后把虚拟机的 IP 设成和 VMnet1 同一个网段比如 VMnet1 是 192.168.0.1虚拟机设成 192.168.0.100掩码 255.255.255.0。# 在 Linux 虚拟机里配置静态 IP vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICEeth0 BOOTPROTOstatic IPADDR192.168.0.100 NETMASK255.255.255.0 GATEWAY192.168.0.1 ONBOOTyes# 重启网络服务使配置生效 service network restartifcfg-eth0的字段含义很直接BOOTPROTOstatic表示不使用 DHCPGATEWAY指向 VMnet1 的地址这样虚拟机访问外网时才会把包交到主机的共享网卡上。这个模式下测试连通性也很简单在主机命令行直接ping 192.168.0.100通了就说明二层和三层都没问题。要注意的是Windows 的“共享”会强行把 VMnet1 改成 192.168.0.1如果你手动改回别的地址共享功能可能会自动失效。3.2 bridge 模式设置最简单但也要注意 DNSbridge 模式把虚拟机的虚拟网卡当作主机同一局域网里的另一台设备。这意味着虚拟机要和主机处在同一个 IP 网段网关、DNS 基本和主机保持一致即可。以主机 IP 192.168.1.18、虚拟机 IP 192.168.1.252 为例vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICEeth0 BOOTPROTOstatic IPADDR192.168.1.252 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS1192.168.1.1 ONBOOTyes设置完执行service network restart。这个模式最大优势是方向性明确主机能直接访问虚拟机虚拟机也能直接访问主机不需要任何额外的网络共享或端口映射。但你要注意 DNS 设置。如果你的 DNS 只写了 192.168.1.1 而这个设备并没有提供 DNS 服务那么telnet localhost没问题ping baidu.com却会失败。我这里把 DNS 和网关都指向 192.168.1.1是因为它通常是家用路由器既做网关也做 DNS 转发。如果主机用的固定 DNS 是 114.114.114.114那直接把DNS1改成那个地址即可telnet 走的是 IP不受 DNS 解析影响可一旦你后续要配置 yum 源或者远程仓库DNS 错误会成为新的瓶颈。3.3 NAT 模式虚拟机上网好使主机回连要端口转发NAT 模式下虚拟机通过 VMware 的 NAT 服务访问外网虚拟机的地址通常是一个独立的私有网段比如 192.168.152.x。这个模式适合虚拟机要上网但主机并不需要随时主动连虚拟机的场景。如果反过来你想从主机 telnet 到虚拟机光有 IP 还不够因为主机的包根本不知道如何路由到 192.168.152.x 这个网段。VMware 的 NAT 是带地址转换的所以解决办法是在虚拟网络编辑器里做端口转发。打开 VMware 菜单的“编辑” - “虚拟网络编辑器”选中 VMnet8点击“NAT 设置”添加一条映射主机端口2323虚拟机 IP192.168.152.128虚拟机端口23这样主机上用telnet 127.0.0.1 2323就会被 VMware 的 NAT 服务转发到虚拟机的 23 端口。这个做法的代价是每次虚拟机换 IP 都要重新编辑映射适合临时测试不适合长期使用。如果你是想长期远程管理虚拟机还是直接切到 bridge 或 host-only 更省心。3.4 在主机上用 ping 和 telnet 做一次连通性检查不管用哪种模式配置完之后都要做一个两个方向的检查# 在主机上 ping 虚拟机 IP ping 192.168.1.252 # 在主机上直接 telnet 虚拟机 23 端口 telnet 192.168.1.252这里要特别说明一个容易被忽略的细节ping通了不代表telnet一定能通。ping 用的是 ICMP 协议走的是网络层链路telnet 用的是 TCP 23 端口走的是传输层端口。中间的防火墙可能只放行了 ICMP却拦截了 TCP 23。换句话说ping 是用来判断“路通不通”telnet 是用来判断“门开不开”两者各查一层不能互相替代。4. iptables 与 PAM放行 23 端口并处理 root 登录限制4.1 给 23 端口写一条持久化规则CentOS 默认的防火墙规则很严只放行 SSH 等服务。telnet 的 23 端口不在放行列表里从外面连上来就会被丢弃。很多时候你看日志看不出异常因为 iptables 的 DROP 策略是静默丢包在客户端表现出来的就是telnet: connect to address 192.168.1.252: No route to host。正确做法是往 iptables 里加一条明确允许 TCP/UDP 23 端口的规则然后保存iptables -I INPUT -p tcp --dport 23 -j ACCEPT iptables -I INPUT -p udp --dport 23 -j ACCEPT service iptables save service iptables restart-I INPUT是把规则插到 INPUT 链最前面确保不会被后面的默认拒绝规则挡住。--dport 23指目标端口-j ACCEPT表示放行。service iptables save会把当前规则写到/etc/sysconfig/iptables重启之后依然生效。不要直接用service iptables stop来试。那种做法只是临时关闭防火墙机器一重启规则就全回来了而且生产环境里裸奔防火墙风险太大。正确的思路是让防火墙放行 23 端口而不是把整个防火墙关掉。保存规则之后可以执行iptables -L -n --line-numbers检查一下如果看到1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23这样的记录说明规则已经就位。4.2 /etc/hosts 与 hosts.deny 两个文件带来的隐性拦截还有一个很隐蔽的坑它和防火墙无关却经常导致 telnet 连接建立后立刻被断开。现象是连接成功后出现getnameinfo: localhost: Success Temporary failure in name resolution: Illegal seek Connection closed by foreign host.这个报错的意思很明确telnet 服务端尝试把客户端的 IP 反解析成主机名结果解析失败xinetd 直接就把连接关了。解决办法是在虚拟机的/etc/hosts里加上本机和客户端的映射127.0.0.1 localhost localhost.localdomain 192.168.1.18 host-win7 192.168.1.252 linux-server格式是“IP 逗号 主机名”。加上之后xinetd 做反解析时就不会再失败。这里要注意主机名不要带特殊字符不要用下划线开头否则部分版本的解析器会拒绝。除此之外还有/etc/hosts.allow和/etc/hosts.deny两个文件。如果这两个文件里有什么奇怪的规则比如写了ALL: ALL那不管 iptables 放不放行xinetd 层面直接把连接拒掉。检查方法是看这两个文件是否存在以及里面是否包含和 telnet 相关的条目cat /etc/hosts.allow cat /etc/hosts.deny通常默认情况这两个文件都存在但内容为空不影响访问。一旦发现hosts.deny里有in.telnetd: ALL之类的行注释掉再重启 xinetd 即可。4.3 root 登录限制的真正机制PAM 与 securettytelnet 默认不允许 root 登录这是让很多人困惑的点用户名密码都对却提示Login incorrect。机制是这样的telnet 服务端在用户认证时会调用 PAMPAM 会读取/etc/pam.d/login这个文件。文件里有一行auth required pam_securetty.so这个模块的作用是检查用户是否从/etc/securetty里列出的终端登录。telnet 创建的终端是pts/0这种伪终端不在/etc/securetty的允许列表里所以 root 的请求直接被 PAM 拒绝。解决办法有两种# 方法一注释掉 pam_securetty 模块 vi /etc/pam.d/login # 在下面这一行前面加 # # auth required pam_securetty.so # 方法二直接改名让模块找不到配置文件 mv /etc/securetty /etc/securetty.bak方法一更精准只关掉 root 登录 telnet 的限制不影响其他认证流程。方法二比较粗暴因为/etc/securetty不存在时PAM 默认就认为所有终端都合法这等于把安全边界直接拆掉。我的建议是即使能放行 root也不要用 root 去 telnet。telnet 的密码是明文传输的在同一个虚拟网络里抓包就能看到密码。正常做法是新建一个普通用户登录登录后用su - root切换这样既不影响日常操作又不会把 root 密码暴露在网络上。如果你只是临时调试放行 root 之后记得改回来注释掉的那行重新取消注释或者把.bak文件改回来。5. 连不上的时候别乱试先做一次端到端验证5.1 按三层顺序执行测试出了问题不要到处乱敲命令按下面的顺序一层层查每次只做一件事很快就能定位# 第一步确认服务端本地能连 telnet localhost # 第二步确认 23 端口在监听 netstat -tunlp | grep 23 # 第三步确认防火墙规则 iptables -L -n --line-numbers | grep 23 # 第四步确认 hosts 和 hosts.allow/deny cat /etc/hosts cat /etc/hosts.allow cat /etc/hosts.deny # 第五步从主机连虚拟机 telnet 192.168.1.252这五步每一步都对应一个独立层级。第一步失败说明服务端没起来第二步看不到端口说明 xinetd 没加载配置第三步没有规则说明防火墙在丢包第四步有异常内容说明是反解析或者访问控制的问题前四步都过了第五步还是失败那就要回到网卡配置去检查 VMnet1、VMnet8 或者 bridge 的对应关系。5.2 常见报错与处理对照下面这张表是我把各版本系统上最常见的报错汇总起来的你可以直接对号入座报错信息定位原因处理动作telnet: connect to address ...: No route to host路由不可达或防火墙 DROPping 检查网络iptables 放行 23 端口Connection refused目标主机的 23 端口未监听检查 xinetd 是否启动配置是否disable noTemporary failure in name resolutionxinetd 反解析失败把主机和虚拟机 IP 写入/etc/hostsLogin incorrect输入 root 时PAM 的 securetty 限制注释 pam_securetty 或使用普通用户登录Access denied: TelnetClients group连接 Windows 的 telnet 服务把用户加入 TelnetClients 组或 Administrators 组最后提醒一句telnet 这个协议天生是明文传输的会话里的每一次敲击、每一个密码都会以明文形式出现在网络上。把它当成虚拟机局域网里调试老旧系统的工具可以如果要远程管理生产环境的 Linux还是应该把同样的排查思路复用到 SSH 上把 23 端口换成 22把 PAM 的注释恢复回来剩下的检查顺序几乎一模一样。本文还有配套的精品资源点击获取