SSH连接虚拟机失败,绝大多数情况是网络配置、服务未启动或防火墙拦截导致的,按照网络层→服务层→配置层的顺序逐一排查,通常在10分钟内即可定位问题。
先判断是本机问题还是虚拟机问题
第一步永远是做连通性测试。 在终端里执行 ping 虚拟机IP,如果ping不通,说明网络链路有问题,问题大概率出在虚拟机的网络模式或本机路由上,如果ping得通但SSH连不上,那问题就锁定在SSH服务、防火墙或端口监听上。
排查前先确认三件事:
- 虚拟机是否已经完整开机,而不是停留在启动界面或锁屏状态
- 本机和虚拟机是否在同一个网段(除非用了端口转发)
- 虚拟机里是否安装了openssh-server(很多最小化安装默认没有)
这三项检查成本极低,能过滤掉大约一半的常见故障。
网络层排查:ssh连接虚拟机超时怎么办
ping不通或连接超时,优先检查虚拟机的网络模式,VMware Workstation和VirtualBox的处理思路略有差异,但核心逻辑一致。
VMware用户看这里
VMware的三种网络模式对应不同场景:
- NAT模式(默认):虚拟机通过宿主机共享上网,对外表现为宿主机的一个进程,这种情况下,宿主机可以ping通虚拟机,但局域网内其他机器不行,如果你在NAT模式下从本机连不上虚拟机,重点检查VMware的虚拟网络编辑器是否把NAT网关IP和虚拟机IP放在了同一网段。
- 桥接模式:虚拟机直接占用局域网IP,相当于一台独立机器,选这个模式时,确保虚拟机IP和宿主机IP在同一网段,且没有IP冲突。
- 仅主机模式:只能和宿主机通信,上不了外网,如果选了仅主机模式还想SSH,确认虚拟机的网卡IP确实是192.168.x.x或10.x.x.x这类私有地址,并且和VMnet1在同一网段。
实操排查命令:
- 在虚拟机里执行
ip addr查看当前IP - 在本机执行
ipconfig(Windows)或ifconfig(macOS/Linux)查看宿主机IP - 对比两边的网段是否一致
最常见的超时原因就是网段错位。 例如VMware NAT网段是192.168.88.0,虚拟机却因为之前配置过静态IP停留在192.168.1.100,这时候无论怎么等都不可能连上。
VirtualBox用户看这里
VirtualBox默认用NAT模式,但它的NAT模式和VMware有个关键区别:VirtualBox的NAT模式下宿主机直接连虚拟机IP是连不通的,必须配置端口转发,这就是很多人换用VirtualBox后突然连不上SSH的原因。
配置路径:设置→网络→高级→端口转发,添加一条规则:协议TCP、主机端口2222、子系统端口22,之后连接命令改为 ssh 用户名@127.0.0.1 -p 2222。
VirtualBox的桥接模式需要手动选择实际使用的物理网卡(比如你的Wi-Fi网卡或有线网卡),选错会导致虚拟机拿不到IP。
改了网络配置后必须重启网络服务
在虚拟机里执行:
sudo systemctl restart network
或者更通用的:
sudo systemctl restart networking
改VMware网络编辑器或VirtualBox网卡设置后,建议直接重启虚拟机,因为部分配置需要重新初始化网卡才能生效。
SSH服务层排查:ssh连接被拒怎么解决
ping通了但SSH报错,这是第二种高频故障,错误提示分两类:Connection refused(连接被拒绝)和 Connection timed out(连接超时),前者说明目标机器的SSH端口没有监听或被防火墙拦截,后者说明数据包根本没到达目标。
确认SSH服务是否在运行
在虚拟机里执行:
sudo systemctl status sshd
如果显示 active (running),说明服务正常,如果显示 inactive 或 failed,执行:
sudo systemctl start sshd sudo systemctl enable sshd
enable是必做的,否则虚拟机重启后SSH服务不会自动拉起,下次还得手动启动。
确认SSH端口是否在监听
执行:
sudo netstat -tlnp | grep 22
如果输出里有 0.0.0:22 或 ::22,说明sshd正在监听所有网卡的22端口,如果只显示 0.0.1:22,说明sshd只监听了回环地址,外部连接永远进不来,这种情况可以检查sshd配置文件:
sudo vim /etc/ssh/sshd_config
找到 ListenAddress 项,确保没有指定为127.0.0.1,或者直接注释掉让sshd监听所有地址,修改后执行 sudo systemctl restart sshd 生效。
检查虚拟机防火墙
大多数Linux发行版默认开启firewalld或ufw,在虚拟机里执行:
CentOS/RHEL系:
sudo firewall-cmd --list-all
看22端口是否在services列表中,不在就执行:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
Ubuntu/Debian系:
sudo ufw status
如果状态是 active 且22端口未放行,执行:
sudo ufw allow 22/tcp
业内专家指出,防火墙规则是SSH连接失败的头号隐藏原因服务在运行、IP能ping通、端口在监听,但防火墙默默拦截了入站请求,表现就是请求发出后长时间无响应。
本机侧排查:VMware虚拟机ssh连接失败的本地原因
有时候问题不在虚拟机,而在本机。
Windows宿主机的常见坑
- Windows防火墙拦截了出站SSH连接,检查路径:控制面板→Windows Defender防火墙→允许应用通过防火墙,确认OpenSSH Client或你的SSH客户端(如Xshell、FinalShell)被允许。
- VMware的DHCP服务未启动,在Windows服务管理器里找到
VMware DHCP Service和VMware NAT Service,确认状态是“正在运行”,否则虚拟机根本拿不到IP地址。 - WSL与VMware端口冲突,如果本机装了WSL,它的虚拟网卡有时会和VMware的虚拟网卡抢IP段,导致路由表混乱,这时候重启VMware的虚拟网卡或者在WSL内运行
wsl --shutdown可以暂时解决。
宿主机也装了虚拟化软件时的冲突
本机同时开着Hyper-V、VirtualBox或Docker Desktop,可能会导致宿主机网络栈异常。大多数情况下先停用Hyper-V再试SSH,能快速确认是否为虚拟化平台冲突。
账号和密钥排查:节点对但登录失败怎么办
网络通、服务在运行、端口也在监听,但还是登录失败,集中在认证环节。
密码登录失败
确认虚拟机里的登录用户是否属于管理员组,Ubuntu默认创建的普通用户虽然在sudo组,但部分发行版默认禁止root远程登录,想用root直接SSH,需要编辑sshd_config:
sudo vim /etc/ssh/sshd_config
找到 PermitRootLogin,把值改为 yes,重启sshd。不建议生产环境这么做,但本地测试完全没有问题。
密钥登录失败
如果配置了公钥但连接时仍然提示输入密码:
- 确认家目录权限是否为
700,.ssh目录权限是否为700,authorized_keys文件权限是否为600 - 确认把公钥写到了正确路径:
~/.ssh/authorized_keys - 如果用了SELinux(CentOS默认开启),执行
restorecon -R -v /root/.ssh恢复上下文
sshd_config里如果有多个认证方式配置,后读到的配置覆盖先读到的,这个细节容易让人困惑,建议把配置简化成:
PasswordAuthentication yes
PubkeyAuthentication yes
然后重启服务。
报错密文不匹配
部分旧系统SSH版本较老,本机OpenSSH新版本默认禁用了旧算法,在连接命令后加:
ssh -o HostKeyAlgorithms=+ssh-rsa 用户名@IP
这只是临时解决方案,长期建议升级虚拟机内的SSH版本,并检查虚拟机的sshd_config中当前支持的HostKey算法列表:
sshd -T | grep hostkey
若列表为空,说明sshd无法加载HostKey,重新生成密钥即可:
sudo ssh-keygen -A sudo systemctl restart sshd
排查定位流程总览(快速参考)
| 现象 | 排查顺序 | 常用命令/操作 |
|---|---|---|
| ping不通 | 网段→网络模式→DHCP | ip addr, 虚拟网络编辑器 |
| ping通但连接超时 | 防火墙→SSH服务监听 | firewall-cmd/ufw, netstat |
| 连接被拒绝 | sshd状态→sshd_config | systemctl status sshd |
| 密码正确但登录失败 | 账号权限→sshd认证配置 | sudo groupadd, grep sshd_config |
| 密钥登录无效 | 权限→SELinux→算法兼容 | chmod, restorecon |
按照这个顺序操作,先网络层、再服务层、最后配置层,不要跳步骤,多数情况下问题都出在前两步,直接检查sshd配置反而不容易碰到真正的元凶,SSH连接失败的本质是“路径上某个环节没有正确转发”,一层层确认,就能精确锁定瓶颈。
关于本机SSH连接虚拟机的常见疑问
Q:VMware里改了NAT网段之后,宿主机能打开虚拟机界面但SSH连不上,怎么办?
A:改了虚拟网络编辑器里的NAT网段后,虚拟机内部的IP不会自动跟着变,在虚拟机里执行 ip addr 看当前IP,如果还在旧网段,编辑 /etc/sysconfig/network-scripts/ifcfg-ens33(CentOS)或使用Netplan(Ubuntu)更新为新的网段地址,然后重启网络服务,还要确认宿主机路由表已经更新,Windows下执行 route print 查看是否有指向新网段的静态路由。
Q:连接报错 no matching host key type found,是什么原因?
A:本机OpenSSH客户端版本(通常是8.8或更高)默认禁用了ssh-rsa签名算法,而虚拟机里的SSH服务端还在用这个旧算法,临时解法是连接时加 -o HostKeyAlgorithms=+ssh-rsa,建议在虚拟机内升级openssh-server到最新版本,或者重新生成ed25519类型的HostKey,执行 sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key,然后重启sshd。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/611900.html





