在虚拟机里开启sshd服务,核心操作就是装好OpenSSH服务端、改对配置文件、放行防火墙端口,三步走完就能远程连上。 整个过程跟物理机没有本质区别,但虚拟化环境特有的网络模式和服务管理机制,会让不少人在细节上栽跟头。
为什么虚拟机必须开启sshd
很多人刚接触虚拟机时,习惯直接打开控制台窗口操作,这种方式的短板很明显:虚拟机窗口一关,你就断了所有操作路径;主机分辨率一变,终端显示就错位;想从宿主机复制一段长命令进去,还得走剪贴板共享的流程。
ssh(Secure Shell)协议的出现,本质上是把"坐在屏幕前操作"变成"通过网络远程操作",虚拟机开启sshd之后,你可以像访问一台云服务器那样,从任意终端发起连接,行业共识认为,在自动化运维、CI/CD流水线、代码调试这些高频场景里,sshd几乎是虚拟机的基础服务之一。
你可能会问:虚拟机不是就在我电脑上吗,直接用窗口操作不就行了?但设想一个更具体的场景你在VMware里跑了一个Ubuntu Server,这个虚拟机将来要部署到云上,或者需要交给团队其他成员共同维护,如果不开sshd,大家只能轮流去碰那台物理机,效率极低,再设想一种情况:宿主机在办公室,你想下班回家后接着调一个程序bug,没有sshd就只能干瞪眼。
开启sshd的成本很低,收益却很实在,它让虚拟机的访问方式从"屏幕绑定"变成"网络绑定",这不仅是技术选型问题,更决定了你后续所有运维操作的舒适度。
虚拟机开启sshd的前置条件
动手之前,先确认三件事,免得后面反复折腾。
网卡工作正常
虚拟机必须拿到可用的IP地址,在终端里执行ip addr(Linux)或ipconfig(Windows),查看网卡是否显示类似192.168.x.x、10.x.x.x这样的地址,如果网卡没有IP,先检查虚拟机的网络模式。
VMware Workstation的NAT模式默认让虚拟机走宿主机上网,通常不需要额外配置就能获得地址,VirtualBox的NAT模式默认也做DHCP分配,但如果你改过默认网段,就要确认地址没冲突。
系统版本匹配
OpenSSH服务端在主流Linux发行版和Windows系统上都有官方支持,Ubuntu从18.04之后、CentOS从7之后,软件源里直接能装,Windows 10 1809和Windows Server 2019之后的版本,OpenSSH Server是可选功能,微软官方文档里已经把它列为Windows系统自带组件,不再需要第三方工具。
IP地址提前规划
建议把虚拟机的IP固定下来,或者至少在路由器/虚拟网络编辑器里做DHCP保留,有人喜欢用自动分配,但虚拟机重启后IP变了,之前所有ssh配置、脚本里的连接地址都会失效,固定IP这个动作,能省掉后面大量排查时间。
不同Linux发行版的开启方法
绝大多数云服务器和开发环境跑的都是Linux,这部分最有代表性,Ubuntu/Debian系和CentOS/RHEL系的命令稍有差异,分开写清楚。
Ubuntu/Debian系操作步骤
在终端里依次执行:
sudo apt update sudo apt install -y openssh-server
安装完成后,sshd服务通常会自动启动,你可以用下面的命令确认:
sudo systemctl status ssh
看到active (running)字样,说明服务已经在跑了,这里有个细节:Ubuntu上用ssh作为服务名,而不是sshd,两个名字指向同一个东西,但systemd的服务单元名称确实不同,操作时要留意。
CentOS/RHEL系操作步骤
sudo yum install -y openssh-server sudo systemctl start sshd sudo systemctl enable sshd
CentOS上服务名是sshd,跟Ubuntu不一样。enable这一步必须做,否则虚拟机重启后sshd不会自动拉起,不少人虚拟机重启后连不上,回头看发现就是漏了这个enable。
配置文件关键项
配置文件位于/etc/ssh/sshd_config,多数情况下默认配置就能直接连,但有两个参数建议手动确认:
PermitRootLogin:Ubuntu默认是prohibit-password,允许密钥登录但不允许密码登录,CentOS默认是yes,允许root直接密码登录。PasswordAuthentication:默认都是yes,如果你的虚拟机只在内网暴露,保持yes没问题;如果要暴露到公网,建议改成no,改用密钥对登录。
修改配置后重启服务:
sudo systemctl restart ssh
Windows虚拟机开启sshd操作详解
Windows虚拟机开sshd的场景在本地开发环境里越来越常见,比如你跑了个Windows Server虚拟机做测试,或者用Windows虚拟机模拟客户端环境,用ssh连接显然比RDP远程桌面轻量得多。
第一步:以管理员身份打开PowerShell,执行:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server'
这一步是为了确认系统内置的OpenSSH Server组件是否可用。
第二步:安装组件:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
安装完成后,启动服务并设置开机自启:
Start-Service sshd Set-Service -Name sshd -StartupType 'Automatic'
第三步:确认防火墙规则,Windows自带防火墙通常会自动放行22端口,但如果你之前改过防火墙策略,需要手动检查:
Get-NetFirewallRule -Name ssh
没有对应规则的话,手动添加一条:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
在Windows上,默认shell是cmd而不是PowerShell,如果你想连接后直接进PowerShell,需要在注册表里改默认shell路径,HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH下设置DefaultShell为powershell.exe的完整路径,这里有个常见误区:不少人以为ssh装好了连不上是防火墙问题,其实是Windows上/etc/ssh/sshd_config里的配置路径和Linux不同,Windows版读取的配置路径是C:\ProgramData\ssh\sshd_config,排查时要先确认文件位置对得上。
虚拟化平台环境下的网络配置
虚拟机不开sshd通常不是服务本身的问题,而是网络不通,不同虚拟化平台的网络模式影响很大。
VMware Workstation/Player
VMware的NAT模式默认网段是168.x.0/24,其中x取决于你安装VMware时候的默认设置,如果你在虚拟机里开启了sshd,宿主机上用ssh 192.168.x.x连接,但怎么也连不上,多半是虚拟网络编辑器里NAT设置出了问题,或者虚拟机防火墙拦了入站连接。
在VMware里,比较推荐的排查顺序是:先看虚拟机能否ping通宿主机,再看宿主机能否ping通虚拟机,最后才是ssh端口测试。桥接模式下虚拟机直接暴露在物理局域网,ssh连接方式跟普通物理机一样,但前提是网卡配置了正确的IP和网关。
你需要确保在"虚拟网络编辑器"(VMware菜单栏:编辑→虚拟网络编辑器)里NAT模式的子网IP和DHCP设置没有冲突,默认情况下,VMware安装后会自动创建VMnet8作为NAT模式网关,一般不需要改动,但如果你装过其他虚拟化软件,网段可能会撞在一起。
VirtualBox
VirtualBox的NAT模式有一个特点:宿主机无法直接访问NAT模式下的虚拟机,如果你在VirtualBox里开了sshd,然后从宿主机试图连接,默认一定是失败的,VirtualBox有专门的"端口转发"机制来支持这种场景。
在虚拟机设置→网络→高级→端口转发里,添加一条规则:宿主机IP填0.0.1,端口填2222,虚拟机IP填实际地址,端口填22,这样你在宿主机上执行:
ssh -p 2222 user@127.0.0.1
就能连上虚拟机,需要注意的是,VirtualBox的端口转发只监听在宿主机本地,如果你在其他机器上想连接这台虚拟机,还需要另外做NAT映射。
Hyper-V
Hyper-V的默认虚拟交换机是NAT模式,但和VMware不同,Hyper-V的NAT交换机只允许虚拟机主动向外发起连接,外部连接虚拟机的22端口需要额外的端口代理规则,通过netsh interface portproxy命令来实现,这里容易踩坑的是,很多人在Hyper-V里开了sshd但忘了虚拟机本身的防火墙设置,Windows Server核心版默认防火墙更严格,vEthernet(虚拟交换机)适配器的网络配置文件类型是"公用",公用配置文件的入站规则全部拦截。
验证sshd是否成功开启
服务装好、配置改完,连接之前先做一个快速自检。
第一步:确认服务监听端口,在Linux上执行:
ss -tlnp | grep 22
看到类似LISTEN 0 128 0.0.0.0:22的输出,说明sshd正常监听,如果你改了端口,这里会显示对应端口号。
第二步:确认防火墙放行,Ubuntu上检查:
sudo ufw status
CentOS上检查:
sudo firewall-cmd --list-all
防火墙里没有放行22端口,服务状态再好也是连不上,这一步出问题的频率最高,相当一部分人折腾了半天,最后发现就是防火墙规则没加。
第三步:从宿主机发起实际连接,Linux/Mac上直接:
ssh user@虚拟机IP
Windows宿主机上可以用Windows Terminal里的ssh命令,或者用Putty,第一次连接会提示确认主机指纹,输入yes,然后输入密码,能进到命令行就算成功。
虚拟机开启sshd失败的常见原因
遇到连不上的情况,先别急着删了重装,按以下清单逐项排查。
服务没起来
你执行了systemctl start ssh,但还没来得及确认状态就跑去连接,大概率失败,先执行systemctl status ssh,看有没有红字报错,常见报错有Failed to start OpenSSH server daemon,可能是配置语法错误,用sshd -t验证一下配置。
端口没放行
刚才说过的防火墙是重灾区,Ubuntu默认没开防火墙还好,CentOS的firewalld默认就有拒绝规则,执行sudo firewall-cmd --permanent --add-port=22/tcp && sudo firewall-cmd --reload就能解决。
IP地址搞错
虚拟机IP可能变了,用ip addr看当前地址,别凭记忆猜,NAT模式下DHCP分配通常很稳定,但虚拟机重启偶尔会拿到不同地址。
受害于SELinux
CentOS上如果配置了非标准端口,SELinux会拦截,执行sudo semanage port -a -t ssh_port_t -p tcp 端口号把端口加进去,或者临时用setenforce 0验证是不是SELinux的问题。
账号密码错误
这个最基础但最容易忽略,Ubuntu默认你配置的sudo用户就能直接登录,但如果你创建了一个没有设置密码的普通用户,密码登录零机会,给用户设个密码:
sudo passwd 用户名
如果你在配置了密钥登录的~/.ssh/authorized_keys之后,把PasswordAuthentication改成no,那么公钥不在授权列表里的用户也连不上,这算是一个比较隐蔽的坑。
虚拟机ssh连不上怎么办
虚拟机ssh连不上本质上就两个原因:服务端没跑起来,或者网络不通,但具体到排查路径,建议按顺序来:
- 先确认虚拟机本身能上网,在虚拟机里ping一下宿主机IP,通了说明网络层面没问题。
- 再确认sshd确实在监听。
ss -tlnp | grep 22,看到LISTEN状态就没问题。 - 然后确认防火墙没拦,用
nc -vz 虚拟机IP 22从宿主机测一下端口通不通,这个命令比ping更直接,因为ping用的是ICMP,即使通也不代表22端口可达。 - 最后看认证日志。
/var/log/auth.log(Ubuntu)或/var/log/secure(CentOS)里记录了每一次连接尝试的细节,比如Connection closed by authenticating user这种提示,帮你定位是密码错还是密钥匹配失败。
这里有一个从实际排查中总结出来的经验:很多时候不是你的操作有误,而是虚拟机的防火墙规则或者网络配置在作祟,虚拟化软件的默认设置往往比硬件防火墙更复杂,比如VMware NAT模式默认不允许外部主动连接,但宿主机和虚拟机之间的通信是没问题的。
Q&A
虚拟机怎么开启sshd服务更稳定
建议直接用系统软件包管理器安装官方OpenSSH,而不是编译源码或下载第三方打包版本,官方源里的openssh-server经过充分测试,和系统的PAM、systemd集成更顺畅,无论Ubuntu还是CentOS,都建议用默认源安装,不要为了追求"最新版"而添加第三方源,稳定性的优先级更高。
虚拟机开启sshd后密码登录被拒绝什么原因
最常见的原因有两个,一个是你在/etc/ssh/sshd_config里改过PasswordAuthentication但没重启服务;另一个是系统配置了仅允许特定用户登录,在AllowUsers或AllowGroups里把你当前用户排除在外,检查这两处配置,然后执行sudo systemctl restart ssh(Ubuntu)或sudo systemctl restart sshd(CentOS)让配置生效,如果还是不通过,查看认证日志/var/log/auth.log或/var/log/secure,里面有明确的拒绝原因。
Windows虚拟机开启sshd需要额外装软件吗
Windows Server 2019、Windows 10 1809以及更新的版本不需要额外装任何第三方软件,系统自带OpenSSH Server可选功能,在"设置→应用→可选功能"里就能添加,或者用PowerShell命令安装,Windows 7等老版本则不支持官方OpenSSH,需要借助第三方实现,这种情况建议升级系统。在2026年的背景下,仍然有机器跑着老版本Windows导致vmware虚拟机开启sshd失败,多数情况是系统组件版本过旧或缺失运行库。
虚拟机的sshd运维,本质上和物理机没有知识层面的断层,差异集中在虚拟网络模式和系统默认安全策略上,把服务装好、端口放行、账号配齐,剩下的就是反复验证和记录,配置稳固之后,还是建议把密码认证改成密钥认证,这对任何暴露在网上的服务都是基本要求。