解决 Windows Server Core 2025 上 OpenSSH 连接问题

最近在 Windows Server Core 2025 上配置 OpenSSH 服务器时遇到了一些连接问题。虽然服务器端的 OpenSSH 服务已经启动,但始终无法从我的 macOS 机器连接上来。经过一番排查,最终成功解决了这个问题,现在将整个过程记录下来,希望能帮助到遇到类似情况的朋友。

问题描述

我在 Windows Server Core 2025 上安装并启动了 OpenSSH 服务器。为了验证是否可以远程连接,我尝试从我的 macOS 机器使用 ssh 命令连接,但连接一直超时或被拒绝。

我首先尝试使用 nc 命令检查服务器的 22 端口是否开放:

nc -vz <服务器IP地址> 22
````

结果是连接没有响应,就像卡住了一样。然而,当我尝试连接服务器的 3389 端口(远程桌面协议 RDP)时,连接却立即成功,这表明我的 macOS 机器和 Windows Server 之间基本的网络连接是正常的。

## 排查过程

为了找到问题所在,我在 `Windows Server Core` 上进行了以下检查:

1. **确认 `OpenSSH` 服务状态:** 我使用 `PowerShell` 命令检查了 `OpenSSH` 服务是否正在运行:
```powershell
Get-Service sshd

确认服务状态为 “Running”。

  1. 检查防火墙规则: 我检查了 Windows 防火墙规则以及 ssh 端口情况:
PS C:\Users\Administrator> Get-NetFirewallRule -Name *ssh*


Name : OpenSSH-Server-In-TCP
DisplayName : OpenSSH SSH Server (sshd)
Description : Inbound rule for OpenSSH SSH Server (sshd)
DisplayGroup : OpenSSH Server
Group : OpenSSH Server
Enabled : True
Profile : Private
Platform : {}
Direction : Inbound
Action : Allow
EdgeTraversalPolicy : Block
LooseSourceMapping : False
LocalOnlyMapping : False
Owner :
PrimaryStatus : OK
Status : The rule was parsed successfully from the store. (65536)
EnforcementStatus : NotApplicable
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
RemoteDynamicKeywordAddresses : {}
PolicyAppId :
PackageFamilyName :
PS C:\Users\Administrator> Get-NetFirewallRule -Name *ssh* | Get-NetFirewallPortFilter

Protocol : TCP
LocalPort : 22
RemotePort : Any
IcmpType : Any
DynamicTarget : Any
  1. 测试本地 SSH 连接: 为了排除服务器自身的问题,我在 Windows Server Core 上尝试连接本地的 OpenSSH 服务器:
ssh 127.0.0.1

连接成功,这表明 OpenSSH 服务器本身工作正常。

  1. 测试连接到外部 IP: 我又尝试从 Windows Server Core 连接到其自身的外部 IP 地址:
    ssh <服务器外部IP地址>

连接也成功了。

  1. 详细检查防火墙规则: 我查看了更详细的防火墙规则信息:
    Get-NetFirewallRule -Name *ssh*

在输出中,我注意到 Profile 字段的值是 Private

  1. 检查网络连接配置文件: 我使用以下命令检查了 Windows Server Core 当前连接的网络配置文件的类型:
    Get-NetConnectionProfile

输出显示:

Name                     : Network
InterfaceAlias : Ethernet Instance 0
InterfaceIndex : 3
NetworkCategory : Public
DomainAuthenticationKind : None
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

NetworkCategory 的值为 Public

解决方案

通过上述排查,发现问题在于防火墙规则 OpenSSH-Server-In-TCP 只适用于“专用”网络配置文件(Private),而我的 Windows Server Core 当前连接的网络被识别为“公共”网络(Public)。

解决办法是将该防火墙规则的应用范围扩展到“公共”网络。我使用了以下 PowerShell 命令来修改现有的规则:

Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -Profile Private,Public

执行此命令后,我再次从我的 macOS 机器尝试 SSH 连接,连接成功了!