Windows主机通过SSH连接Linux虚拟机,核心是确认IP可达、开启SSH服务、使用正确的认证方式,三步之内即可完成。
很多人在Windows上装了VMware或VirtualBox,跑起来一个Linux系统,却发现没法像Windows远程桌面那样直接连上去,其实SSH连接本身不复杂,但卡住的人往往卡在IP地址、网络模式或者密钥权限这些细节上,我按实际排查顺序,把从零到通的完整过程拆开讲。
SSH连接前,Linux虚拟机必须满足的三个条件
先别急着敲命令,SSH本质是两台机器之间的TCP通信,Windows主机能连上虚拟机,前提是虚拟机这边同时满足三个条件:SSH服务已安装并运行、网络模式允许主机访问、IP地址能从主机直接ping通,缺一个,后面全是白忙活。
检查并启动Linux自带的SSH服务
大多数Linux发行版默认不安装SSH服务端,只装了客户端,判断方法很简单,在Linux终端执行:
ps -ef | grep sshd
有输出说明sshd在跑,如果没输出,先安装:
- Ubuntu/Debian系:
sudo apt update && sudo apt install openssh-server -y - CentOS/RHEL系:
sudo yum install openssh-server -y
装完启动并设置开机自启:
sudo systemctl start sshd sudo systemctl enable sshd
个别版本的服务名是ssh而不是sshd,用systemctl status sshd报错时可以试systemctl status ssh,这一步搞不定,后面连不上不是网络问题,是服务压根没开。
网络模式怎么选:桥接还是NAT
这是Windows主机SSH连Linux虚拟机最常见的坑,VMware和VirtualBox默认都使用NAT模式,NAT模式下虚拟机通过宿主机共享IP上网,宿主机能ping通虚拟机,但虚拟机ping不通宿主机,而且外部设备(包括宿主机本身)默认无法直接访问虚拟机的端口。
如果你的目标是Windows主机SSH连虚拟机,推荐两种做法:
- 桥接模式(推荐):让虚拟机直接获取局域网独立IP,和宿主机处于同一网段,SSH就像连一台普通电脑一样。
- NAT模式+端口转发:保持在NAT模式,手动把宿主机的某个端口(比如2222)转发到虚拟机的22端口。
用桥接模式最省心,在VMware里右键虚拟机设置,网络适配器选“桥接模式”,VirtualBox里选“桥接网络”,如果公司或校园网做了MAC地址过滤,桥接可能拿不到IP,这时改用NAT端口转发。
确认虚拟机IP,并测试宿主机连通性
在Linux终端输入:
ip addr
找到inet后面的地址,类似168.1.100,然后回到Windows的命令行,执行:
ping 192.168.1.100
能收到回复,说明网络通,ping不通时,优先查两件事:虚拟机防火墙是否阻止ICMP,以及网络模式是不是NAT但没做转发,Ubuntu默认防火墙ufw是关闭的,CentOS的firewalld默认开着但通常放行22端口,临时关闭防火墙测试可以用sudo ufw disable或sudo systemctl stop firewalld,确认能连上后再按需放行端口。
Windows端SSH连接实操:命令和工具怎么选
Windows 10 1803版本以后,系统自带了OpenSSH客户端,不需要额外装软件,直接打开PowerShell或CMD,用标准命令:
ssh 用户名@虚拟机IP
比如ssh root@192.168.1.100,首次连接会提示确认指纹,输入yes回车,然后输密码,这个过程中最容易遇到的问题是“Connection timed out”和“Connection refused”:
- timed out:通常是网络不通,回去检查IP、ping、网络模式。
- refused:SSH服务没起,或者端口没监听,回到第一步查sshd。
密钥登录比密码更安全,用ssh-keygen生成
密码登录方便,但容易遭受暴力破解,业内专家指出,生产环境强烈建议禁用密码登录,改用密钥对,Windows主机上生成密钥对:
ssh-keygen -t rsa -b 4096
默认生成到C:\Users\你的用户名\.ssh\目录,文件名是id_rsa(私钥)和id_rsa.pub(公钥),然后把公钥复制到Linux虚拟机的~/.ssh/authorized_keys文件里,最省事的方式是用ssh-copy-id,这个命令在Windows PowerShell里没有,但可以手动操作:
- 在Windows上查看公钥内容:
cat ~/.ssh/id_rsa.pub - 在Linux上把公钥追加到授权文件:
mkdir -p ~/.ssh && echo "粘贴公钥内容" >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
之后用ssh -i C:\Users\你的用户名\.ssh\id_rsa 用户名@虚拟机IP登录,不再需要密码,不少运维老手会直接把私钥加入Windows的SSH代理,避免每次敲路径。
搞不定命令?可视化工具也是一个选择
如果你平时不太习惯敲命令,或者需要管理多台虚拟机,用可视化SSH工具更顺手,Windows上常用的有两类:
- 跨平台开源:PuTTY,老牌轻量,缺点是界面风格老旧,密钥管理稍繁琐。
- 现代终端:MobaXterm、Tabby、Windows Terminal配合OpenSSH,支持标签页、文件传输、会话保存。
个人感受是:单台虚拟机测试用系统自带命令就够,多台环境管理用MobaXterm这类工具能省不少事,但无论用哪个工具,底层都是SSH协议,前面讲的网络和服务排查逻辑完全一样。
虚拟机IP老变?配置静态IP一劳永逸
DHCP分配的IP不固定,虚拟机重启后可能就换地址了,Windows主机SSH连接Linux虚拟机,最怕今天连得上明天连不上,解决办法是给Linux配置静态IP。
Ubuntu使用netplan配置静态IP
Ubuntu 18.04以后的配置文件在/etc/netplan/目录下,通常叫01-netcfg.yaml,编辑它:
sudo nano /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [223.5.5.5, 8.8.8.8]
注意网卡名(ens33)要用ip addr查到的实际名称,网关地址填你路由器的IP,应用配置:
sudo netplan apply
CentOS使用nmcli或修改ifcfg文件
CentOS 7及更高版本推荐用nmcli:
sudo nmcli connection modify ens33 ipv4.addresses 192.168.1.100/24 sudo nmcli connection modify ens33 ipv4.gateway 192.168.1.1 sudo nmcli connection modify ens33 ipv4.dns 223.5.5.5 sudo nmcli connection modify ens33 ipv4.method manual sudo nmcli connection up ens33
同样把ens33替换成实际网卡名,配完先用ip addr确认,再回Windows重新ping一次,通了就稳了。
常见连接失败场景排查清单
把这些年帮人排查过的案例汇总一下,90%以上的Windows连不上Linux虚拟机的问题,跑一遍下面这个清单就能定位。
ping不通,SSH显示超时
- 宿主机和虚拟机的网络模式是否为NAT且未配置端口转发
- 虚拟机的网卡是否已启用,
ip addr里有没有IP地址 - 宿主机防火墙是否拦截了ICMP或SSH端口(Windows Defender防火墙在专用网络下一般允许ping,但也要确认)
- 路由器是否开启了AP隔离(常见于公司或酒店WiFi)
ping得通,但SSH端口不通
先测端口:
Test-NetConnection 虚拟机IP -Port 22
返回TcpTestSucceeded : True就通,不通时:
- 在Linux上运行
ss -tlnp | grep 22,确认sshd正在监听 - 检查Linux防火墙,CentOS上
firewall-cmd --list-all看22端口是否放行 - 如果用NAT端口转发,检查宿主机的转发端口是否被其他程序占用
密码正确但登录被拒绝
- 确认输入的用户名是Linux系统的实际用户名,不是Windows的用户名
- 检查
/etc/ssh/sshd_config里PasswordAuthentication是否被设为no - 查看系统日志
sudo journalctl -u sshd,看有没有明确的错误提示
多虚拟机场景怎么管理才高效
运行多个Linux虚拟机时,每台都敲IP连接容易记混,推荐在Windows上配置SSH config文件,位置在C:\Users\你的用户名\.ssh\config,没有就新建一个,格式如下:
Host vm-web
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/id_rsa
Host vm-db
HostName 192.168.1.101
User centos
IdentityFile ~/.ssh/id_rsa
之后直接敲ssh vm-web就能连上,不用记IP和用户名,这个习惯对同时管理多台虚拟机的场景帮助很大,也降低了日常连接虚拟机的操作成本。
Q&A:Windows主机SSH连接Linux虚拟机常见疑问
为什么SSH连接很慢,输完密码要等好几秒才进
常见原因是SSH服务开启了DNS反向解析,修改/etc/ssh/sshd_config,找到UseDNS,把yes改为no,重启sshd服务即可,另一个原因是客户端GSSAPI认证超时,在Windows的/etc/ssh/ssh_config里把GSSAPIAuthentication设为no。
虚拟机能连外网但宿主机连不上,是什么原因
可能性最大的是网络模式是NAT但未启用端口转发,NAT模式下虚拟机访问外网通过宿主机转发出站流量,但宿主机发起进站连接默认不会到达虚拟机,解决办法是把网络模式改成桥接,或者在NAT设置里添加一条目的端口22的端口转发规则。
Windows自带SSH和PuTTY相比,用哪个更合适
系统自带的OpenSSH在Windows 10以上版本直接可用,支持密钥、跳板机、代理,而且和Linux端的SSH行为一致,适合大多数日常场景,PuTTY的优势是体积小、绿色免安装、对老系统兼容好,但密钥格式和Windows自带的不完全兼容,需要单独转换工具处理。选哪个取决于你的使用习惯,单机测试用自带命令行就够,生产环境批量管理建议统一用OpenSSH加配置文件的方案。
SSH连接本身不是难事,把服务和网络这两条线理清楚,任何Windows和Linux的组合都能顺利打通,遇到问题别急着重装系统,按上面排查清单逐项验证,多数情况下是某个防火墙规则或者网络模式的小配置挡住路。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/611101.html




