Friday, November 20, 2009

上班族ssh tunnel求生手冊

上班族ssh tunnel求生手冊
pokkys 8/14 10:13:36
常常阿,在上班,但是想打個BBS,上個plurk,開個msn聊聊天。但是卻擔心網管監控你的一舉一動。於是可以透過ssh tunnel來把自己的連線加密,這樣就不會被看光光啦。

範例1:
在公司,透過外面的電腦當proxy,連到外面。
ssh -NfD 8888 remote_ip
-N : 不執行任何命令
-f : 在背景執行
-D : 建socks5 的proxy
這時候,瀏覽器和msn在socks 5 proxy設定的欄位填上localhost:8888 。
連出去的連驗就是加密,並且是穿過remot_ip的連線。

範例2:
在公司,透過外面的電腦連BBS。
ssh -NfL 2323:bbs.gamer.com.tw:23 remote_ip
-L : 將local port 轉向
telnet localhost 2323 就可以連到巴哈,而且是加密的。
也可用PCManx連localhost 2323也是一樣的意思。

範例3:
有時候假日,想要連回公司加個班。
但是公司是NAT,所以沒辦法這樣作。
可以運用TCP雙向傳輸的特性來辦到這件事。
ssh -NfR 2222:localhost:22 remote_ip
-R : 將remote port轉向
這時候,只要跑到remote_ip的機器上面
ssh localhost -p 2222
就會跑到在NAT後面,公司的機器。
簡單說就是開後門啦!
回覆 回頂部


#2 回覆: 上班族ssh tunnel求生手冊
rossiliu 8/14 11:33:04
這篇好....要標記起來!!
多謝整理。
回覆 回頂部


#3 回覆: 上班族ssh tunnel求生手冊
iosian 8/14 11:39:18
socks 5 proxy真的很好用,建議多搭配proxychains,就算是利用pcmanx連bbs也可以透過proxy連線

安裝proxychains套件
利用ssh -D建立好 dynamic port forwarding
然後編輯好proxychains的設定檔 /etc/proxychains.conf
主要是加入 socks5 127.0.0.1 8888
接著Alt + F2 執行 " proxychains pcmanx "
接下來的bbs連線都是透過socks 5 proxy了
當然msn也可如法泡製。" proxychains amsn "
回覆 回頂部


#4 回覆: 上班族ssh tunnel求生手冊
Hapsburg 8/14 18:52:30
呵呵,有趣的文章,感謝您的分享。幫你收進精華區嚕~~~
回覆 回頂部


#5 回覆: 上班族ssh tunnel求生手冊
夢見草 8/14 23:15:17
範例3:

那部份我還是看不太懂,你可否針對範例3詳細說一下它的原理、理論或概念。

謝謝
回覆 回頂部


#6 回覆: 上班族ssh tunnel求生手冊
pokkys 8/14 23:39:27
一般公司架構是這樣
PC(10.1.0.1) ---> (10.1.0.254)NAT translate(public_ip) ---> Internet(remote_ip)
但是外面要連進來就辦不到了,因為在NAT後方。
如果你可以控制NAT,你可以指定public_ip:2222 -> 10.1.0.1:22
但是如果你沒有這樣的權限,就沒辦法指定這件事。

ssh remote tunnel利用TCP雙向的特性,是在遠端開一個入口。

PC(10.1.0.1) <---> (10.1.0.254)NAT translate(public_ip) <---> Internet(remote_ip)

PC向remote_ip建一條TCP雙向開路的通道。
remote_ip把port 2222的要求,灌給這條通道。
PC收到之後,再把要求灌給自己的port 22。

因此反向的tunnnel就建立起來了。
回覆 回頂部


#7 回覆: 上班族ssh tunnel求生手冊
Mozzenior 8/15 1:29:53
或許可以這樣說:

範例一的情境:
公司網路拒絕讓內部員工連線到某些網頁,比如說股票好了。但你知道外界有一個提供 SSH 服務的機器(remote_ip) 可以連到這個股票網站,而且公司網路並沒有阻擋你連線去 remote_ip!

這時候就可以利用範例一提供的功能,要求 SSH 建立一個本地 SOCKS Proxy (localhost:8888) 和一個遠端的 SOCKS Proxy (remote_ip)。並將你的瀏覽器的所有要求,透過 localhost:8888 加密後,連線到 remote_ip 進行解密,再由 remote_ip 代為連線股票網站。回程的資訊也是加密後才傳送回來。

之所以要大費周章地建立兩個 SOCKS Proxy,是因為 SOCKS 協定並沒有加密功能,必須透過本地端和遠端的 SSH 來確保傳送的來回資料的安全。


範例二的情境是:
公司內部網路鎖住連往 bbs.gamer.com.tw:23 的連線,但你知道你可以連線到一台有提供 SSH 服務的機器上(remote_ip),而且它可以連線到巴哈!

