反向建立 SSH Tunnel、免 VPN 連回公司

此篇文章最近更新時間為2010-01-21 05:01:34 目前共有24篇留言

關於作者 - JosephJ

任職於 Faria。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

從家中連到公司的需求

平常若要從外面連到公司內網,都是透過 Juniper Network Connector 來建立的 SSLVPN 連線。如果用的是 Windows 都沒有太大的問題,只要用 Internet Explorer 連到登入頁都可以透過 ActiveX 啟動或安裝 Network Connector。但我不喜歡將電腦帶來帶去,家裡通常是用 Mac 上網。可是呢,Mac 沒有 IE,必須要另外安裝 NetworkConnector.dmg 來連,但跟 MIS 拿的版本又有問題,所以我在家裡都沒辦法加班(老闆,我很想啊 XD)。

主要的問題

在前公司有用過 SSH 連線到公司內網、設定 Tunnel 的 Port Forwawrding 後、在 Browser 設定 SOCKS Proxy 即可瀏覽內部網頁。所以就在思考、也跟同事討論,既然已從公司建立 SSH 連線到家中,理論上應可利用此連線,不需要考慮 VPN 與 NAT 的限制、從家中再連回到公司。昨天上網搜尋了 SSH Tunnel、文章很多、標題很聳動 (利用SSH Tunnel 逃離 MIS 掌控魔爪) ,但大多是講正向 Tunnel,直到看到了這一篇:上班族 SSH Tunnel 求生手冊,最後有講到反向 Tunnel,正是我要的東東啊!

Step 1 : 建立反向的 SSH Tunnel

建立反向 SSH Tunnel

所以,你可以上班時用 SSH 連到 dev.corp,再用下面的指令連回家中 home.idv:

$ ssh -NfR 8080:dev.corp:22 user@home.idv

大概解釋一下:

  • Nf 是指背景運作且不執行任何命令,所以此指令不會開一個新的 Terminal。
  • R 代表要建立一個反向(Reversed) 的 SSH Tunnel,也就是要讓對方可以連進來、而不是跟平常一樣只是自己連到對方。
  • 8080 為 home.idv 的 Port 8080,可隨意指定。
  • dev.corp 為 dev.corp 的 Port 22,必須是這台 SSH 所使用的 Port。
  • 8080:dev.corp:22 合起來看就是將傳送到 home.idv:8080 全部灌到 dev.corp:22(這種技術就叫 Port Forwarding)。

如此一來你就建立好了一個反向的 SSH Tunnel 了。此時再開一個 Shell 連回至 home.idv、執行下面的指令:

$ ssh -p 8080 localhost

-p 代表連到 Port 8080。因為之前在公司主機上已經建立好了 Tunnel,所以 localhost:8080 就會直接用此 Tunnel 連到 dev.corp:22 去。

居然可以透過網路上重重的限制(VPN、NAT)連回公司!感覺真是超棒的啦。


Step 2 : 建立 SOCKS Server

高興沒多久後就開始思考:雖然 SSH 連回公司的需求已經解決了,但是... 公司內還有很多服務啊!像是內部員工網站、內部的 Wiki 系統、內部的 SCM Repository 存取等... 光只有 SSH 根本沒太大的幫助該如何讓自己的家中的個人電腦也能存取這些資源呢?答案就是建立 SOCKS Server (謝謝小 Z 大大幫忙,原來只需多加一個參數即可建立)

小改一下建立與使用 SOCKS Server
$ ssh -p 8080 -D 3128 localhost

-D 3128 表示將本機的 Port 3128 設為 SOCKS Proxy Server。

如此一來,家中的伺服器就會變成 SOCKS Proxy Server,你的網際網路設定的 SOCKS 欄位填入 home.idv:3128 即可。


延伸閱讀

  • autossh :

    感謝小 Z 提供。因為連線可能會斷掉,你可以在公司的伺服器上安裝一個叫 autossh 的東西,他會協助你自動重新建立連線,讓你無後顧之憂 :D

  • IPSec :

    感謝 Jack 推薦。用 IPSec 這個 Protocol 可以更安全、而且連線更穩定。


SSH Tunnel 必學

以下是整理上班族 SSH Tunnel 求生手冊

在外賺辛苦錢時,你是否有以下的困擾呢:

  • 擔心網管監控你的一舉一動?(104 事件)
  • 你公司網路防火牆擋掉 Facebook?沒辦法 QK 一下...
  • 除了 80 與 443 Port 外全部被擋掉?

這些情況都可以透過 SSH Tunnel 將自己的連線加密與突破。

在公司,用自己的主機連線

在公司,透過外面的電腦當 Proxy,連到外面。

Windows(下載 plink.ext)
plink -ssh -L 3128:home.com:3128 username@home.com

Linux / Unix
ssh -NfD 3128 username@home.com
  • -N : 不執行任何命令
  • -f : 在背景執行
  • -D : 建 Socks5 的 Proxy

瀏覽器和 MSN 的 Socks 5 Proxy 設定的欄位填上 localhost:3128。連出去的連線就是加密,並且是穿過 home.com 的連線。

在公司,用自己的主機連 BBS

假設 MIS 鎖住了 bbs.ptt.cc

Windows
plink -ssh -L 2323:bbs.ptt.cc:23 username@home.com

Linux / Unix
ssh -NfL 2323:bbs.ptt.cc:23 username@home.com

-L : 將local port 轉向

就可以連到批踢踢,而且加密。

telnet localhost 2323


Comments

  1. Neil 2014-01-21 11:06:55
    第二张图的第二步好像写错了?

    正确的应该是:ssh -NfR 1234:dev.corp:22 user@home.idv
  2. james 2013-10-04 17:13:32
    請問如果這樣的情況也可以用嗎?
    公司--家裏. 透過SSL Tunnel從家裏連回公司取得公司內部IP連到其它台SERVER
  3. fyi 2011-12-23 18:16:21
    另一個不論SSH 或SSL tunnel 都會遇到的問題, 那就是Forward UDP, Google 關鍵字 "SSH tunneling UDP" 可以找到使用 "netcat" 的範例, 在此就不贅述
  4. fyi 2011-12-23 17:05:50
    JosephJ 在回答中曾提到SSL tunnel, 其實SSL tunnel 比SSH tunnul 更有機會突破防火牆, 因為需要SSL 加密的網站不在少數, 除非網管不在乎員工的需求, 否則應該是不會擋HTTPS, 但是SSH 卻是可以透過Layer7 filter 擋掉, 因此即便把SSH tunnel 設在tcp port 80 都不見得可以通過防火牆, 此外, 更終極的方法則是HTTP tunnel, 如果大家用過日本人寫的 "愛的機器", 那麼應該就可以理解HTTP tunnel 的作用, JosephJ 若有時間, 則不妨發表一下SSL/HTTP tunnel 使用心得
  5. josephj 2011-02-22 15:49:16
    breeder,

    不好意思,沒有看清楚你的問題

    你講的沒錯,兩邊都要有 SSH Server,也都要各做一次連線

    另外我文章的 SOCKS Server 那時並沒有成功架設起來
    同事成功的作法是家裡的 SSH Server 是 Ubuntu,瀏覽跟 SOCKS 是同一台(如下方 Terry 所講的)
    怎麼獨立出 SOCKS + SSH Server,這個得花時間再研究一下了
  6. breeder 2011-02-22 12:32:57
    抱歉!我好像有個地方一開始沒有搞懂...
    STEP2的地方,前提應該是公司有要有台SSH SERVER才對吧!
    也就是說,家跟公司都各要有一台SERVER,才能做到版主所說的..
  7. josephj 2011-02-21 15:19:47
    breeder,

    另外我假設你應該是可以連回家的

    如果不是,你可以設定分享器中的 Port Forwarding(中文可能是封包轉遞吧 :p)
    例如設定 22 對應到內部的 192.168.0.2 (你的 SSH Server)

    你家的網址是 61.57.130.241
    別人只要連 ssh 61.57.130.241 port 22 就可以到你分享器後的 SSH Server 了

    我家的 SSH Server 也在分享器後面 :)
  8. josephj 2011-02-21 15:14:51
    可以啊,重點是你要可以用 SSH 從公司連回家中的那台 Server 即可。

    我只要在公司執行一行:
    ssh -NfR 8080:localhost:22 joseph@home.com
    表示以公司機器的 8080 port 及 背景執行建立 SSH 反向連線
    你把 joseph 改為你家中的帳號、home.com 改為你家中的位置
    按下 Enter 應該會要你輸入家中的密碼或 passphrase
    輸入正確後沒有反應、跳回命令列就表示成功了

    接著在家中這樣打:ssh awoo@localhost -p 8080
    其中 awoo 改為公司的帳號就應該可以成功了

    設 8080 的理由是這個 port 沒有被公司擋掉,你可以自己決定,但兩處都要改

    而如果你家 SSH 的 port 不是 22 的話,可以在建立的地方多加一個 -p <port number>
    例如 ssh -p 443 -NfR 8080:localhost:22 josephj@home.com
  9. breeder 2011-02-18 16:52:07
    請問如果我家中的SERVER是用分享器建的SSH SERVER,這樣在反向建立的step2
    還能做嗎?
    我是想這樣 office-SERVER-client,爬了一堆文,好像都沒有談到這個....
  10. Robert 2010-09-07 18:01:48
    Juniper Network Connector 現在可以再MAC上run了, 走Java solution.
  11. j 2010-08-11 19:24:06
    误人子弟
  12. tension 2010-07-19 04:50:57
    很好的学习文章,这样可以省去很多麻烦了!
  13. Terry 2010-03-15 22:12:57
    您好~

    謝謝您回覆,小弟今天家裡的 fedora 跑 firefox 成功的連線回公司。不過小弟發現,建立 SOCKS SERVER 之後,他卻只有本機(這台fedora)能利用 port 3128 連回公司,
    家裡的 windows 試著去 telnet fedora 的 3128 是拒絕連線的。

    下netstat 看到的結果是 listen 127.0.0.1:3128 ,這是不是代表他只 listen 本機的連線呢?

    謝謝您。
  14. 小z 2010-03-15 19:13:02
    socks server可不止針對browser, 理論上所有軟體都可以支援....有的軟體直接內建支援 (需設定) , 不直接支援的, 可以在winsock這層作手腳. 建議是socks / portforwarding 玩熟了的人 (知道怎麼排除問題的) 再來玩. 現成可以玩的 '讓不支援socks的軟體走socks' 的軟體很多....請上網搜尋.
  15. 小z 2010-03-15 19:09:03
    最近有個比較熱門的是.....hack ip分享器軔體!

    上述的一些挖洞法總是需要自家有linux/ssh server , 如果自家的主機不常開, 可以玩玩hack一些ip分享器/無線AP 的軔體. (因為很多ip分享器/無線AP跟本就是linux, 後來為了符合GNU就只好release出source, 接著就開始有人去hack)

    改機完後, 就有個現成可以挖洞的ssh server, 而且可以不用開電腦. 有興趣的人可以上網搜尋 dd-wrt , tomado, OpenWRT, Tarifa, freewrt .....等等......
  16. terry 2010-03-15 00:34:07
    請問最後的 socks server 是針對網頁瀏覽器嗎?

    讓家裡的j網頁瀏覽器利用反向ssh tunnel 連線公司內部的web server?
  17. chihyibg 2010-02-22 20:45:03
    請問一下
    若兩端的主機都在nat之後是不是就完全沒辦法連線了?
  18. Archangelwu 2010-01-25 14:20:59
    引用 "為啥要連到批踢踢的 ssh ? 上批踢踢當然是要看 telnet 啦 XD
    這個的用途當網路環境(例如許多公司)僅開放 443 與 80、封鎖 MSN 、Facebook 時
    你可以建立 SSL Tunnel 來存取所有資源,不被限制。

    另外一個好用的就是像大陸許多網站不能用,SSL Tunnel 也是一個救星。 "

    打錯字囉 SSL Tunnel 要改為 SSH Tunnel ^_^
  19. Josephj 2010-01-22 18:40:53
    Soga 又上了一課
  20. allenown 2010-01-22 16:49:29
    ptt直接有提供ssh可以連線至bbs畫面,有ssh加密可以防止竊聽。
  21. josephj 2010-01-22 11:06:44
    X,

    為啥要連到批踢踢的 ssh ? 上批踢踢當然是要看 telnet 啦 XD
    這個的用途當網路環境(例如許多公司)僅開放 443 與 80、封鎖 MSN 、Facebook 時
    你可以建立 SSL Tunnel 來存取所有資源,不被限制。

    另外一個好用的就是像大陸許多網站不能用,SSL Tunnel 也是一個救星。
  22. josephj 2010-01-22 10:14:30
    相關討論:
    http://www.facebook.com/josephj6802?v=feed&story_fbid=1306902946344
  23. X 2010-01-22 01:44:33
    有 ssh client 可以用的話,直接連 ssh://bbs@ptt.cc:22/ 就可以了吧?
  24. 裕波 2010-01-21 23:33:58
    cool
暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
驗證碼:
送出

Facebook Comment