循環運行 ssh 隧道;餿主意?連接埠已被使用?

循環運行 ssh 隧道;餿主意?連接埠已被使用?

我設定了一個從物理上位於我工作地點(運行 CentOS)的伺服器到家庭(Ubuntu)的 ssh 隧道,這樣我就可以在工作電腦上使用以下命令從家中登入到我的工作隧道:

ssh -R 49666:localhost:22 homename@homeIP -N

我做了鑰匙等。看起來不錯,很有效。我可以雙向使用 scp 文件,等等。

後來我回家時發現隧道不知何故關閉了。我不明白為什麼。後來我問了一位同事,他說他也有同樣的問題,並使用這樣的腳本在他的工作電腦上不斷運行:

while true
 ssh -R 49666:localhost:22 homename@homeIP -N
 sleep 15

他基本上是永久地進行這種運行,以便在隧道破裂時自動重新啟動。

我也嘗試了這個,進行了測試(使用我的家用電腦遠端工作時從工作場所 ssh 到家裡),看起來又沒問題了。但當我回到家時,隧道又壞了。我查看了 auth.log,發現這三行有相同的時間戳,大約是在我回家的半路上:

Accepted publickey from work IP (I erased the rest for my privacy)
error: bind: Address already in use
error: channel_setup_fwd_listener_tcpip: cannot listen to port: 49666

它似乎試圖將我的隧道綁定到連接埠 49666,而其他東西正在使用它。好吧,我明白為什麼會失敗。所以我試圖找到什麼正在使用連接埠 49666,這樣我就可以殺死它。但似乎什麼都沒有。我嘗試了 netstat、lsof 等。難道是在隧道已經存在的時候它就創造隧道了嗎?或者,如果隧道已經存在,隧道循環腳本是否會什麼都不做?

由於沒有任何東西可以使用連接埠 49666,因此我希望當我的工作電腦上的隧道腳本再次循環時,隧道會自動重新建立,但看起來並非如此。

有沒有辦法解決這個問題,而無需實際返回工作伺服器?或者至少,只需進行一次調整即可解決該問題,這樣我就不必定期返回?

伺服器永遠不會關閉,因此理論上,循環腳本應該仍在運行。但它可能會在無法通過隧道後自行終止嗎?

相關內容