虚拟机ssh连不上,九成原因是网络模式和sshd服务没配好,按下面步骤排查,五分钟内能解决。
为什么你的虚拟机ssh连不上
很多朋友第一次在虚拟机里装完Linux,兴冲冲地打开终端准备用ssh连接,结果界面卡住不动,或者直接提示“Connection refused”,碰到这种情况,先别急着怀疑系统坏了,绝大多数问题出在虚拟机的网络配置和ssh服务本身,这里说的虚拟机ssh连不上是什么原因,基本可以归纳为三类:IP没配对、端口没监听、防火墙拦路。
网络模式选错,这是最常见原因
虚拟机的网络模式决定它能不能跟宿主机通信,以VMware为例,有三种典型模式:
- NAT模式:虚拟机通过宿主机上网,对外只表现为宿主机的一个进程,宿主机能访问虚拟机,但局域网里其他电脑不行,如果你只是想从本机ssh过去,NAT模式够用了。
- 桥接模式:虚拟机直接接入物理局域网,拥有独立IP,像一台真实电脑,此时局域网内任何机器都能ssh它,但也更容易暴露端口,安全性要自己把握。
- 仅主机模式:虚拟机只能跟宿主机通信,上不了外网,适合测试隔离场景,但平时用ssh不建议选这个。
行业共识认为,日常学习首选NAT模式,因为不需要向路由器申请IP,也不会跟真实网络冲突,选了NAT模式后,虚拟机的IP应该是168.x.x或x.x.x这类私网地址,而不是x.x.x(这可能是VMware的虚拟网卡地址,容易混淆)。
防火墙和sshd服务状态
即使IP通,服务没起来也是白搭,在虚拟机里执行:
systemctl status sshd
看到active (running)才正常,如果没装,先安装:
sudo apt install openssh-server # Debian/Ubuntu sudo yum install openssh-server # CentOS/RHEL
防火墙要放行22端口,很多刚装好的系统默认防火墙策略是禁止外部连入的,临时关闭测试可以:
sudo systemctl stop firewalld # CentOS sudo ufw disable # Ubuntu
不过正式环境别这么做,稍后我们讲具体放行规则。
ssh连接虚拟机超时怎么办
你输入ssh user@192.168.1.100后,光标闪烁半天,最后提示Connection timed out,这说明包根本到达不了目的主机。超时和拒绝是两回事
:拒绝是对方明确回了“我不接受”,超时是包在路上丢了或没人应答。
检查IP地址是否可达
先在宿主机上ping虚拟机的IP:
ping 192.168.1.100
- 如果ping不通,说明网络层就没通,重点检查虚拟机的网卡是否启用,以及VMware虚拟网络编辑器里的子网设置,打开VMware的“编辑”->“虚拟网络编辑器”,查看VMnet8(NAT模式)的子网IP段,手动把虚拟机IP设置成同一网段,比如子网
168.88.0,虚拟机就设168.88.128。 - 如果ping通了,但ssh还是超时,排查方向转向端口,可能是sshd监听在非标准端口,或者iptables规则把进来的SYN包丢了。
确认端口是否开放
用telnet测试端口:
telnet 192.168.1.100 22
如果连接被拒绝,会直接显示Connection refused;如果是黑洞一样卡住,多半是防火墙把DROP策略放在前面了,查看当前iptables规则:
sudo iptables -L INPUT -n --line-numbers
看到DROP或REJECT行,可以用sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT插入放行规则,这个操作即时生效,重启后失效,想永久有效,用sudo apt install iptables-persistent保存规则。
vmware虚拟机ssh连接设置完整步骤
如果你从头开始配置,按下面这套顺序走一遍,基本能稳定连上,这里把vmware虚拟机ssh连接设置的关键点拆开讲。
桥接模式与NAT模式的选择
上面提过两种模式,举个例子说明差异:
| 场景 | 推荐模式 | 原因 |
|---|---|---|
| 只用宿主机连接虚拟机 | NAT | 配置简单,不需要理会路由器设置 |
| 手机、其他电脑要连虚拟机 | 桥接 | 虚拟机有独立IP,对外可达 |
| 内网渗透测试实验 | 桥接 | 虚拟机需要参与局域网通信 |
| 离线开发环境 | 仅主机 | 完全隔离,安全 |
选择桥接模式时,注意虚拟机的IP要和宿主机在同一网段、同一网关,用ip addr查看当前地址,然后sudo vi /etc/netplan/01-netcfg.yaml修改静态IP,NAT模式下,VMware会自动分配IP,但偶尔租约过期导致变IP,可以考虑用DHCP保留或干脆设静态。
修改sshd配置文件
sshd的默认配置在/etc/ssh/sshd_config,有几个参数建议核对:
Port 22 PermitRootLogin no PasswordAuthentication yes AllowUsers yourname
PermitRootLogin no:禁止root直接用密码登录,防止暴力破解。PasswordAuthentication yes:允许密码登录,如果你用密钥,可以设no,但第一次配置时保持yes更省事。AllowUsers yourname:限制登录用户,避免其他账户尝试。
改完重启服务:
sudo systemctl restart sshd
使用ssh客户端测试连接
在宿主机打开终端(Windows可用PowerShell或CMD,macOS直接Terminal),执行:
ssh yourname@192.168.1.100
首次连接会提示确认主机指纹,输入yes即可,然后输入密码,看到命令行提示符变成yourname@ubuntu:~$就成功了。
如果你用的是Windows,还可以用MobaXterm或FinalShell这类图形工具,连接方式一样,填主机名、用户名、端口即可,它们的好处是支持文件拖拽上传,适合编辑配置文件。
实战:本地ssh连接虚拟机报错排查
接下来列出最常见的几种报错,以及对应处理思路,这份清单覆盖了我踩过的多数坑。
Permission denied (publickey,password)处理
看到这个说明验证阶段失败了,一步一步来:
- 检查用户名是否存在:虚拟机里执行
whoami,确认用户名拼写。 - 检查密码是否输对:注意小键盘、大小写,如果之前用键盘布局设了特殊字符,很容易输错。
- 检查sshd_config里是否禁止了密码登录:如果
PasswordAuthentication no,改成yes并重启。 - 如果虚拟机里能看到
~/.ssh/authorized_keys,而你是用私钥登录的,检查私钥文件的权限不能太宽松,在宿主机执行chmod 600 ~/.ssh/id_rsa。
常见报错对照表
| 报错信息 | 可能原因 | 解决办法 |
|---|---|---|
Connection refused |
sshd未启动或端口错误 | systemctl start sshd,检查ss -tlnp输出 |
Network is unreachable |
虚拟机没有配置有效IP | 用ip addr
查看网卡, |
Host key verification failed | 虚拟机系统重装后密钥变化 | 删除宿主机~/.ssh/known_hosts里对应IP的行 |
No route to host | 防火墙DROP,或跨网段 | 检查iptables,调整虚拟网络编辑器 |
业内专家指出,排查网络问题时,先看链路,再看服务,最后看认证,链路层通了,服务监听正常,认证就是唯一关卡,按照这个顺序定位,能省掉大量无头绪的重试。
Q&A:ssh连虚拟机的常见疑问
这里整理几个高频问题,直接给出可行答案。
虚拟机可以上网但宿主机ssh超时,为什么?
虚拟机上网走NAT出口,宿主机访问虚拟机走虚拟网卡,两者路径不同,先确认虚拟机网卡能ping通网关,再检查宿主机VMware NAT服务的状态,Windows服务里找到VMware NAT Service,确保正在运行,虚拟机里的sshd_config如果设置了ListenAddress 192.168.x.x,但这个IP已变更,就会导致端口监听在错误地址,用ss -tlnp | grep sshd查看实际监听IP。
为什么用root登录被拒绝?
默认sshd配置PermitRootLogin prohibit-password,即禁止root用密码登录,但允许密钥登录,如果你非要用root,打开sshd_config,将其改为PermitRootLogin yes,重启服务,不过更推荐用普通用户登录,需要权限时执行sudo -i,既方便又降低被爆破风险,如果虚拟机是CentOS,普通用户加入wheel组才能sudo。
怎么让ssh服务开机自启?
在systemd系统下执行:
sudo systemctl enable sshd
这个命令会把sshd加入开机启动序列,检查状态时,enabled和running两个词同时出现,说明已配置好,如果你的虚拟机用SysVinit(老系统),则用chkconfig sshd on,设置自启后,虚拟机重启也不用再手动拉起服务,省去每次折腾。
回到最初的问题:ssh连虚拟机,本质上就是一台机器上的客户端,穿过虚拟化层,与另一台机器上的守护进程会话,把网络地址配通、服务端口开好、认证信息捋顺,剩下的事情水到渠成,下次再碰到连接失败,先跑一遍ping和telnet,再翻翻这个清单,多数问题能自己解决。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/672779.html





