启动与系统组件

通过 Windows 防火墙排查 OpenSSH 通信故障 - Windows Server

· 52CE 我爱测

概要 本文介绍如何排查影响通过 Windows 防火墙的 OpenSSH 命令的问题。 默认情况下,OpenSSH 使用 TCP 端口 22。 如果阻止或未侦听此端口,SSH 命令将失败。 默认情况下,OpenSSH 同时侦听 IPv4(0.0.0.0:22)和 IPv6(:::22)。 Windows 防火墙设置、服务状态和网络权限都对确保端口 22 既侦听又可访问起着关键作用。 许多因素可能会阻止 OpenSSH 通信,例如以下问题: - OpenSS

概要

本文介绍如何排查影响通过 Windows 防火墙的 OpenSSH 命令的问题。

默认情况下,OpenSSH 使用 TCP 端口 22。 如果阻止或未侦听此端口,SSH 命令将失败。 默认情况下,OpenSSH 同时侦听 IPv4(0.0.0.0:22)和 IPv6([::]:22)。 Windows 防火墙设置、服务状态和网络权限都对确保端口 22 既侦听又可访问起着关键作用。 许多因素可能会阻止 OpenSSH 通信,例如以下问题:

  • OpenSSH 服务未运行或配置错误。
  • 端口 22 由于服务或防火墙问题而未侦听。
  • Windows 防火墙阻止入站 SSH 流量。
  • 冲突的应用程序或策略使用端口 22。
  • 网络连接问题、NAT 设备或其他防火墙设备阻止访问端口 22。

如何通过 Windows 防火墙排查 OpenSSH 通信问题

步骤 1:验证基本功能

  1. 若要验证 OpenSSH 是否已正确安装,请打开 Windows PowerShell 命令提示符窗口,然后运行以下命令:

    Get-Service -Name sshd
    

    重要

    请确保安装最新的 OpenSSH 版本,并使其保持更新。

  2. 若要验证 OpenSSH 是否正在侦听端口 22,请在 PowerShell 命令提示符或 Windows 命令提示符处运行以下命令:

    netstat -an | findstr :22
    

    以下示例演示端口 22 侦听流量时对此命令的响应:

    TCP    0.0.0.0:22             0.0.0.0:0              LISTENING
    TCP    [::]:22                [::]:0                 LISTENING
    

步骤 2:确保 Windows 防火墙允许 OpenSSH 使用端口 22

重要

  • 如果可能,请限制对受信任 IP 地址的访问。
  • 避免对非 OpenSSH 流量使用端口 22。
  • 定期审核防火墙规则。
  1. 若要检查现有防火墙规则,请转到 OpenSSH 客户端计算机,并在 PowerShell 命令提示符处运行以下 cmdlet:

    Get-NetFirewallRule -DisplayName "*SSH*" | Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 22}
    
  2. 如果找不到现有的 SSH 规则,请打开管理 PowerShell 命令提示符窗口。 然后,运行以下 cmdlet:

    New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -DisplayName "OpenSSH Server (SSH)" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
    
  3. 若要验证规则是否已正确配置,请再次运行 Get-NetFirewallRule 。

步骤 3:查看事件日志中出现的错误

在事件查看器中,查看 应用程序和服务日志>OpenSSH 中的条目。

步骤 4:如果端口未侦听,请对其进行配置

在前面的步骤中,如果 netstat 没有将端口 22 标记为“监听”,并且防火墙规则已正确配置,请执行以下步骤:

  1. 若要检查服务状态,请在 PowerShell 命令提示符处运行以下命令:

    Get-Service -Name sshd
    
  2. 若要检查 OpenSSH 配置,请打开 C:\ProgramData\ssh\ 文件夹,然后使用文本编辑器打开sshd_config文件。

  3. 转到 Port 文件部分。 如果端口信息被注释掉,请取消注释,然后确保该值为22。

    重要

    如果使用端口转发,请参阅 sshd_config 手动页了解配置信息。

  4. 若要测试设置,请在 PowerShell 命令提示符处运行以下 cmdlet:

    sshd -t
    
  5. 若要重启 OpenSSH 服务器服务,请在 PowerShell 命令提示符处运行以下 cmdlet:

    Restart-Service sshd
    

步骤 5:测试防火墙问题

  1. 若要创建临时测试规则,请在 PowerShell 命令提示符处运行以下 cmdlet:

    New-NetFirewallRule -Name "SSH-Test" -DisplayName "SSH Test Rule" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Any
    

    注释

    此 cmdlet 创建名为“SSH 测试规则”的临时规则,以打开端口 22。 使用此方法可以避免禁用整个防火墙。

  2. 测试一些 OpenSSH 命令。 如果它们正常工作,请查看并调整永久防火墙规则。

  3. 完成后,通过在 PowerShell 命令提示符处运行以下 cmdlet 来删除测试规则:

    Remove-NetFirewallRule -Name "SSH-Test"
    

步骤 6:测试其他网络和网络地址转换(NAT)问题

  1. 确保外部防火墙、路由器或 NAT 设备将端口 22 转发到 Windows 主机。

  2. 使用实际的主机名或 IP 地址从另一台客户端计算机测试运行 OpenSSH 命令。 运行类似于以下示例的命令:

    ssh username@192.168.1.100
    # or
    ssh username@servername.domain.com
    
  3. 若要进一步测试端口连接,请在 PowerShell 命令提示符处运行以下 cmdlet:

    Test-NetConnection -ComputerName <hostname_or_IP> -Port 22
    

日志记录和诊断

有关 OpenSSH 的详细日志记录的信息,请参阅 如何启用 OpenSSH 详细日志记录。

有关连接尝试和错误的信息,请查看 %ProgramData%\ssh\logs 中的日志。

示例方案

方案 1:拒绝 SSH 连接 原因:防火墙阻止端口 22。 解决方案:打开或创建 TCP 端口 22 的入站规则。

方案 2:端口 22 不在监听 原因:OpenSSH 服务未运行或配置错误。 解决方案:启动服务,修复配置,然后运行 sshd -t 以验证结果。 如果更改了配置,请重启服务。

方案 3:间歇性连接 原因:网络设备或 NAT 不会转发端口 22。 解决方案:检查路由器或防火墙设置,然后通过Test-NetConnection进行测试。 有关配置信息,请参阅 sshd_config。

资料来源与适用范围

资料来源
微软官方中文故障文档
适用范围
按正文的 Windows / Windows Server 适用版本;保留原文兼容性要求
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。