有時替客戶安裝的 Linux 伺服器並不是直接「向」出街的,例如 samba 等的 File Server 一般是在 NAT 之後。當有狀況或維護時便要親身上客戶那裡,非常不便。當然可以請求客戶在 gateway 那裡開放 ssh port ,但我曾遇上的情況是客戶已經不知/不能 (eg. router 是 ISP的)改動 router 的設定。這時如果要做 remote maintenance 便要做一個 reverse ssh tunnel.
建立這個 reverse tunnel 基本要求就是要一部有真 ip (real ip address)的中間機 (middle machine)
Step 1
在客戶的 Linux Server 內
ssh -R 12000:localhost:22 middle_machine
Step 2
Reverse tunnel 已經建立,只要在 Middle machine 鍵入
ssh user@localhost -p 12000
便可以由 middle machine 經 port 12000 這條 reverse tunnel 進入客戶伺服器。
Step 3
各位讀者都看到 step 1 是最重要的一個步驟。但這是手動的,關了機後再開機便斷了 reverse ssh tunnel. 為了在客戶伺服開機時自動運行 step 1. 在客戶的 Linux server 的 rc.local 檔加上
su myuser -c 'ssh -t -t -n -R 12000:localhost:22 -p 22 autouser@middle_machine' &
這個連線是不需要鍵入密碼的,故此 autouser@middle_machine 是用 ssh key 連線的。有關 ssh key 連線的方法可以參考這裡。
myuser 是在客戶 Linux Server 的一個 account ,而這個 account 的 rsa key 便放了在 middle_machine 的 autouser account.