Ssh

Windows10 OpenSSH 伺服器的 kex_exchange_identification 錯誤

  • September 28, 2021

我使用Microsoft guide在我的 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

根據this answer to another similar thread,當伺服器在加密交換期間關閉TCP連接或類似情況時會發生此錯誤。因此,我查看了 Windows 的防火牆,但TCP埠 22 啟用了入站規則(此外,如果它是缺少規則的問題,SSH 客戶端將超時,沒有錯誤kex_exchange_identification):

防火牆

所以我嘗試在伺服器(10.0.3.130)上執行 Wireshark。看起來伺服器接受了 TCP 握手,然後另一台機器(10.0.3.10)發送一些協議 SSH 數據包,然後伺服器關閉連接:

Wireshark OpenSSH 啟動

為了看看會發生什麼,我去了 Windows 的Services應用程序並停止了OpenSSH SSH Server服務,然後嘗試了同樣的事情,但是使用 Wireshark 的結果是一樣的:

Wireshark OpenSSH 停止

我注意到但我不太明白的一件事是,netstat -ab在管理員 PowerShell 中執行表明埠 22 上有一個活動偵聽器,即使 OpenSSH 已停止(我猜只是 Windows 的事情……) :

netstat 命令

所以,是的……我在這一點上被踩了。有任何想法嗎?

TL;DR:經過更多搜尋,並嘗試像其他人建議的那樣重新啟動,我找到了一個簡單的解決方法:

  1. 通過將行添加到使 Windows 在netstat -ab未顯示為已佔用的埠上啟動 OpenSSH 伺服器Port portNumber``%programdata%\ssh\sshd_config $$ * $$(當然替換portNumber為所選埠)。我個人選擇了 222 埠,因為它很容易記住。
  2. portNumberWindows 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根據微軟的這個指南。因此C:/Windows/System32/OpenSSH/sshd_config_default,就像它的名字所暗示的那樣,當我們不更改任何配置%programdata%\ssh\sshd_config或該文件不存在時,它似乎只是為了顯示 OpenSSH 伺服器配置是什麼。

引用自:https://serverfault.com/questions/1078724