Reverse SSH Tunnel 反向打洞實錄
近來經手了幾個案子,其目標都是設計一台做特定用途的系統,但往往這台機器都會被鎖在防火牆後面,甚至不會連上網際網路,是完全封閉的環境。每當接近結案,將系統交到客戶手中以做最後的壓力測試時,便是痛苦的開始。怎麼說呢?因為當面對最後的大量測試,各種大大小小的臭蟲(Bugs)就會原形畢露,一一浮上臺面。而每次問題發生,便要千里迢迢趕到客戶那了解情況、解決問題。如果問題不大倒還好,一旦問題嚴重,被客戶關到三更半夜也是常有的事,更誇張的還必須每天都去報到。所以,為避免車程來回的時間和人力浪費,是否有可以遠端連線做處理呢?便思考起這問題。
雖然這些機器通常都不會有真實 IP,客戶也不會為了我們特別請 MIS 去開啟 NAT 或防火牆,但還好 SSH 提供了反向(Reverse)的機制讓我們可以連進去。其做法就是讓在客戶那的系統,透過 SSH 先連回我們自家有真實 IP 的主機,然後建立反向的通道即可。如此,我們便可從自家的主機,從 SSH 連回放在客戶那的系統。
實際的操作步驟:
後記
可以將建立 Reverse SSH tunnel 的命令設定在開機後執行,並且透過設定 ssh config 讓斷線時自動重連,如此就可以確保 SSH 連線不會中斷。此外,若是客戶端那的機器是處於完全無法對外連線的環境,則可以考慮使用 3G 網卡,並將網卡暫時借放於客戶那,然後等結案後再取回,雖然 3G 通訊月租不便宜,但和經常來回的通勤費和時間花費相比,可滑算多了。
雖然這些機器通常都不會有真實 IP,客戶也不會為了我們特別請 MIS 去開啟 NAT 或防火牆,但還好 SSH 提供了反向(Reverse)的機制讓我們可以連進去。其做法就是讓在客戶那的系統,透過 SSH 先連回我們自家有真實 IP 的主機,然後建立反向的通道即可。如此,我們便可從自家的主機,從 SSH 連回放在客戶那的系統。
實際的操作步驟:
# 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port ssh -NfR 12345:localhost:22 fred@myhost.com # 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器 ssh localhost -p 12345
後記
可以將建立 Reverse SSH tunnel 的命令設定在開機後執行,並且透過設定 ssh config 讓斷線時自動重連,如此就可以確保 SSH 連線不會中斷。此外,若是客戶端那的機器是處於完全無法對外連線的環境,則可以考慮使用 3G 網卡,並將網卡暫時借放於客戶那,然後等結案後再取回,雖然 3G 通訊月租不便宜,但和經常來回的通勤費和時間花費相比,可滑算多了。
network 是長這樣嗎 ?
回覆刪除1) 客戶
customer.com:12345 (or 443 e.g. web server)
=> ssh -NfR 12345:localhost:22 fred@myhost.com:22
客戶 和 家 的 SSH通訊都是經由 port 22
Application 則連接了 客戶server:12345 和 在家的 SSH server 並多開了port 12345
2) 家
SSH - fred@myhost.com:22
Client (work PC) - client.com
如由client PC 要通到customer.com:12345
在Client PC 的 Shell 打
=> ssh -p12345 -D80 -N fred@myhost.com:22
=>Internet Explorer proxy setting:
127.0.0.1:80
=> 在URL打customer.com:12345
也就是說
SSHd 只裝在 SSH server, 客戶及家不需裝SSH server 吧
Application : customer.com:12345
customer.com:22只用來向外傳 SSH Data ?
家 SSH : myhost.com:22 (只用來傳 SSH Data ?)
家 SSH Relay Server: myhost.com:12345
家 Client PC
是這樣嗎 ??
為了避免錯誤(port 12345)重寫::
回覆刪除Network 是長這樣嗎 ?
1) 客戶
customer.com:443
=> ssh -NfR 12345:localhost:22 fred@myhost.com:22
客戶 和 家 的 SSH通訊都是經由 port 22
Application 則連接了 客戶server:443 和 在家的 SSH server 並多開了port 12345
還是Application有連沒連都沒差只要有連上ssh就可以
2) 家
SSH - fred@myhost.com:22
Client (work PC) - client.com
如由client PC 要通到customer.com:443
在Client PC 的 Shell 打
=> ssh -p12345 -D80 -N fred@myhost.com:22
=>Internet Explorer proxy setting:
127.0.0.1:80
=> 在URL打customer.com:443
也就是說
SSHd 只裝在 SSH server, 客戶及家不需裝SSH server 吧
Application : customer.com:443
customer.com:22只用來向外傳 SSH Data ?
家 SSH : myhost.com:22 (只用來傳 SSH Data ?)
家 SSH Relay Server: myhost.com:12345
家 Client PC
Port forwarding 超難懂
是這樣嗎 ??
為了避免錯誤(port 12345)重寫::
回覆刪除Network 是長這樣嗎 ?
1) 客戶
customer.com:443
=> ssh -NfR 12345:localhost:22 fred@myhost.com:22
客戶 和 家 的 SSH通訊都是經由 port 22
Application 則連接了 客戶server:443 和 在家的 SSH server 並多開了port 12345
還是Application有連沒連都沒差只要有連上ssh就可以
2) 家
SSH - fred@myhost.com:22
Client (work PC) - client.com
如由client PC 要通到customer.com:443
在Client PC 的 Shell 打
=> ssh -p12345 -D80 -N fred@myhost.com:22
=>Internet Explorer proxy setting:
127.0.0.1:80
=> 在URL打customer.com:443
也就是說
SSHd 只裝在 SSH server, 客戶及家不需裝SSH server 吧
Application : customer.com:443
customer.com:22只用來向外傳 SSH Data ?
家 SSH : myhost.com:22 (只用來傳 SSH Data ?)
家 SSH Relay Server: myhost.com:12345
家 Client PC
Port forwarding 超難懂
是這樣嗎 ??
為了避免錯誤(port 12345)重寫::
回覆刪除Network 是長這樣嗎 ?
1) 客戶
customer.com:443
=> ssh -NfR 12345:localhost:22 fred@myhost.com:22
客戶 和 家 的 SSH通訊都是經由 port 22
Application 則連接了 客戶server:443 和 在家的 SSH server 並多開了port 12345
還是Application有連沒連都沒差只要有連上ssh就可以
2) 家
SSH - fred@myhost.com:22
Client (work PC) - client.com
如由client PC 要通到customer.com:443
在Client PC 的 Shell 打
=> ssh -p12345 -D80 -N fred@myhost.com:22
=>Internet Explorer proxy setting:
127.0.0.1:80
=> 在URL打customer.com:443
也就是說
SSHd 只裝在 SSH server, 客戶及家不需裝SSH server 吧
Application : customer.com:443
customer.com:22只用來向外傳 SSH Data ?
家 SSH : myhost.com:22 (只用來傳 SSH Data ?)
家 SSH Relay Server: myhost.com:12345
家 Client PC
Port forwarding 超難懂
是這樣嗎 ??
ssh 自動重連的 config 是 ConnectionAttempts 這項嗎?沒看到其它類似的選項,但似乎只能設成 99999 之類的,不能無限制重連。我之前都是用 systemd.service 的 Restart 和 RestartSec 控制。
回覆刪除