虚拟机SSH连接失败,绝大多数情况下不是系统坏了,而是网络模式选错、IP地址没对上或SSH服务压根没启动,先从这三个方向排查,按本文步骤走,十分钟内基本能定位问题。
虚拟机SSH连接失败第一步:先确认网络连通性
SSH连不上,第一反应别急着改配置,先弄清楚一个核心问题:你的宿主机能不能“看到”虚拟机,多数情况下,这一步能筛掉一大半故障。
检查虚拟机IP地址是否正常获取
在虚拟机终端里执行:
ip addr show
- 如果看到
eth0或ens33接口下有inet 192.168.x.x这类地址,说明IP正常 - 如果只有
0.0.1(loopback地址),说明网卡没拿到IP,需要检查虚拟机的网卡连接状态 - 执行
ping 192.168.1.1(网关地址),不通的话就是网络模式或网卡配置有问题
很多人在VMware里装完CentOS或Ubuntu后,虚拟机一直显示“有线网络未连接”,这通常是因为虚拟机网络适配器没勾选“已连接”选项,打开虚拟机设置,找到网卡适配器,确保两个勾选框都打上。
宿主机与虚拟机互相ping通测试
ip addr查到的IP,先在宿主机上ping一下:
ping 192.168.x.x
- 能通:说明网络栈没问题,问题在SSH服务或防火墙
- 不通:说明物理链路不通,虚拟机连不上宿主机,排查重点放到网络适配器模式和VMware网络设置上
有个小技巧:如果虚拟机内可以ping 8.8.8.8(外网通)但宿主机ping不通虚拟机,十有八九是NAT模式下的网络段冲突或Windows防火墙拦截了宿主机入站请求。
排查SSH服务是否在虚拟机内部正常运行
网络通了还连不上,就要看虚拟机内部的SSH服务状态了,业内专家指出,超过一半的SSH连接失败案例,问题都出在sshd服务没启动或没装好。
检查sshd服务运行状态
在虚拟机里执行:
systemctl status sshd
- 显示
Active: active (running),服务正常 - 显示
inactive或failed,需要启动:systemctl start sshd - 提示
Unit sshd.service could not be found,说明压根没安装,执行安装命令:
# CentOS/RHEL系 yum install -y openssh-server # Ubuntu/Debian系 apt install -y openssh-server
安装完后再启动并设置开机自启:
systemctl enable --now sshd
SSH配置文件里改了端口更要小心
如果你之前改过

/etc/ssh/sshd_config里的Port字段,连接时就别再用默认22端口了,很多朋友改了端口后忘记防火墙放行新端口,一样连不上,检查SSH配置是否有效:
sshd -t
这条命令能验证配置文件语法,报错信息会直接告诉你哪一行有问题,常见问题是PermitRootLogin no(禁止root登录)和PasswordAuthentication no(禁止密码登录),这两个设置项在任何云服务器或虚拟机上都会坑到一批人。
改完配置必须重启服务才能生效:
systemctl restart sshd
防火墙与安全组拦截SSH端口的处理办法
网络通、服务也在跑,依然连不上,那就是流量在防火墙层面被拒了,虚拟机防火墙、宿主机防火墙、甚至VMware自身的端口映射,都可能成为拦路虎。
检查虚拟机内部防火墙规则
Linux虚拟机内执行:
# CentOS7+ 使用firewalld firewall-cmd --list-all # Ubuntu使用ufw ufw status
看输出里有没有放行22端口(或自定义的SSH端口),没有就添加:
# firewalld firewall-cmd --permanent --add-port=22/tcp firewall-cmd --reload # ufw ufw allow 22/tcp
有时候防火墙规则看着没问题,但SELinux会在底层拦截,遇到CentOS机器SSH老是断断续续,建议先临时关闭SELinux测试一番:
setenforce 0
能连了就是SELinux策略问题,改回正途是调整策略,而非粗暴关闭,但在小型内部测试环境,关闭SELinux是多数人的选择。
Windows宿主机防火墙拦截虚拟机网段
宿主机装了防火墙软件(比如360、电脑管家)或者Windows Defender拦截了VMware虚拟网卡网段,也会导致SSH连接超时,临时关闭宿主机防火墙试一下,能通就说明是宿主机拦的,在防火墙“允许应用”里把VMware相关进程和SSH客户端的专用/公用网络访问权限打开即可。
少见但真实存在的场景:如果你用的是VMware的NAT模式,并且试图通过宿主机访问虚拟机内部专门监听在192.168网段上的服务,Windows的“虚拟网络编辑器”如果勾选了“连接主机虚拟适配器到网络”,可能在某个Windows版本下出现路由冲突,进入网络和共享中心 → 更改适配器设置,检查VMware Network Adapter VMnet8是否启用了默认网关,在多数Windows 10/11版本上,把VMnet8的IP设置为“自动获取”或手动指定为静态IP即可避免此坑。
VMware网络模式选择不对导致ssh连不上
虚拟机的网络模式直接影响SSH连通性,很多人问虚拟机ssh连接失败和网络模式有什么关系,这俩关系可太大了,不同模式对应的IP规则完全不同,搞清楚这点能少走大量弯路。

