Featured image of post Win11 OpenSSH 服务端实战:安装、连接、卸载与防火墙

Win11 OpenSSH 服务端实战:安装、连接、卸载与防火墙

Windows 11 / 10 自带 OpenSSH:Add-WindowsCapability 安装、PowerShell 启动服务、防火墙规则、离线 MSI 备份安装、彻底卸载

一、为什么要在 Windows 上装 OpenSSH

2014 年微软开始和 PowerShell 团队一起开发 Win32-OpenSSH2018 年起 Win10 1809+ / Win11 默认内置。SSH 是 Linux / macOS 的标配远程协议,把 Windows 暴露成 SSH 服务端有几个常见收益:

  • 从 Linux / macOS 终端直接 ssh 上去操作 Windows(比 mstsc 远程桌面更适合开发机)
  • VS Code Remote - SSH 插件远程开发 Windows 上的代码
  • CI / CD 工具(Jenkins / GitHub Actions)用 SSH 协议往 Windows 推文件
  • PowerShell Remoting over SSH —— 把 PowerShell 会话走 SSH 隧道

OpenSSH 完全替代老旧的 telnet / rsh / WinRM HTTP 模式。Win10 1809+ 和 Win11 都内置了 OpenSSH 客户端和服务端。

二、查 OpenSSH 是否已装

1
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

输出形如:

1
2
3
4
Name        : OpenSSH.Client~~~~0.0.1.0
State       : Installed
Name        : OpenSSH.Server~~~~0.0.1.0
State       : NotPresent

Installed 表示已装,NotPresent 表示未装。

三、在线安装

1
2
3
4
5
# 装客户端(很多机器已经自带)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# 装服务端
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

装完

  • 客户端:C:\Windows\System32\OpenSSH\ + ssh.exe 在 PATH 中
  • 服务端:C:\Windows\System32\OpenSSH\ + sshd.exe 守护进程

四、离线安装

适用场景:生产 Windows Server 不能上网、企业内网无外网、Win10 老版本没有内置 OpenSSH

4.1 下载离线包

微软官方仓库:https://github.com/PowerShell/Win32-OpenSSH/releases

下载两个文件:

  • OpenSSH-Win64-v9.2.2.0.msi服务端 + 客户端 + 工具
  • OpenSSH-Win32-v9.x.x.x.msi32 位——老机器)

路径示例:https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi

4.2 安装

双击 .msi 走 GUI 安装向导;或者静默安装:

1
msiexec /i OpenSSH-Win64-v9.2.2.0.msi /qn

