服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-12 更新于 2026-10-12 简米科技 4,109 字 10 分钟阅读

ssh到虚拟机连不上怎么办?,虚拟机ssh连接失败怎么解决?

导读ssh到虚拟机连不上,核心原因集中在网络不通、SSH服务未开启、防火墙拦截和认证失败四类,按顺序排查即可快速定位,为什么虚拟机ssh总是连不上?先分清三类原因很多新手遇到ssh连接失败,第一反应是重新安装系统,其实大可不必,绝大多数情况下,问题出在虚拟机网络配置或SSH服务本身,我把这些年排查过的案例归类,基本……

ssh到虚拟机连不上,核心原因集中在网络不通、SSH服务未开启、防火墙拦截和认证失败四类,按顺序排查即可快速定位。

为什么虚拟机ssh总是连不上?先分清三类原因

很多新手遇到ssh连接失败,第一反应是重新安装系统,其实大可不必,绝大多数情况下,问题出在虚拟机网络配置或SSH服务本身,我把这些年排查过的案例归类,基本逃不出下面三种。

网络层:虚拟机IP地址不通

最常见的情况是宿主机根本ping不到虚拟机,比如你用VMware Workstation,虚拟网络编辑器里选了NAT模式,但虚拟机内部网卡没获取到正确IP,有些系统默认没启用网卡,ip addr 看不到有效地址,自然连不上,还有可能宿主机和虚拟机不在同一网段,比如宿主机是192.168.1.x,虚拟机却跑到192.168.137.x,这也会导致ssh连接虚拟机失败。

服务层:SSH服务没启动或端口不对

就算网络通了,SSH服务不在线也没戏,不少精简版Linux系统默认没装openssh-server,或者安装后没启动,另外有人把SSH端口改了,比如改成2222,你还在用22端口去连,必然报connection refused。

认证层:密码、密钥、用户名全都没对上

认证失败的表现通常是Permission denied,可能是你输错了密码,也可能是root账号默认禁止远程登录(很多发行版sshd_config里PermitRootLogin是prohibit-password),还可能密钥文件权限不对,这类问题最容易让新手卡很久,因为网络和服务都正常,但就是登不进去。

新手必看:虚拟机ssh连接失败的五步排查清单

下面这套流程是我自己每次远程连不上虚拟机时都会走的,按顺序来,一般五分钟内能锁定问题。

第一步:确认虚拟机和宿主机之间的网络连通性

先在虚拟机里执行 ip addr 或 ip a,找到当前IP地址,如果是NAT模式,通常IP是192.168.x.x网段;桥接模式则是局域网同网段,确认IP后,回到宿主机终端,执行 ping 虚拟机IP,注意:

  • 如果ping不通,优先检查虚拟机的网卡是否启用,执行 ip link set ens33 up(网卡名以实际为准)。
  • 如果虚拟机IP是169.254.x.x,说明没从DHCP拿到地址,检查虚拟网络编辑器的DHCP设置。
  • ssh到虚拟机连不上怎么办?,虚拟机ssh连接失败怎么解决?

  • 如果ping丢包严重,可能是IP冲突,尤其桥接模式下容易出这问题。

第二步:检查SSH服务是否在运行并监听端口

在虚拟机里执行 systemctl status sshd 或 service ssh status,如果显示未运行,执行:

  • sudo systemctl start sshd 启动
  • sudo systemctl enable sshd 设置开机自启

同时确认端口监听情况,用 netstat -tlnp | grep ssh 或 ss -tlnp | grep 22,看到0.0.0:22或::22就说明SSH在正常监听,如果只看到0.0.1:22,说明只允许本机连接,需要修改sshd配置里的ListenAddress。

第三步:验证防火墙是否拦截了22端口

很多新手把防火墙忘了,在虚拟机里执行:

  • CentOS/RHEL系:sudo firewall-cmd --list-all 查看当前规则,若没有22端口,执行 sudo firewall-cmd --permanent --add-port=22/tcp sudo firewall-cmd --reload。
  • Ubuntu/Debian系:sudo ufw status,如果状态是active,执行 sudo ufw allow 22/tcp。

如果宿主机也开了防火墙,记得放行出站连接,对于VMware用户,还要检查虚拟网络编辑器里是否勾选了"本地DHCP服务"和"NAT设置"。

第四步:检查用户名和认证配置

网络通了、服务开着、防火墙也放行,但还是连不上,十有八九是认证问题,先确认你使用的用户名在虚拟机里存在,执行 whoami 看看当前用户,如果要连root,编辑/etc/ssh/sshd_config,找到PermitRootLogin,改成yes(仅限测试环境,生产环境不建议),改完重启sshd:sudo systemctl restart sshd。

如果是密钥登录失败,检查宿主机上~/.ssh/id_rsa和~/.ssh/id_rsa.pub是否存在,公钥要放入虚拟机的~/.ssh/authorized_keys,且该文件权限必须是600,~/.ssh目录权限必须是700,权限不对,就算密钥匹配也会被拒绝。

