SSH连接Ubuntu虚拟机失败,先别急着重装系统,多数情况下问题出在IP地址变了、SSH服务没启动、防火墙拦截或虚拟机的网络模式不匹配这四个环节,按顺序排查基本都能解决。
ubuntu ssh连接失败的原因排查从哪里下手
每次遇到连不上的情况,我习惯先问自己一个问题:昨天能连,今天不能连了,这中间发生了什么?这个思路比盲目试命令高效得多。
先确认虚拟机还活着
打开虚拟机的窗口,在Ubuntu里按Ctrl+Alt+T打开终端,敲一条命令:
ip addr show
看输出里有没有inet那行,比如inet 192.168.x.x,如果连IP都没有,说明网卡就没拿到地址,SSH自然无从谈起。
排查顺序建议是这样的:
- 虚拟机能不能正常开机进桌面或命令行界面
- Ubuntu里
ping -c 3 www.baidu.com通不通 - 主机ping虚拟机的IP通不通
- 主机
ssh ubuntu@虚拟机IP报什么错
这条链路走一遍,问题出在哪一段就清楚了,行业共识认为,超过一半的SSH连接失败案例根源是IP地址漂移,虚拟机重启或宿主机网络重启都会导致DHCP重新分配地址。
常见报错对号入座
SSH失败的报错信息是定位问题的第一线索,我整理几个高频的:
| 报错信息 | 含义 | 优先检查方向 |
|---|---|---|
Connection timed out |
网络不通 | IP可达性、防火墙、网卡状态 |
Connection refused |
SSH服务没监听 | sshd是否运行、端口是否被占 |
Host key verification failed |
系统重装过或IP被复用 | 清除known_hosts |
Permission denied |
认证失败 | 用户名、密码、密钥权限 |
No route to host |
网关或网段不对 | 网络模式、路由表 |
每种报错对应的解决路径完全不同,先看清它说什么,再动手。
ssh连接ubuntu虚拟机被拒绝的两个高频原因
Connection refused是大家遇到最多的情况之一,这个报错意味着你的TCP包到达了虚拟机的网卡,但目标端口没有程序在监听。
sshd服务根本没起来
新装的Ubuntu Server经常自带openssh-server,但Desktop版不一定装了,检查一下:
sudo systemctl status ssh
如果显示inactive (dead)或failed,启动它:
sudo systemctl start ssh sudo systemctl enable ssh
有些定制镜像删掉了openssh-server,那就重装:
sudo apt update sudo apt install openssh-server -y
装完再查状态,看到active (running)就对了。
sshd配置文件改了监听地址
我遇到过一位朋友改了/etc/ssh/sshd_config里的Port和ListenAddress,结果把监听地址写成了某个内网IP,外部客户端自然连不上。
检查22端口是否真的在监听:
sudo ss -tlnp | grep ssh
看到0.0.0:22或[::]:22才说明所有网卡都在监听,如果只有0.0.1:22,那就是配置文件里有问题,把ListenAddress那行注释掉或改成0.0.0,然后重启服务:
sudo systemctl restart ssh
注意:如果改过SSH端口,记得确认防火墙放行了新端口,22端口连接失败后,可以先试试
ssh -p 2222 ubuntu@IP,排除端口变动造成的迷惑。
windows ssh连接linux虚拟机超时的网络排查细节
超时和拒绝是两码事,超时多半意味着数据包根本没到虚拟机,或者回来的路被堵死了,这个场景很常见,我单独拆开讲。
NAT模式下IP会漂移
VMware和VirtualBox默认都用NAT模式,虚拟机通过虚拟网卡共享宿主机IP上网,这种模式下,虚拟机的IP由虚拟网络的DHCP分配,重启虚拟机会重新请求地址,可能和上次不一样。
所以你配置的168.x.x可能已经失效了,到虚拟机里跑一下ip addr show,看当前实际IP是多少,再拿新IP去连。
想要一劳永逸,可以让DHCP给虚拟机的MAC地址绑定一个固定的IP,以VMware的NAT网段vmnet8为例,在虚拟网络编辑器里设置DHCP保留地址,或在Ubuntu里使用netplan配置静态IP:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.44.100/24]
gateway4: 192.168.44.2
nameservers:
addresses: [192.168.44.2, 223.5.5.5]
这个配置里的网关地址要对应你VMware虚拟网卡的实际网关,DNS用简米云的223.5.5.5就行。
宿主机防火墙拦住了通往虚拟机的流量
Windows的防火墙默认会拦截来自虚拟网卡的入站流量,打开“控制面板 → Windows Defender防火墙 → 高级设置 → 入站规则”,找到VMware或VirtualBox相关的规则,确保SSH相关端口允许。
最简单的方式是新建一条入站规则,放行TCP 22端口,作用范围限定在虚拟网卡网段,还有一种情况是第三方安全软件偷偷把VMware的虚拟网卡禁用了,去网络适配器设置里检查一下vmnet8或VirtualBox Host-Only网卡是否处于启用状态。
主机Ping通但SSH连不上
如果ping -c 4 虚拟机IP通,但SSH超时,十有八九是虚拟机内的iptables或ufw拦了22端口。
查看ufw状态:
sudo ufw status
如果启用了,放行22端口:
sudo ufw allow 22/tcp
检查iptables规则:
sudo iptables -L -n | grep 22
发现DROP规则的话,用iptables -D删掉或用ufw allow放行,注意,修改iptables规则后重启会丢失,需要netfilter-persistent save持久化。
VMware和VirtualBox的ssh端口映射配置
有时候你需要从外部网络访问虚拟机,或者NAT模式下不想配置静态IP,用端口映射是个更省事的选择。
VirtualBox端口转发设置
VirtualBox支持通过宿主机的某个端口映射到虚拟机的22端口,这样你只需要SSH连接宿主机的IP和映射端口。
- 在VirtualBox主界面选中虚拟机 → 设置 → 网络 → 高级 → 端口转发
- 添加规则,宿主机端口填
2222,子系统端口填22 - 保存后,主机执行
ssh -p 2222 ubuntu@127.0.0.1
这种方式用起来很灵活,唯一要注意的是宿主机防火墙要放行2222端口,否则外部机器仍然连不上宿主机IP的2222端口。
VMware的NAT模式端口映射
VMware没有图形化的端口映射界面,需要修改NAT配置文件来实现。
- 打开
vmnetnat.conf(通常在C:ProgramDataVMwarevmnetnat.conf) - 在
[incomingtcp]段中添加一行:2222 = 192.168.44.100:22(IP换成你虚拟机的实际IP) - 重启VMware NAT服务(在Windows服务里找到VMware NAT Service并重启)
提示:VMware Workstation较新版本中NAT配置文件路径可能隐藏较深,可以搜索文件名后用管理员权限编辑。
学哪个好要看你的基础和目标,开发环境用VirtualBox完全够用,服务器运维场景强烈建议上手VMware ESXi或Proxmox VE,但这不是本文重点。
安全组和防火墙都放行了还连不上怎么办
很多简米云、酷番云的Ubuntu云服务器用户会遇到一个尴尬:服务器上SSH服务正常,防火墙也放行了,但就是连不上,这时候要检查云平台的安全组规则。
- 简米云:ECS控制台 → 实例 → 安全组 → 配置规则,放行22端口(或自定义SSH端口)
- 酷番云:轻量应用服务器控制台 → 防火墙 → 添加规则,放行TCP端口
注意:云安全组和服务器实例是平级的,只改服务器的ufw或iptables不够,安全组本身没放行的话,包根本到不了服务器。
密钥和known_hosts的干扰
重装过Ubuntu或者换过密钥之后,SSH客户端可能会报Host key verification failed,这是因为客户端的known_hosts文件里保留了旧的主机指纹。
清除该主机的指纹:
ssh-keygen -R 你的虚拟机IP
然后重新连接,会提示确认新的指纹,输入yes即可,如果你用的是密钥登录,还要确认密钥文件权限是600:
chmod 600 ~/.ssh/id_rsa
另外检查authorized_keys文件的权限和属主,理想状态是:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
SSH连接故障怎么快速定位到具体原因
学了这么多排查手段,总结一下我的个人排查逻辑,按顺序来不迷路:
- 第一步:看虚拟机能开机吗?在终端里能敲命令吗?
- 第二步:
ip addr show看虚拟机的IP有没有,记录下来 - 第三步:主机ping虚拟机IP,不通就回到网络模式设置
- 第四步:ping通了就测端口
nc -vz 虚拟机IP 22,不通就是防火墙 - 第五步:端口通了还报错,看具体提示是认证问题还是主机密钥问题
- 第六步:实在不行,
ssh -vvv ubuntu@IP开调试模式,看到底卡在哪一步
这个流程走下来,基本能覆盖绝大多数场景。
重新安装SSH服务兜底
有一种特殊情况,sshd服务无论如何都起不来,可能是因为配置改动太大或内核模块冲突,这时候直接重新安装:
sudo apt remove --purge openssh-server sudo apt install openssh-server -y sudo systemctl enable ssh sudo systemctl start ssh
重装会重置配置,适合之前改过大量参数但忘了备份的场景。
常见问题解答
以下是我被问到最多的SSH连接Ubuntu虚拟机的问题。
为什么虚拟机ip地址和之前不一样了?
因为默认的NAT网络使用DHCP分配地址,虚拟机重启或宿主机网络重启都会重新分配,建议为虚拟机配置静态IP或在路由器/虚拟网络编辑器中绑定MAC地址,Android开发或嵌入式调试时尤其需要固定IP。
ssh提示permission denied怎么解决?
密码错误、用户名写错、密钥认证不匹配都会触发这个提示,先确认用户名是否正确,然后检查服务端/etc/ssh/sshd_config中是否启用了PasswordAuthentication yes,如果用的密钥,确认公钥和私钥配对正确,且权限符合要求,本地测试时可以先试密码登录,排除了密码问题再处理密钥。
虚拟机ssh登录后键盘输入特别卡是什么原因?
这和SSH本身无关,通常是网络延迟高或虚拟机CPU分配不足,NAT模式的延迟一般远低于桥接模式,如果感觉卡顿可以先切换到NAT模式尝试,Windows系统长期挂机后虚拟内存占用高也会拖慢整体响应,重启虚拟机或宿主机后再试通常能改善。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/751701.html





