解決可能的 TIME_WAIT 問題的解決方法,防止重新建立損壞的 SSH 隧道?
雖然不打算交叉發布,但在將此問題發送到 SecurityFocus 上的 OpenSSH 列表後,我注意到該列表的流量相當低(上一篇文章大約是 5 個月前)。話雖如此,我決定在這裡重新發布,因為這個問題可能會吸引更多的眼球(如果得到回答,將有更好的機會被其他人使用):
問題:我有一個從內部機器到我的 DMZ 中的主機的反向 SSH 隧道,該隧道設置為在系統啟動時啟動,如果隧道失敗則重新啟動。但是,當隧道中斷時(例如,由於網路中斷),由於 DMZ 主機上的埠正在使用中,它無法重新建立。從我對 OpenSSH 郵件列表檔案和其他地方的閱讀來看,這似乎是因為埠處於 TIME_WAIT 狀態。這很好:我可以在設置隧道的腳本中添加一個 sleep 語句。但是,這會導致兩個問題:
1)知道如何確定特定Linux(或其他)系統上的TIME_WAIT間隔定義嗎?雖然我可以只睡 5 分鐘就沒事,但盡可能多地剃掉時間會很好。2) 雖然 OpenSSH 似乎不支持“ClearAllForwardings”選項,但是否有類似的功能,通過該功能,經過身份驗證的連接可以自動拆除並重新創建之前建立的現有連接?
長時間的睡眠可能“足夠好”,但如果可能的話,我更願意以更有效的方式處理 TIME_WAIT 條件。
我感謝任何指導或建議!
我認為您可以使用各種 SSH 設置(例如 TCPKeepAlive、ServerAliveInterval、ServerAliveCountMax 等)來設置如果連接斷開它將殺死一切。我有一個類似的設置,我對兩邊的 SSHD 和 SSH 都做了很多修改,以匹配我想要的。然後我有一個每 5 分鐘執行一次的 cron 作業,如果需要,它會重新啟動隧道。
#!/bin/bash if ps aux | grep "ssh -fnNTx" | grep -v "grep" then echo "Already Running" else echo "Starting now" ssh -fnNTx -L 1514:127.0.0.1:514 user1@X.X.X.X fi
到目前為止,這個解決方案對我來說效果很好。您還可以設置某種類型的 Nagios 檢查或其他腳本,以查看隧道是否打開,如果沒有,請殺死該 pid 以便它可以重新啟動。
編輯:
上一篇文章大量討論了 TIME_WAIT 問題。如何在 TIME_WAIT 中強制關閉套接字?