第五步:查看SSH日志定位真实错误

前面几步都试过了还不行,就看日志,日志会告诉你真正的拒绝原因。

  • 通过journalctl -u sshd 或 tail -f /var/log/secure(CentOS)查看认证日志。
  • ssh到虚拟机连不上怎么办?,虚拟机ssh连接失败怎么解决?

  • Ubuntu系统看 /var/log/auth.log。

常见日志关键词:

  • Connection refused:服务没启动或端口不对外。
  • Connection timed out:网络不通或防火墙丢弃了包。
  • No route to host:网关问题或IP根本不存在。
  • Permission denied (publickey,password):认证失败,检查账户密码或密钥。

业内专家指出,超过八成虚拟机ssh连接问题都能通过这五步排查解决,不需要重装系统或重启虚拟机。

常见场景:NAT模式和桥接模式下ssh连不上怎么处理

不同网络模式下,虚拟机ssh连接不上原因有点区别,下面说说最容易踩坑的地方。

NAT模式下虚拟机ssh连接不上原因与解法

NAT模式下,虚拟机通过宿主机访问外网,宿主机可以访问虚拟机,但外部设备访问不到,一个典型场景是:你在公司用笔记本电脑跑VirtualBox,虚拟机用的是NAT网络,早上还能连,下午重启后连不上了。

原因是NAT模式下虚拟机的IP会随DHCP租约变化,解决办法:在虚拟机里设置静态IP,以Ubuntu 22.04为例,编辑/etc/netplan/00-installer-config.yaml,配置静态IP、网关和DNS,然后执行sudo netplan apply,这样IP不再漂移,下次连的时候还是同一个地址。

另外注意VirtualBox的NAT模式默认不支持宿主机直接访问虚拟机,需要设置端口转发,在VirtualBox管理器的网络设置里,添加一条转发规则:协议TCP,主机端口2222,子系统端口22,然后用 ssh -p 2222 用户名@127.0.0.1 来连,很多新手卡在默认NAT模式下怎么都ping不通,就是因为没做端口转发。

桥接模式IP冲突导致ssh失败

桥接模式相当于虚拟机直接连接宿主机所在局域网,它的IP由路由器分配,问题在于,如果局域网里有其他设备占了同一个IP,虚拟机就会无法通信,ssh自然连不上。

排查命令:在虚拟机里执行 arp-scan -l(如果没有,先安装)查看局域网内IP和MAC地址,看有没有和虚拟机重复的,或者用 ping -c 3 虚拟机IP 然后查ARP表,发现冲突后,在虚拟机里手动换一个空闲的静态IP,还有一种情况是路由器开启了AP隔离,导致虚拟机与宿主机虽然同网段但互相不可达,这种情况下需要关闭AP隔离或改用NAT模式。

ssh到虚拟机连不上怎么办?,虚拟机ssh连接失败怎么解决?

实用命令速查表:从检测到修复

下面这张表把排查过程中最常用的命令整理出来,你可以截图保存。

排查步骤 命令示例(虚拟机内执行) 预期结果
查看IP地址 ip addr 有非169.254.x.x的IP
测试本机回环 ping 127.0.0.1 不丢包
查看SSH服务状态 systemctl status sshd active (running)
查看端口监听 ss -tlnp | grep 22 看到0.0.0:22
查看防火墙规则 sudo ufw status 或 sudo firewall-cmd --list-all 22端口为allow
测试远程端口 宿主机执行 telnet 虚拟机IP 22 看到SSH版本信息或立即连接
查看SSH日志 sudo tail -f /var/log/auth.log 无拒绝记录

注意:如果宿主机没有telnet命令,可以用 nc -zv 虚拟机IP 22 代替,macOS和Linux都自带nc。

Q&A:ssh到虚拟机连不上常见问题解答

为什么我改了SSH端口后,用新端口连不上?

改了/etc/ssh/sshd_config里的Port之后,必须重启sshd服务才生效,同时检查防火墙是否放行了新端口,比如改成2222后,执行 sudo ufw allow 2222/tcp,如果用的是云服务器虚拟机,还要在安全组里放行对应端口,SELinux可能拦截非默认端口,CentOS系统需要执行 sudo semanage port -a -t ssh_port_t -p tcp 2222。

虚拟机可以ping通宿主机,但ssh报Connection refused,怎么回事?

说明网络是通的,但SSH端口没有正常监听,先确认sshd服务启动状态,再用 ss -tlnp 看实际监听地址,如果只监听在0.0.1,说明配置里限制了只允许本机连接,修改ListenAddress为0.0.0后重启服务,另外检查一下虚拟机里是否有多个SSH服务相互冲突,比如同时装了dropbear和openssh-server,端口被占用了。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