NAT模式与桥接模式的区别与选择
| 网络模式 | IP段特征 | 宿主机能否直接访问虚拟机 | 虚拟机能否上外网 |
|---|---|---|---|
| NAT | 通常是192.168.xxx.0网段 | 可以,但需要端口转发或同一虚拟网卡网段 | 可以,通过宿主机共享网络 |
| 桥接 | 与宿主机同一网段 | 可以,当作局域网内的独立设备 | 可以,依赖路由器DHCP |
| Host-Only | 独立VMnet网段 | 可以,仅限宿主机和虚拟机内部互通 | 不可以,默认不走物理网络 |
NAT模式下ssh连接失败的常见原因与解决
NAT模式下,VMware为虚拟机分配一个私有网段(默认192.168.44.0或者你自定义的网段),虚拟机的网关指向宿主机虚拟网卡的IP(通常是192.168.44.1),此时SSH连接失败,多数情况下是因为:
- 宿主机还有别的VMware NAT网段残留,导致路由混乱
- 其他软件(如VirtualBox)安装后创建的虚拟网卡抢占了网段
- Windows的虚拟网卡适配器被禁用
解决思路:在VMware菜单栏选择编辑 → 虚拟网络编辑器,点击右下角的还原默认设置,让VMware重新分配NAT网段,这一步能解决不少诡异的NAT模式连不上问题。
NAT模式下如果你从宿主机SSH连接不上去,还可能是端口转发没做,在虚拟网络编辑器里,找到NAT设置,把宿主机的某个端口(比如2222)转发到虚拟机的22端口,之后用:
ssh root@localhost -p 2222
就能连上,这条路径也很适合那些“宿主机能上网但就是连不上虚拟机”的疑难杂症。
桥接模式IP冲突导致连不上
桥接模式下,你的虚拟机相当于局域网里的另一台设备,如果DHCP分配IP和局域网其他设备冲突,SSH自然连接失败,排查手法:在虚拟机里ping宿主机IP,同时检查虚拟机的IP是否和路由器后台显示的一致,冲突后在虚拟机内dhclient重新获取IP,或者为虚拟机配置静态IP,配置静态IP要留意掩码和网关必须和宿主机一致,不能只抄一个IP就完事。
SSH连接时提示"Connection refused"或"Operation timed out"分别怎么处理
这两种报错背后的原因完全不同,能否区分它们,决定了排查效率。
Connection refused:服务未监听或防火墙拒绝
这句报错说明网络是通的,但目标端口上的服务没在听,按顺序检查:
# 查看22端口是否有监听 netstat -tlnp | grep 22

没有任何输出,说明sshd进程没起来,或者监听地址不是0.0.0.0,注意看sshd_config里的ListenAddress,如果写了ListenAddress 127.0.0.1,SSH服务只监听本地回环地址,外部连接自然被拒。
多数情况下,Connection refused也出现在防火墙把端口DROP掉但没拒绝ICMP的情况下,检查防火墙规则里的端口放行状态即可。
Operation timed out:数据包被丢弃或路由不对
超时说明数据包发出去后没有任何响应返回,既不是拒绝也不是接受,常见于:
- 跨网段通信但路由不正确(宿主机根本不知道虚拟机的网段在哪)
- 虚拟机防火墙配置里DROP了IN_GUEST网段的请求
- VMware DHCP租约过期,IP实际已经换了
处理技巧:在宿主机上arp -a查看是否存在虚拟机IP对应的MAC地址,没有记录说明虚拟机根本没在响应ARP请求,网络层就有问题。
常见SSH连接失败原因检查清单
把以上逻辑整理成清单,按顺序核查,能解决绝大部分问题:
- 虚拟机网卡是否处于已连接状态(VMware右下角网卡图标点开)
- 虚拟机内部IP是否为正常地址(不是169.254.x.x那种自动失败地址)
- 宿主机ping虚拟机IP是否通
- 虚拟机内
systemctl status sshd是否active - 虚拟机的防火墙(firewalld/ufw)是否放行了SSH端口
- 宿主机Windows防火墙是否拦截了VMware网段
- VMware虚拟网络编辑器里NAT网段是否有冲突
- sshd_config里改过的参数是否生效并重启
- SELinux或AppArmor是否干扰了sshd进程
Q&A:虚拟机ssh连接失败常见疑问
虚拟机换了网络环境后ssh连不上了怎么办?
虚拟机从家里NAT模式切换到公司桥接模式后,IP地址大概率变了,先查虚拟机新IP再连接,如果虚拟机配置了静态IP而新的Wi-Fi网段不一样,需要在虚拟机内部重新配置IP或改成DHCP自动获取。
虚拟机ssh连接失败且有VNC可以进系统,怎么快速定位?
能进图形界面或VNC就好办很多,先执行systemctl status sshd确认服务状态,再执行ss -lnt查看监听端口,最后临时在宿主机上telnet虚拟机的22端口判断网络层通不通,三个命令的结果基本能定位到具体环节。
用Xshell和FinalShell连不上VMware虚拟机有什么差异?
Xshell、FinalShell以及其他SSH客户端本质上走的是同一个协议,连接失败的根因都在前面提到的服务端、网络或防火墙,没有哪个客户端连虚拟机有特殊优势,如果你的Xshell连不上而MobaXterm能连上,多半是你Xshell会话里保存的IP或端口和虚拟机的实际状态不一致换客户端前先核对这个,能省下不少排查时间。