安装位置%SYSTEMROOT%\System32\OpenSSH\(默认 C:\Windows\System32\OpenSSH\

五、启动服务

5.1 启动 sshd

1
2
3
4
5
6
7
8
# 启动 SSH 守护进程
Start-Service sshd

# 设为自动启动(重启后自动拉起)
Set-Service -Name sshd -StartupType 'Automatic'

# 检查服务状态
Get-Service sshd

5.2 验证防火墙规则

1
Get-NetFirewallRule -Name *ssh*

应该看到一条 OpenSSH-Server-In-TCP 的入站规则,默认已 enable

5.3 手动添加防火墙规则(如果没有)

1
2
3
4
5
6
7
New-NetFirewallRule -Name sshd `
    -DisplayName 'OpenSSH Server (sshd)' `
    -Enabled True `
    -Direction Inbound `
    -Protocol TCP `
    -Action Allow `
    -LocalPort 22

六、连接测试

6.1 从 Linux / macOS 连接

1
ssh username@windows-host-ip

或者指定端口:

1
ssh -p 22 username@windows-host-ip

6.2 第一次连接的 fingerprint 确认

1
2
3
The authenticity of host '...' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

输入 yes公钥会保存到 ~/.ssh/known_hosts,下次不再提示。

6.3 PowerShell 验证 OpenSSH 版本

1
ssh -V

输出形如:OpenSSH_for_Windows_8.0OpenSSH_for_Windows_9.2p1

七、SSH 密钥认证

强烈推荐:用公私钥对代替密码认证,安全性 + 自动化双提升

7.1 在客户端生成密钥对

1
ssh-keygen -t ed25519 -C "your_email@example.com"

ed25519 是 2014+ 推荐算法,比 RSA 短而快。公私钥生成在 ~/.ssh/id_ed25519~/.ssh/id_ed25519.pub

7.2 把公钥传到 Windows

1
2
# Linux / macOS 端
ssh-copy-id username@windows-host-ip

或者手动:

1
cat ~/.ssh/id_ed25519.pub | ssh username@windows-host-ip "umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; type C:\Windows\system32\OpenSSH\ssh-keyscan.exe > nul"

7.3 关闭密码认证(可选)

服务端 C:\ProgramData\ssh\sshd_config

1
2
PasswordAuthentication no
PubkeyAuthentication yes

改完重启 sshd:

1
Restart-Service sshd

八、PowerShell Remoting over SSH

Win10 / Win11 + PowerShell 7+ 支持 PSRemoting over SSH

8.1 服务端准备

1
2
3
4
5
# 启用 PSRemoting
Enable-PSRemoting -Force

# 把 SSH 当 transport
# (Win10 1809+ / Win11 默认已配)

8.2 客户端连接

1
2
# 客户端
Enter-PSSession -HostName username@windows-host-ip -SSHTransport

进入交互式会话,跟本地 PowerShell 用法完全一样

8.3 脚本化调用

1
2
3
Invoke-Command -HostName username@windows-host-ip -SSHTransport -ScriptBlock {
    Get-Service | Where-Object Status -eq 'Running' | Select-Object Name, DisplayName
}

九、常见问题排查

9.1 sshd 启动失败:sshd: no hostkeys available

1
2
# 手动生成 host 密钥
ssh-keygen -A

9.2 客户端报 “Permission denied (publickey)”

  1. 检查 ~/.ssh/authorized_keys 文件权限(Windows 下用 icacls):
    1
    2
    3
    4
    
    icacls "C:\Users\username\.ssh\authorized_keys" /inheritance:r
    icacls "C:\Users\username\.ssh\authorized_keys" /grant "username:(R)"
    icacls "C:\Users\username\.ssh" /inheritance:r
    icacls "C:\Users\username\.ssh" /grant "username:(OI)(CI)F"
    
  2. 检查 sshd_configPubkeyAuthentication yes
  3. 看服务端日志:Get-EventLog -LogName Application -Source OpenSSH -Newest 20

9.3 连接慢 / 卡顿

服务端 sshd_config 加:

1
UseDNS no

关掉反向 DNS 查询——Windows Server 经常因为 DNS 配置不当卡几十秒。

十、彻底卸载

1
2
3
4
5
# 卸服务端
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

# 卸客户端
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

如果是 MSI 安装:

1
2
3
4
5
# 查 product code
Get-WmiObject -Class Win32_Product | Where-Object Name -like 'OpenSSH*'

# 卸载
msiexec /x {PRODUCT_CODE} /qn

卸载后 C:\ProgramData\ssh\ 的配置和 C:\Users\<USER>\.ssh\ 的客户端密钥仍保留——Add-WindowsCapability 重新装会复用

十一、SSH 客户端常用命令(Win11 自带)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 连接
ssh user@host

# 指定私钥
ssh -i ~/.ssh/id_ed25519 user@host

# 端口转发(本地 8080 转到远端 80)
ssh -L 8080:localhost:80 user@host

# SFTP 文件传输
sftp user@host

# SCP 文件拷贝
scp file.txt user@host:/path/to/dest/

11.1 VS Code Remote - SSH

VS Code 装 Remote - SSH 扩展后,Ctrl+Shift+P → “Remote-SSH: Connect to Host” 就能连到 Windows 远程开发。

11.2 scp 跨机传文件

1
2
3
4
5
6
7
8
# 本地 → 远端
scp C:\file.txt user@host:D:\dest\

# 远端 → 本地
scp user@host:D:\file.txt C:\dest\

# 整目录
scp -r C:\dir user@host:D:\dest\

十二、Win10 / Win11 自带 OpenSSH 局限性

  • 没有完整 sftp-server:Win10 1809+ 的 OpenSSH 支持 SFTP 子系统,但 2018-2020 期间有 bug2021+ 才稳定
  • 没有 ssh-agent 转发:默认不启用
  • 没有 ControlMaster / ControlPersist:多窗口复用得手动
  • 不支持 AuthorizedKeysCommand:大集群的集中密钥分发得自己写脚本

如果对 SSH 有重度需求(如集群管理、跳板机、堡垒机),用 WSL2 装 OpenSSH 服务端更稳:

1
2
3
# WSL2 里
sudo apt install openssh-server
sudo systemctl enable ssh

十三、常见 5 个坑

  1. UseDNS yes 卡顿——改 sshd_config 设为 no
  2. authorized_keys 权限错误——Windows 下用 icacls 而非 Linux 风格的 chmod 600
  3. PowerShell Remoting 默认走 WinRM——加 -SSHTransport 参数才走 SSH
  4. MSI 装的服务端和 PowerShell 装的不冲突——优先用 Add-WindowsCapability 装,MSI 是离线备用方案
  5. OpenSSH 服务端绑 0.0.0.0——默认所有网卡都监听,生产环境改 ListenAddress 192.168.x.x 限内网

十四、总结

  • Win10 1809+ / Win11 自带——Add-WindowsCapability 一行装
  • 离线安装OpenSSH-Win64-9.x.x.x.msi
  • sshd 自动启动 + 防火墙默认开启 22 端口——一行命令搞定
  • 强烈推荐 SSH 公私钥认证,关密码
  • PSRemoting over SSH——PowerShell 7 + 跨平台远管
  • 服务端局限:SFTP bug 修复在 2021+,复杂需求用 WSL2 的 openssh-server

参考资料

使用 Hugo 构建
主题 StackJimmy 设计