所以你就要求本地端和遠端的 SSH,將所有連往 localhost:2323 的連線,透過 SSH 加密後,全部導往 remote_ip,由 remote_ip 解開 SSH 密文後,代你連線巴哈,並將巴哈傳回來的資訊將密後傳回給你。(雖然 localhost 到 remote_ip 之間的資料有用 SSH 加密,但是由 remote_ip 連往巴哈的資料應是明文而非密文。畢竟 telnet 是看不懂 SSH 密文的。)


範例三的情況是:
公司內部網路處於 NAT 或防火牆之後,從你家(remote_ip)沒有辦法直接連線回來。

所以你就先設定好家裡電腦的 SSH 服務,用範例三的方式,先在公司建立一個公司電腦(localhost:22)和 remote_ip 之間的 SSH 連線。並要求家裡電腦將所有連往其埠號 2222 的通訊全部轉往公司電腦的 SSH 埠號 22。等你回到家後,就可以用 SSH 連線家裡電腦的埠號 2222 來登入公司電腦的 SSH 服務了。



以上三種情況,設定上和使用上都應該要小心,免得變成跳板,或者資料遭竊聽。(最好不要聆聽所有網卡,聆聽 localhost 即可。而且 remote_ip 應該是自己非常信任的機器。)


範例一和範例二差別在於 SOCKS Proxy 的建立。這是因為 HTTP Proxy 會貼上/處理/取下額外的資訊,不能直接轉送(Forwarding)。範例二就真的是照本宣科地轉送。(當然,兩者轉送之前都有加密。)


以上,有錯請指正。
回覆 回頂部


#8 回覆: 上班族ssh tunnel求生手冊
夢見草 8/16 1:17:37

pokkys 寫到:
一般公司架構是這樣
PC(10.1.0.1) ---> (10.1.0.254)NAT translate(public_ip) ---> Internet(remote_ip)
但是外面要連進來就辦不到了,因為在NAT後方。
如果你可以控制NAT,你可以指定public_ip:2222 -> 10.1.0.1:22
但是如果你沒有這樣的權限,就沒辦法指定這件事。



所以說,一定要在 NAT server 上,開一個 port 對應到內部IP才行是吧?

沒有 NAT 設定的權限就做不了這事是吧?

若你是這個意思的話,那就跟我以前學到的網路概念是一樣,只是我沒聽過"建一條TCP雙向開路的通道" 這樣的術語,所以一時之間聽不懂你的意思。
回覆 回頂部


#9 回覆: 上班族ssh tunnel求生手冊
pokkys 8/16 2:06:39
因為tcp tunnel不是在NAT上面開port。
而是利用tcp的特性而已。
所以跟NAT forward的意義不一樣。

NAT forward是 ssh NAT:port
但是TCP tunnel是ssh remote_ip:port

所以是用ssh作反向tunnel不需要NAT特別設定什麼。
回覆 回頂部


#10 回覆: 上班族ssh tunnel求生手冊
pokkys 8/16 2:09:53

Mozzenior 寫到:
範例三的情況是:
公司內部網路處於 NAT 或防火牆之後,從你家(remote_ip)沒有辦法直接連線回來。

所以你就先設定好家裡電腦的 SSH 服務,用範例三的方式,先在公司建立一個公司電腦(localhost:22)和 remote_ip 之間的 SSH 連線。並要求家裡電腦將所有連往其埠號 2222 的通訊全部轉往公司電腦的 SSH 埠號 22。等你回到家後,就可以用 SSH 連線家裡電腦的埠號 2222 來登入公司電腦的 SSH 服務了。



以上三種情況,設定上和使用上都應該要小心,免得變成跳板,或者資料遭竊聽。(最好不要聆聽所有網卡,聆聽 localhost 即可。而且 remote_ip 應該是自己非常信任的機器。)


範例一和範例二差別在於 SOCKS Proxy 的建立。這是因為 HTTP Proxy 會貼上/處理/取下額外的資訊,不能直接轉送(Forwarding)。範例二就真的是照本宣科地轉送。(當然,兩者轉送之前都有加密。)


以上,有錯請指正。


其實範例3的地方,不在remote_ip裡面連自己的localhost:2222也沒辦法連線。所以他預設已經限定只接受localhost連線了。^^"

另外範例2的地方,想要listen localhost以外的ip也要加'-g'才可以。

#12 回覆: 上班族ssh tunnel求生手冊
Mozzenior 8/16 15:52:01
你是對的。我測完各項功能後,就沒去檢查 netstat 了 XD

這就是偷懶的結果……自爆 Orz

(アフロing……)

pokkys 寫到:
其實範例3的地方,不在remote_ip裡面連自己的localhost:2222也沒辦法連線。所以他預設已經限定只接受localhost連線了。^^"

另外範例2的地方,想要listen localhost以外的ip也要加'-g'才可以。

No comments: