Reverse SSH Tunnel 反向打洞實錄

近來經手了幾個案子,其目標都是設計一台做特定用途的系統,但往往這台機器都會被鎖在防火牆後面,甚至不會連上網際網路,是完全封閉的環境。每當接近結案,將系統交到客戶手中以做最後的壓力測試時,便是痛苦的開始。怎麼說呢?因為當面對最後的大量測試,各種大大小小的臭蟲(Bugs)就會原形畢露,一一浮上臺面。而每次問題發生,便要千里迢迢趕到客戶那了解情況、解決問題。如果問題不大倒還好,一旦問題嚴重,被客戶關到三更半夜也是常有的事,更誇張的還必須每天都去報到。所以,為避免車程來回的時間和人力浪費,是否有可以遠端連線做處理呢?便思考起這問題。

雖然這些機器通常都不會有真實 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 通訊月租不便宜,但和經常來回的通勤費和時間花費相比,可滑算多了。

留言

  1. 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

    是這樣嗎 ??

    回覆刪除
  2. 為了避免錯誤(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 超難懂
    是這樣嗎 ??

    回覆刪除
  3. 為了避免錯誤(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 超難懂
    是這樣嗎 ??

    回覆刪除
  4. 為了避免錯誤(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 超難懂
    是這樣嗎 ??

    回覆刪除
  5. ssh 自動重連的 config 是 ConnectionAttempts 這項嗎?沒看到其它類似的選項,但似乎只能設成 99999 之類的,不能無限制重連。我之前都是用 systemd.service 的 Restart 和 RestartSec 控制。

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)