Skip to content

在 Windows 上安装和配置 OpenSSH 服务器

从 Windows Server 2019 和 Windows 10 (1809) 开始,微软官方已经将 OpenSSH 作为一项可选功能内置到了系统中,这使得我们可以非常方便地在 Windows 上搭建一个标准的 SSH 服务器,用于远程管理或文件传输。

本教程将详细介绍如何在 Windows Server 或 Windows 10/11 上安装和配置 OpenSSH Server。


1. 通过图形化界面安装 (Windows 设置)

这是最简单直观的方法,适用于带有桌面体验的 Windows 版本。

  1. 打开 "设置":

    • 点击 "开始" 菜单,选择 "设置" (齿轮图标)。
    • 进入 "应用" -> "可选功能"。
  2. 添加功能:

    • 在 "可选功能" 页面,点击 "+ 添加功能"。
    • 在弹出的列表中,找到并勾选 "OpenSSH 服务器"。
    • 点击 "安装"。
  3. 等待安装完成:

    • 系统会自动下载并安装 OpenSSH 服务器组件。安装完成后,你可以在 "已安装功能" 列表中看到它。

2. 通过 PowerShell 安装 (推荐,适用于 Server Core)

对于 Windows Server Core 或希望通过脚本自动化部署的场景,使用 PowerShell 是最高效的方式。

  1. 以管理员身份打开 PowerShell:

    • 右键点击 "开始" 菜单,选择 "Windows PowerShell (管理员)"。
  2. 检查 OpenSSH 服务器是否可用:

    powershell
    Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'

    如果 State 显示为 NotPresent,则表示可以安装。

  3. 安装 OpenSSH 服务器:

    powershell
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

    注意: OpenSSH.Server~~~~0.0.1.0 是功能的确切名称,请以上一步命令查询到的为准。

  4. 启动并设置服务为自动启动:

    powershell
    # 启动服务
    Start-Service sshd
    
    # (可选) 设置服务为开机自启动
    Set-Service -Name sshd -StartupType 'Automatic'

3. 配置防火墙

安装并启动服务后,默认的 SSH 端口(TCP 22)可能被 Windows Defender 防火墙阻止。你需要创建一个入站规则来允许外部连接。

通过 PowerShell 配置防火墙

执行以下命令来创建一个允许 TCP 22 端口访问的防火墙规则:

powershell
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

4. 验证连接

现在,你可以从任何 SSH 客户端(如 PuTTY、Xshell、或者另一台 Linux/macOS 的终端)尝试连接你的 Windows 服务器了。

bash
ssh your_windows_username@your_server_ip

首次连接时,系统会提示你输入 Windows 账户的密码。

至此,你的 Windows OpenSSH 服务器已经成功搭建并运行起来了。为了提高安全性,强烈建议后续配置基于密钥的免密登录,并禁用密码登录。


5. 配置 sshd_config 文件

OpenSSH 服务器的主要配置文件是 sshd_config,它通常位于 %ProgramData%\ssh\ 目录下。你需要以管理员权限编辑此文件来修改服务器的行为。

  1. 找到 sshd_config 文件:

    powershell
    # 通常路径为 C:\ProgramData\ssh\sshd_config
    notepad "$env:ProgramData\ssh\sshd_config"

    或使用其他你喜欢的编辑器(如 VSCode)。

  2. 常用配置项解释:

    配置项默认值/示例解释
    Port22SSH 服务器监听的端口。为了安全,建议修改为非标准端口(如 2222),修改后请确保防火墙规则也随之更新。
    HostKey%ProgramData%\ssh\ssh_host_rsa_key服务器的主机密钥文件路径。通常不需要修改,系统会自动生成。
    AuthorizedKeysFile.ssh/authorized_keys用户公钥文件的相对路径。此路径是相对于用户主目录而言的。例如,C:\Users\用户名\.ssh\authorized_keys
    PasswordAuthenticationyes是否允许通过密码进行身份验证。强烈建议在配置好密钥登录后将其设置为 no,以提高安全性。
    PubkeyAuthenticationyes是否允许通过公钥进行身份验证。设置为 yes 以启用密钥登录。
    PermitEmptyPasswordsno是否允许空密码用户登录。出于安全考虑,应始终保持 no
    AllowUsers(无)允许哪些用户登录。可以指定多个用户,用空格分隔。AllowUsers user1 user2
    DenyUsers(无)拒绝哪些用户登录。优先级高于 AllowUsers
    AllowGroups(无)允许哪些组的用户登录。
    DenyGroups(无)拒绝哪些组的用户登录。
    PermitRootLoginprohibit-password (或 no)是否允许 root (管理员) 用户直接登录。prohibit-password 表示只允许密钥登录,不允许密码登录。no 表示完全禁止。
    Subsystem sftpsftp internal-sftp配置 SFTP 服务。internal-sftp 表示使用 OpenSSH 内置的 SFTP 服务器。
    ClientAliveInterval0 (或 0)服务器每隔多少秒发送一个空包给客户端,用于保持连接。如果为 0 则不发送。
    ClientAliveCountMax3服务器在没有收到客户端响应的情况下,在断开连接前会发送多少次 ClientAliveInterval 消息。

示例 sshd_config (推荐安全配置)

以下是一个更安全的 sshd_config 示例,推荐在生产环境中使用:

properties
# ----------------------------------------------------------------------------
# 这是 sshd_config 文件的示例配置
# 请根据您的实际需求进行修改
# ----------------------------------------------------------------------------

# 监听端口,建议修改为非默认端口
Port 2222

# HostKey 是服务器的身份标识,通常由安装程序自动生成
# HostKey %ProgramData%\ssh\ssh_host_rsa_key
# HostKey %ProgramData%\ssh\ssh_host_dsa_key
# HostKey %ProgramData%\ssh\ssh_host_ecdsa_key
# HostKey %ProgramData%\ssh\ssh_host_ed25519_key

# ------------------------- 身份验证 ---------------------------
# 允许公钥认证
PubkeyAuthentication yes
# 指定用户公钥文件,相对于用户主目录
AuthorizedKeysFile .ssh/authorized_keys

# 禁用密码认证 (强烈推荐在配置好密钥登录后设置)
PasswordAuthentication no

# 禁止空密码登录
PermitEmptyPasswords no

# 禁止管理员账户直接登录 (如果需要,可以通过跳板机或普通用户切换)
PermitRootLogin no

# ------------------------- SFTP 子系统 --------------------------
# 启用 SFTP 支持
Subsystem sftp sftp-server.exe

# ------------------------- Keep Alive ---------------------------
# 每 60 秒发送一次心跳包
ClientAliveInterval 60
# 如果 3 次无响应,则断开连接
ClientAliveCountMax 3

修改 sshd_config 文件后,请务必重启 sshd 服务以使更改生效:

powershell
Restart-Service sshd