Windows10 OpenSSH 伺服器的 kex_exchange_identification 錯誤
我使用Microsoft guide在我的 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
根據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 數據包,然後伺服器關閉連接:
為了看看會發生什麼,我去了 Windows 的
Services
應用程序並停止了OpenSSH SSH Server
服務,然後嘗試了同樣的事情,但是使用 Wireshark 的結果是一樣的:我注意到但我不太明白的一件事是,
netstat -ab
在管理員 PowerShell 中執行表明埠 22 上有一個活動偵聽器,即使 OpenSSH 已停止(我猜只是 Windows 的事情……) :所以,是的……我在這一點上被踩了。有任何想法嗎?
TL;DR:經過更多搜尋,並嘗試像其他人建議的那樣重新啟動,我找到了一個簡單的解決方法:
- 通過將行添加到使 Windows 在
netstat -ab
未顯示為已佔用的埠上啟動 OpenSSH 伺服器Port portNumber``%programdata%\ssh\sshd_config
$$ * $$(當然替換portNumber
為所選埠)。我個人選擇了 222 埠,因為它很容易記住。portNumber
在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
根據微軟的這個指南。因此C:/Windows/System32/OpenSSH/sshd_config_default
,就像它的名字所暗示的那樣,當我們不更改任何配置%programdata%\ssh\sshd_config
或該文件不存在時,它似乎只是為了顯示 OpenSSH 伺服器配置是什麼。