Windows10 OpenSSH 服务器出现 kex_exchange_identification 错误

Windows10 OpenSSH 服务器出现 kex_exchange_identification 错误

我在我的 Windows 10 PC(可能是“家庭”版本,而不是 Windows 服务器)上安装了 OpenSSH-server,使用微软指南。我没有改变C:/Windows/System32/OpenSSH/sshd_config_default(尽管我认为这与此无关)。我从同一台机器上的终端登录到机器:

本地主机 SSH

我有另一台机器在同一个 LAN 上运行(均连接到同一个 SoHo 路由器)。从它尝试连接到 Windows 10 失败,出现以下情况:

kex_exchange_identification: Connection closed by remote host
Connection closed by 10.0.3.130 port 22

根据这是另一个类似主题的答案,当服务器在加密交换期间关闭 TCP 连接或类似情况时,会发生此错误。所以我查看了 Windows 的防火墙,但已启用 TCP 端口 22 的入站规则(此外,如果是缺少规则的问题,SSH 客户端只会超时,而不会出现错误kex_exchange_identification):

防火墙

因此,我尝试在服务器 (10.0.3.130) 上运行 Wireshark。看来服务器接受了 TCP 握手,然后另一台机器 (10.0.3.10) 发送了一些协议 SSH 数据包,然后服务器关闭了连接:

Wireshark OpenSSH 已启动

为了看看会发生什么,我转到 WindowsServices应用程序并停止了OpenSSH SSH Server服务,然后尝试了同样的事情,但 Wireshark 的结果是一样的:

Wireshark OpenSSH 已停止

我注意到的一件事,但我不太明白,那就是netstat -ab在管理员 PowerShell 中运行显示端口 22 上有一个活动侦听器,即使 OpenSSH 已停止(我猜只是 Windows 的事情......):

netstat 命令

是的... 我现在很困惑。有什么想法吗?

答案1

TL;DR:经过进一步搜索并尝试按照其他人建议的方式重新启动后,我找到了一个简单的解决方法:

  1. 通过在[*]中netstat -ab添加行(当然要替换为所选端口),让 Windows 在未显示为已占用的端口上启动 OpenSSH 服务器。我个人选择了端口 222,因为它很容易记住。Port portNumber%programdata%\ssh\sshd_configportNumber
  2. portNumber在 中添加 TCP 端口的入站规则Windows Defender Firewall with Advanced Security

我认为我最后展示的内容是错误的:最后一张图片似乎表明,在我的情况下,端口 22(OpenSSH 服务器通常位于该端口)已被另一个不相关的服务器占用(无论出于什么原因)。因此,SSH 客户端正在进行 TCP 握手,该不相关的服务器正在接受该握手,然后客户端发送了一个 OpenSSH 协议数据包(不相关的服务器无法理解),这导致该不相关的服务器简单地关闭 TCP 连接。

现在它确实,我能够从服务器本身连接到端口 22 上的 ssh 服务器。我认为这是因为连接会将localhost数据包发送到环回接口,而无关的服务器可能没有监听该接口。

因此,合理的解决方法是将 OpenSSH 服务器移至另一个未使用的端口,然后在 Windows 防火墙中将入站规则添加到该新端口。然而,真正的解决方案是找到在端口 22 上侦听的无关服务器,然后将其关闭或移动到不同的端口。

[*]: 与我的想法不同,OpenSSH 配置文件是不是 C:/Windows/System32/OpenSSH/sshd_config_default; 它是实际上 %programdata%\ssh\sshd_config根据Microsoft 的此指南。因此C:/Windows/System32/OpenSSH/sshd_config_default,就像它的名字所表示的那样,似乎只在我们没有更改中的任何配置%programdata%\ssh\sshd_config,或者该文件不存在时才显示 OpenSSH 服务器配置。

相关内容