我在我的 Windows 10 PC(可能是“家庭”版本,而不是 Windows 服务器)上安装了 OpenSSH-server,使用微软指南。我没有改变C:/Windows/System32/OpenSSH/sshd_config_default
(尽管我认为这与此无关)。我能从同一台机器上的终端登录到机器:
我有另一台机器在同一个 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 数据包,然后服务器关闭了连接:
为了看看会发生什么,我转到 WindowsServices
应用程序并停止了OpenSSH SSH Server
服务,然后尝试了同样的事情,但 Wireshark 的结果是一样的:
我注意到的一件事,但我不太明白,那就是netstat -ab
在管理员 PowerShell 中运行显示端口 22 上有一个活动侦听器,即使 OpenSSH 已停止(我猜只是 Windows 的事情......):
是的... 我现在很困惑。有什么想法吗?
答案1
TL;DR:经过进一步搜索并尝试按照其他人建议的方式重新启动后,我找到了一个简单的解决方法:
- 通过在[*]中
netstat -ab
添加行(当然要替换为所选端口),让 Windows 在未显示为已占用的端口上启动 OpenSSH 服务器。我个人选择了端口 222,因为它很容易记住。Port portNumber
%programdata%\ssh\sshd_config
portNumber
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 服务器配置。