Ssh

如果未正常關閉,SSH 多路復用會掛起

  • February 13, 2020

我正在嘗試通過多路復用的 SSH 設置對我家電腦的遠端訪問。這是設置:從我的筆記型電腦,我連接到調製解調器上的一個埠;這個埠被轉發到我的路由器,然後轉發到本地桌面,我用我的密鑰進行身份驗證。由於多路復用,我可以打開其他連接到 home box,而無需重新驗證。這一切都像我期望的那樣工作。

但是,當我重新啟動筆記型電腦時會出現問題。如果我重新啟動,那麼我將無法再通過 SSH 連接到 home box - 嘗試這樣做會掛起一段時間,而不會提示我進行身份驗證,然後最終超時。

我可以通過重新啟動 home box 來解決這個問題(儘管這需要物理存在,但這反而會破壞這一點)。如果我優雅地斷開 SSH 連接,也可以避免觸發問題ssh -O exit $IP -p $PORT

鑑於上述情況,我有兩個問題:首先,這是預期的行為還是我遇到了錯誤?其次,有什麼辦法可以避免這個問題嗎?謝謝!

(這個問題表面上類似於SSH 多路復用超時配置,但這個問題是關於伺服器正在重新啟動/無法訪問,而我的問題是關於客戶端重新啟動而沒有優雅地發出多路復用連接結束的信號。)

[編輯]按照下面評論中的要求,這是嘗試與-vv標誌連接的(不是超級有用的)輸出。$IP我通過分別用$USER , and$PORT`替換我的 IP、使用者名和埠來稍微修改了輸出。

OpenSSH_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data /home/$USER/.ssh/config
debug1: /home/$USER/.ssh/config line 4: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolve_canonicalize: hostname $IP is address
debug1: auto-mux: Trying existing master
debug1: Control socket "/home/$USER/.ssh/$USER@$IP:$PORT" does not exist
debug2: ssh_connect_direct
debug1: Connecting to $IP [$IP] port $PORT.
debug1: connect to address $IP port $PORT: Connection timed out
ssh: connect to host $IP port $PORT: Connection timed out

當我不觸發此錯誤時(因此可以成功連接),輸出-vv完全相同,除了該Connection timed out行被替換為行說明debug1: Connection established,然後連接繼續進行正常身份驗證。

這是我非常基本的.ssh/config文件的全部內容,以防相關:

Host *
   ControlMaster auto
   ControlPath   ~/.ssh/%r@%h:%p
   ControlPersist yes
   ServerAliveInterval 300
   ServerAliveCountMax 2
   RemoteForward 9999 localhost:22

在深入研究了這一點(並閱讀了優秀的書SSH Mastery)之後,我能夠解決我的問題:即使我ServerAliveInterval在我的客戶端 .ssh/config文件中設置了 a ,但我沒有ClientAliveInterval在我的伺服器 sshd_config文件中設置 a 。

結果,伺服器沒有超時,而是保持連接。結合導航我的家庭網路所需的雙埠轉發,這佔用了我打開的(唯一)埠並阻止了額外的連接。

在我的文件中添加ClientAliveInterval 10一行sshd_config(並記住重新啟動 sshd 服務sudo pkill -1 sshd可以很好地解決問題。希望此資訊可以幫助其他人快速解決此問題。

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