ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

从IP到防火墙:FinalShell连接Linux虚拟机失败排查全攻略

从IP到防火墙:FinalShell连接Linux虚拟机失败排查全攻略 开头如果你是个刚接触 Linux 的新手大概率会经历这样一个场景虚拟机里装好了 Ubuntu 或 CentOS终端里敲命令也正常满心欢喜打开 FinalShell 想用图形化界面远程操作一把结果输入完 IP、用户名、密码回车后等来的却是“连接失败”。那一刻的心情基本和“刚买的键盘发现按键失灵”差不多——还没开始干活工具先给你上一课。这篇排错指南就是为这个场景写的。我会沿着一条最典型的排查路径走先从虚拟机里确认 IP 到底是多少再检查宿主机能不能 ping 通然后看 SSH 服务和防火墙有没有捣乱最后把最容易反复踩坑的“动态 IP 漂移”问题用配置固定地址的方式根治掉。整个过程不绕弯子全部基于我在 Debian、Ubuntu、CentOS、Rocky Linux 这些主流发行版上实测过的经验命令可以直接复制配置思路也会讲清楚为什么这么做。适合刚把 Linux 装进虚拟机、正准备用 FinalShell 入门的读者也适合已经连上过但某天突然连不上的朋友当作排查索引来用。1. 排错前的准备工作先搞懂 FinalShell 连接 Linux 的本质1.1 连接链路是怎么工作的很多人一遇到连接失败就慌了其实 FinalShell 连接 Linux 底层走的是 SSH 协议整个链路可以拆成四段FinalShell 发起到虚拟机的网络请求虚拟机的网卡接收数据sshd 服务响应握手最后完成认证建立会话。四段里任何一环出问题表现在界面上都是一个“连接失败”但背后的原因可能天差地别。这就好比你给朋友寄快递地址写错了IP/端口错误快递员送不到网络不通朋友不在家SSH 服务没启动小区保安不让进防火墙拦截。每一段的故障都得用不同的方法去查。所以排查的核心思路是“分段定位”——先确认地址对不对再确认路通不通最后确认门开没开。1.2 动手排查前先确认这几个基本信息在点击 FinalShell 的连接按钮之前先花两分钟把下面这些信息理清楚能省掉后面大量无头苍蝇式的时间Linux 虚拟机当前的 IP 地址以及它是 DHCP 自动获取的还是手动配置的虚拟机的网络模式NAT、桥接、仅主机这个决定了 IP 的分配逻辑你用的发行版和服务管理方式比如 systemd 还是 init.d带不带 NetworkManager系统是否安装了 openssh-serversshd 服务是否在运行且监听着 22 端口这些信息不确认清楚后面所有的判断都是空中楼阁。我在实际帮人排查时发现超过一半的“连接不上”本质上不是 FinalShell 的问题而是虚拟机环境的网络或服务状态出了问题。2. 从检查 IP 开始确认虚拟机到底“住”在哪个地址2.1 在虚拟机里查看 IP 的几种方式打开虚拟机的终端先用这条命令看所有网卡和 IP 信息ip addr重点看eth0、ens33、ens160这类网卡条目你会在inet后面看到类似192.168.80.128/24这样的地址斜杠前面就是你需要的 IPv4 地址。如果你习惯用老朋友ifconfig先装一下 net-toolssudo apt install net-tools # Debian/Ubuntu sudo yum install net-tools # CentOS/Rocky然后直接ifconfig也能看到。注意inet后面如果跟的是127.0.0.1那是回环地址不能用来做远程连接inet6是 IPv6 地址FinalShell 通常也支持但新手阶段建议优先使用 IPv4少踩配置层面的坑。还有一种快速看一眼 IP 的技巧hostname -I这个命令会直接输出所有非回环 IP干净利落适合确认地址用。另外建议顺手看一下默认网关ip route show default这一条能告诉你数据出去的“大门”在哪后面配静态 IP 的时候网关就填这个地址。2.2 拿到 IP 后先做三次测试地址确认之后别急着去 FinalShell 里连接先在终端里做三件小事每一件都能筛掉一批问题第一在虚拟机里 ping 一下宿主机和公网地址确认网络本身是通的ping -c 4 8.8.8.8 ping -c 4 baidu.com如果8.8.8.8通但baidu.com不通是 DNS 问题如果两个都不通说明虚拟机可能压根没联网得回去看虚拟机的网络适配器和网卡配置文件。第二在宿主机Windows的命令行窗口里 ping 虚拟机的 IPping 192.168.80.128这一步极其关键。如果宿主机 ping 不通虚拟机问题基本锁定在虚拟网络配置层面如果 ping 通但 FinalShell 连不上那重点就转向 SSH 服务和端口了。第三在虚拟机上检查 22 端口有没有在监听ss -tlnp | grep 22会看到类似LISTEN 0 128 0.0.0.0:22的输出说明 sshd 正在工作。如果这里没输出说明 SSH 服务没起来后面第 3 节展开讲。2.3 NAT、桥接、仅主机模式下 IP 的规律虚拟机的网络模式直接决定了 IP 长什么样、宿主机能不能通新手在这里理解错了后面怎么配都是白费。常见三种模式NAT 模式下虚拟机从 VMware/VirtualBox 的虚拟 DHCP 拿地址通常和宿主机的 VMnet8 网卡在同一个网段比如宿主机 VMnet8 是192.168.80.1虚拟机可能就是192.168.80.128。虚拟机可以上网宿主机也能访问虚拟机建议新手默认选这个模式。桥接模式直接把虚拟机当成局域网里的一台独立设备它需要和宿主机在同一个物理局域网网段比如路由器分配的都是192.168.1.x桥接虚拟机也在这个网段。好处是局域网内其他机器也能直接访问它坏处是 DHCP 繁忙时 IP 容易变。仅主机模式只在宿主机和虚拟机之间的虚拟网段里通信虚拟机不能访问外网适合纯实验环境。如果你发现虚拟机里的 IP 是169.254.x.x这样的地址说明 DHCP 获取失败网卡和虚拟网络之间沟通有问题常见原因是虚拟机网络适配器没接好或 DHCP 服务异常。3. 从检查 IP 到打通链路SSH 服务与防火墙排查3.1 SSH 服务装没装、起没起FinalShell 走的是 SSH 协议Linux 系统默认不一定装了 SSH 服务端。很多人装系统时选了最小化安装连 openssh-server 都没带结果自然是“怎么都连不上”。检查方法很简单systemctl status sshd # RHEL/CentOS/Rocky 系 systemctl status ssh # Debian/Ubuntu 系如果提示Unit ssh.service could not be found或者状态不是active (running)就先安装再启动。Debian/Ubuntu 系sudo apt update sudo apt install openssh-server sudo systemctl enable --now sshCentOS/Rocky 系sudo yum install openssh-server sudo systemctl enable --now sshd这里有个经验之谈systemctl enable一定要做。如果不设置开机自启虚拟机每次重启后 SSH 服务都不会自动启动FinalShell 会再次连不上而且你还找不着原因。3.2 防火墙拦路最容易被忽略的“门卫”确认 SSH 服务在跑了宿主机也能 ping 通虚拟机但 FinalShell 依然连接超时这时候十有八九是防火墙把 22 端口挡了。Debian/Ubuntu 常见的是 ufwsudo ufw status sudo ufw allow 22/tcp sudo ufw enableCentOS/Rocky 常见的是 firewalldsudo systemctl status firewalld sudo firewall-cmd --permanent --add-port22/tcp sudo firewall-cmd --reload有朋友会问“我从来没用过防火墙怎么也会拦”。这就是误区——很多发行版的防火墙是默认开启的你以为没人拦其实门卫一直在岗。还有更隐蔽的情况云服务商/虚拟机平台的安全组规则这个在纯本地虚拟机里不存在但如果你以后用云主机一定要记得控制台的安全组也放行一下 22 端口。判断是不是防火墙问题是这样的ping 能通telnet 192.168.80.128 22或nc -zv 192.168.80.128 22却连不上基本就是端口层面的拦截。3.3 FinalShell 侧的连接参数填写排查到服务端都正常还得回头看看 FinalShell 这边填的参数对不对。常见坑有四个第一主机地址填了主机名而不是 IP或者 IP 末尾多了空格第二端口填成了别的数字SSH 默认是 22第三用户名写错了注意 Linux 是区分大小写的root和Root是两个用户第四密码里面带着特殊字符粘贴时被自动修正成半角或全角字符。我个人习惯是第一次连接时勾选“保存密码”但确认前先点“测试连接”验证一遍。FinalShell 的测试连接结果很快连接成功就能直接进连接失败也会给一个错误提示这个提示对定位问题很有价值。比如Connection refused通常表示 22 端口没监听或服务没起来No route to host通常表示网络不可达Connection timed out则需要同时考虑防火墙和路由两个方向。4. 根治之策为什么不建议长期依赖动态 IP4.1 DHCP 带来的“薛定谔的连接”很多新手会遇到一个诡异现象昨天 FinalShell 还好好的今天开机突然连不上但虚拟机里打开终端一切正常。查了一圈发现虚拟机的 IP 从192.168.80.128变成了192.168.80.131。原因很简单DHCP 分配的地址是有租约时间的虚拟机重启、虚拟网络重启、宿主机休眠唤醒都可能触发重新分配。这时你打开 FinalShell里面的主机地址还是老 IP自然是竹篮打水。对于用虚拟机做学习、跑服务的人来说这种“连接对象突然变地址”的体验非常影响效率。你想每次重启虚拟机都要先进终端敲ip addr看一眼新 IP再回 FinalShell 改地址来回折腾几次就烦了。4.2 固定 IP 的三大收益把虚拟机地址固定下来主要能带来三方面的实际好处第一连接的确定性。FinalShell 会话里配置一次 IP之后永远用同一个地址不需要反复确认和修改。第二服务运行的稳定性。如果你在虚拟机里跑着 Nginx、MySQL、Redis 这类服务其他人或其他程序要访问它固定 IP 才能让调用关系长期有效动态 IP 换了地址服务就断连。第三排错成本的降低。固定 IP 之后如果连不上你可以直接用“IP 对不上”之外的原因去排查问题范围一下子缩小了。这就是配置固定地址的核心价值——不是把简单事情复杂化而是去除环境里最大的不确定因素。你可以把 DHCP 理解为“临时工”固定 IP 是“正式工”临时工干一天换一个地方正式工一直待在同一个工位你找人、找人办事都方便。4.3 固定地址 vs 手动配置两个概念先分清楚有人会把“固定地址”和“手动配置静态 IP”等同起来其实不完全一样。固定地址可以理解为“让 DHCP 每次都分配同一个 IP 给这台机器”典型做法是在路由器或虚拟机管理平台上做 DHCP 静态绑定DHCP reservation而手动配置静态 IP 是在系统层面直接放弃 DHCP网卡配置里写死地址、网关、DNS。对虚拟机学习场景来说我更推荐后者也就是直接在虚拟机内部配置静态 IP。原因是虚拟机平台的 DHCP 保留配置操作路径不同文档分散新手容易找不到入口而在系统里直接改网卡配置反而更直观而且这些知识在以后用真实服务器、云主机时依然适用属于通用技能。下面两个小节分别讲 Debian/Ubuntu 系和 CentOS/Rocky 系的配置方法。5. 实操在主流发行版里把 IP 配置成固定的5.1 Debian/Ubuntu 系netplan 方案Ubuntu 从 18.04 开始用 netplan 管理网络配置文件放在/etc/netplan/目录下常见文件名是01-netcfg.yaml或50-cloud-init.yaml。先看网卡名称然后编辑对应文件ip addr # 记下你的网卡名比如 ens33 sudo nano /etc/netplan/01-netcfg.yaml把内容改成类似这样network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.80.128/24 routes: - to: default via: 192.168.80.2 nameservers: addresses: - 192.168.80.2 - 223.5.5.5这里有几个关键点解释一下。地址后面的/24是子网掩码的 CIDR 写法对应255.255.255.0意思是这台机器处于192.168.80.x这个网段。网关192.168.80.2从哪里来就是前面ip route show default查到的地址在 NAT 模式下网关一般是 VMware 分配的虚拟网关比如192.168.80.2或192.168.80.1以你实际查到的为准。DNS 我习惯把网关和公共 DNS 都写上互相兜底。改完后不是马上生效要先用这个命令检查配置语法sudo netplan trynetplan try是个很有人情味的命令它会先应用配置并等 120 秒期间如果你按回车配置就生效如果连接断了或者配置有问题它会自动回滚避免你把自己锁在门外。确认无问题后再正式应用sudo netplan apply ip addr看到网卡上已经是固定 IP就说明配置成功了。5.2 CentOS/Rocky 系nmcli 方案CentOS 8 和 Rocky Linux 默认用 NetworkManager 管理网络最省事的方式是用nmcli命令配置不用手动编辑文件。先用nmcli con show查看当前连接名称nmcli con show通常你会看到类似ens33或System ens33这样的连接名。然后执行sudo nmcli con mod ens33 ipv4.addresses 192.168.80.128/24 sudo nmcli con mod ens33 ipv4.gateway 192.168.80.2 sudo nmcli con mod ens33 ipv4.dns 192.168.80.2 223.5.5.5 sudo nmcli con mod ens33 ipv4.method manual sudo nmcli con up ens33最后一条up是让配置立即生效。验证方法同样是ip addr。如果你面对的是不用 NetworkManager 的老系统或最小化环境也可以直接改/etc/sysconfig/network-scripts/ifcfg-ens33这个文件核心配置项是BOOTPROTOstatic IPADDR192.168.80.128 NETMASK255.255.255.0 GATEWAY192.168.80.2 DNS1192.168.80.2 DNS2223.5.5.5改完重启网络服务sudo systemctl restart network注意如果你用的网卡名是ens160或eth0对应的配置文件名也要同步改别生搬硬套。5.3 配置静态 IP 后FinalShell 的最终验证静态 IP 配置完成重启一下虚拟机这一步能验证配置是否扛得住开机自启场景sudo reboot等机器起来先确认 IP 没有变回动态获取的地址ip addr | grep inet然后回到 FinalShell把会话里的主机地址改成你设置的固定 IP用户名密码填好点击连接。如果顺利进到了终端界面说明整条链路已经打通。有个小技巧连接成功后在 FinalShell 里执行一下ip addr对比本机 IP确保 FinalShell 显示的会话信息和服务端一致以后排查会话配置时心里有底。5.4 静态 IP 配好后反而上不了网多半是网关或 DNS 的问题配置静态 IP 后很多朋友会遇到一个新问题FinalShell 倒是连上了但虚拟机里ping baidu.com不通了。这里面的坑通常是两个。第一个是网关填错。你必须保证网关地址就是当前网络里的真实网关不是随便填的。我用 NAT 模式时网关是 VMware 虚拟网络编辑器里看到的那个地址比如192.168.80.2桥接模式则要填路由器地址比如192.168.1.1。填错了数据包就出不了门。第二个是 DNS 配置缺失或错误。ping 8.8.8.8能通但ping baidu.com不通就是 DNS 解析的问题。解决办法是确认/etc/resolv.conf里有有效 DNS或者重新配置 nameserver。很多发行版的 DNS 配置现在由 systemd-resolved 或 NetworkManager 统一接管改了/etc/resolv.conf很快会被覆盖所以最稳妥的做法是回到 netplan 或 nmcli 的配置里把 DNS 加上。我在 Ubuntu 上测试过配置里同时写网关IP和223.5.5.5解析速度稳定不会出现“时通时不通”的情况。6. 常见问题速查FinalShell 连接失败的原因与对应解法把之前踩过的坑和你可能会遇到的典型问题整理成一张速查表连接失败时先对照着看能省不少时间现象可能原因快速排查命令/操作解决方案提示 Connection refusedSSH 服务未启动或未安装systemctl status sshd/ss -tlnp | grep 22安装并启动 openssh-server设置开机自启提示 No route to host网络不可达IP 网段错误ip addr、宿主机ping 虚拟机IP确认虚拟机和宿主机在同一网段或 NAT 模式可达提示 Connection timed out防火墙拦截 22 端口sudo ufw status/firewall-cmd --list-all放行 22/tcp 后重试提示 Authentication failed用户名或密码错误虚拟机里whoami确认用户核对用户名大小写和密码能 ping 通但连接失败SSH 端口不是 22ss -tlnp | grep ssh修改 FinalShell 端口为实际监听端口之前能连重启后失败动态 IP 已变化ip addr对比 FinalShell 里的地址配置固定 IPsshd 状态正常仍失败SELinux 策略限制sudo getenforce临时用setenforce 0测试长期建议放行对应端口策略虚拟机里无法上网网关或 DNS 配置错误ip route、cat /etc/resolv.conf修正默认网关和 DNS 地址6.1 典型场景还原FinalShell 一直转圈后报“连接超时”这是我见过最多的场景FinalShell 的进度条转个不停最后弹出一个连接超时的窗口。按照我的经验这种问题 70% 是 IP 网段对不上20% 是防火墙10% 是服务没起来。一次真实的排查过程是这样的用户虚拟机用的 NAT 模式虚拟机里ip addr显示192.168.80.130但是宿主机 ping 不通这个地址。我在 Windows 上执行ipconfig发现宿主机 VMnet8 网卡的地址是192.168.137.1两个网段压根不在同一个世界。这种情况通常是 VMware 的虚拟网络编辑器里 NAT 网段被改过或者多块虚拟网卡冲突。解决办法是在“虚拟网络编辑器”里把 VMnet8 的网段改回192.168.80.0或者反过来把虚拟机的静态 IP 改成192.168.137.x总之要让它们对齐。6.2 一些值得再说的细节和避坑经验有几个结论是我反复验证过的写出来让大家少走弯路第一安装 Linux 时如果向导里选了“最小化安装”或“Server with GUI”之外的默认配置一定记得在安装过程中勾选 “OpenSSH Server” 组件这是最省事的做法省得后面再补装。第二FinalShell 里保存了多条会话记录时注意区分哪条对应哪台虚拟机。我见过有人连着 A 虚拟机失败实际上 FinalShell 里打开的是 B 虚拟机的会话。建议给每个会话取一个带系统名称或 IP 后缀的标题比如Ubuntu-192.168.80.128。第三如果测试阶段改动频繁比如反复切换 NAT/桥接模式虚拟机的 DHCP 地址可能会积压一堆旧租约导致分配出冲突 IP。怎么识别 IP 冲突虚拟机里ping宿主机的 IP 和网关都通但外部访问时好时坏大概率是地址冲突。我建议把宿主机虚拟网卡和虚拟机之间做好规划虚拟机固定 IP 后冲突概率大幅下降。第四sudo权限问题如果 FinalShell 里登录的是普通用户某些操作会提示权限不足。这时候不用纠结直接用sudo -i切换到 root 再操作但前提是你知道 root 的认证方式。有些系统默认禁用 root 远程登录需要在/etc/ssh/sshd_config里把PermitRootLogin设置为 yes 并重启 sshd但这个操作只建议在可控的虚拟机环境里做真实服务器上别轻易开。7. 从“连不上”到“连得稳”固定 IP 只是开始7.1 把连接信息存好FinalShell 的会话管理技巧配置好固定 IP 之后Connection 问题解决了但真正提升日常效率的是把 FinalShell 的会话管理用好。新建会话时除了主机地址、用户名、密码我建议在“备注”里写上系统版本、SSH 端口、用途说明比如“Ubuntu 22.04 - 测试 Nginx 环境 - 22”。这样当机器变多之后你打开 FinalShell 看到的是井井有条的清单而不是一串分不清谁是谁的 IP。另外FinalShell 支持导入导出会话配置。如果你有多台电脑或者想把自己的环境分享给同事可以在会话列表右键导出新机器上再导入省去重复输入的功夫。这个功能大多数新手不知道但很实用。7.2 后续还能做哪些进阶动作固定 IP 之后整个远程工作流其实还可以继续优化几个方向供参考配置 SSH 密钥登录彻底告别密码输入和密码泄露风险。先生成密钥对然后把公钥追加到虚拟机的~/.ssh/authorized_keys里FinalShell 里也能指定私钥文件连接体验更快更安全。修改 SSH 默认端口。虽然不是必须的但在自己实验环境里改成比如 2222 端口一方面能减少大量扫描另一方面也能测试你对“非默认端口”的排错能力。给虚拟机做快照。在你“折腾”网络配置、安装服务之前先在虚拟机管理平台打一个快照万一改坏了网卡配置恢复快照比一次次排查快上百倍。这些进阶操作都是建立在一个稳定的连接基础之上的所以当你的“FinalShell 连不上”问题已经彻底解决完全可以沿着这个路径继续往深了走学到的技能可以直接迁移到真实服务器和云主机上。关于“连接不上”这件事我的看法是它既是新手必经的拦路虎也是一个帮助你理解 Linux 网络模型的绝佳机会。你每排查完一个环节对 IP、网络模式、SSH 服务、防火墙的理解就会深一层。回头看那些让你抓耳挠腮的报错都变成了最扎实的实战经验。下次再遇到类似问题你应该能比身边没踩过坑的人更快定位出问题所在这就是排错能力带来的底气。
返回列表