概要
本文介绍如何排查影响通过 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:验证基本功能
-
若要验证 OpenSSH 是否已正确安装,请打开 Windows PowerShell 命令提示符窗口,然后运行以下命令:
Get-Service -Name sshd重要
请确保安装最新的 OpenSSH 版本,并使其保持更新。
-
若要验证 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。
- 定期审核防火墙规则。
-
若要检查现有防火墙规则,请转到 OpenSSH 客户端计算机,并在 PowerShell 命令提示符处运行以下 cmdlet:
Get-NetFirewallRule -DisplayName "*SSH*" | Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 22} -
如果找不到现有的 SSH 规则,请打开管理 PowerShell 命令提示符窗口。 然后,运行以下 cmdlet:
New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -DisplayName "OpenSSH Server (SSH)" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -
若要验证规则是否已正确配置,请再次运行
Get-NetFirewallRule。
步骤 3:查看事件日志中出现的错误
在事件查看器中,查看 应用程序和服务日志>OpenSSH 中的条目。
步骤 4:如果端口未侦听,请对其进行配置
在前面的步骤中,如果 netstat 没有将端口 22 标记为“监听”,并且防火墙规则已正确配置,请执行以下步骤:
-
若要检查服务状态,请在 PowerShell 命令提示符处运行以下命令:
Get-Service -Name sshd -
若要检查 OpenSSH 配置,请打开 C:\ProgramData\ssh\ 文件夹,然后使用文本编辑器打开sshd_config文件。
-
转到
Port文件部分。 如果端口信息被注释掉,请取消注释,然后确保该值为22。重要
如果使用端口转发,请参阅 sshd_config 手动页了解配置信息。
-
若要测试设置,请在 PowerShell 命令提示符处运行以下 cmdlet:
sshd -t -
若要重启 OpenSSH 服务器服务,请在 PowerShell 命令提示符处运行以下 cmdlet:
Restart-Service sshd
步骤 5:测试防火墙问题
-
若要创建临时测试规则,请在 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。 使用此方法可以避免禁用整个防火墙。
-
测试一些 OpenSSH 命令。 如果它们正常工作,请查看并调整永久防火墙规则。
-
完成后,通过在 PowerShell 命令提示符处运行以下 cmdlet 来删除测试规则:
Remove-NetFirewallRule -Name "SSH-Test"
步骤 6:测试其他网络和网络地址转换(NAT)问题
-
确保外部防火墙、路由器或 NAT 设备将端口 22 转发到 Windows 主机。
-
使用实际的主机名或 IP 地址从另一台客户端计算机测试运行 OpenSSH 命令。 运行类似于以下示例的命令:
ssh username@192.168.1.100 # or ssh username@servername.domain.com -
若要进一步测试端口连接,请在 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。