服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-23 简米科技 6,559 字 16 分钟阅读

虚拟机如何开启sshd?开启sshd服务的方法是什么

导读在虚拟机里开启sshd服务,核心操作就是装好OpenSSH服务端、改对配置文件、放行防火墙端口,三步走完就能远程连上, 整个过程跟物理机没有本质区别,但虚拟化环境特有的网络模式和服务管理机制,会让不少人在细节上栽跟头,为什么虚拟机必须开启sshd很多人刚接触虚拟机时,习惯直接打开控制台窗口操作,这种方式的短板很……

在虚拟机里开启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连不上本质上就两个原因:服务端没跑起来,或者网络不通,但具体到排查路径,建议按顺序来:

  1. 先确认虚拟机本身能上网,在虚拟机里ping一下宿主机IP,通了说明网络层面没问题。
  2. 再确认sshd确实在监听。ss -tlnp | grep 22,看到LISTEN状态就没问题。
  3. 然后确认防火墙没拦,用nc -vz 虚拟机IP 22从宿主机测一下端口通不通,这个命令比ping更直接,因为ping用的是ICMP,即使通也不代表22端口可达。
  4. 最后看认证日志。/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运维,本质上和物理机没有知识层面的断层,差异集中在虚拟网络模式和系统默认安全策略上,把服务装好、端口放行、账号配齐,剩下的就是反复验证和记录,配置稳固之后,还是建议把密码认证改成密钥认证,这对任何暴露在网上的服务都是基本要求。

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