說實話,我對反向代理這個概念並不熟悉,只是感覺以下要做的事是一個代理的逆向過程,故借此名詞一用。
問題場景是這樣的:我有兩套Linux集群的訪問權限,分別為A和B,它們互相獨立。其中A、B集群均能訪問外網,但只有A集群有公網IP,所以從外網直接登錄B就不行。要解決的問題就是從外網能登錄到B集群。
我對代理的理解是:一台不能訪問外網的機器,通過局域網內一台可以訪問外網的機器代理服務,就能實現訪問外網的目的。
而我以為的反向代理就是以上的逆向過程,這個肯定是可以做到的,比如:我們在外網要對某台局域網內的Windows進行遠程桌面控制時就面臨IP地址非公網的問題,但QQ能遠程桌面卻能完成這樣的需求,區別就在於一個是被動受控,一個是主動請求受控;木馬什么的,其實都是主動請求受控。
那么,在Linux集群之間,我該如何解決碰到的問題呢?以下是從http://portable.easylife.tw/entry/Reverse-SSH-Tunnel整理的部分內容,該內容正好能處理對應的需求。
通常用SSH Tunnel是用來完成類似代理的功能,如圖:
紅色區域可通過SSHTunnel訪問原本受限的綠色部分,這一招通常用來翻牆。
反向Tunnel可以解決我實際碰到的問題:
通過反向的Tunnel就可以做到了,具體步驟如下(以下內容轉載而來,歡迎轉載而去):
示例環境:
局域網主機:
ServerA / Linux / user userA / ip192.168.0.123 / ssh port 22
ServerB / Linux / user userB / ip192.168.0.125 / ssh port 22
PC / Windows / ip 192.168.0.128 / 遠程桌面 port3389
遠程主機:
MyServer / Linux / user me / ip 1.2.3.4 /ssh port 22
ssh參數:
-N:不執行何指令
-f:后台執行
-R:建立reverse tunnel
示例1:從MyServer ssh連回ServerA
[userA@ServerA] $ ssh -NfR2222:localhost:22 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep 127.0.0.1
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
[me@MyServer] $ ssh userA@127.0.0.1 -p 2222
MyServer連到2222 port會轉向ServerA的ssh port,成功連接到ServerA
示例2:從MyServer ssh連回ServerB
[userA@ServerA] $ ssh -NfR 2244:192.168.0.125:22me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep127.0.0.1
tcp 0 0 127.0.0.1:2244 0.0.0.0:* LISTEN
[me@MyServer] $ ssh userB@127.0.0.1 -p 2244
MyServer連接到本機的2244 port會轉向到ServerB的ssh port,成功連接到ServerB
示例3:從MyServer遠程桌面PC
[userA@ServerA] $ ssh -NfR2266:192.168.0.128:3389 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep127.0.0.1
tcp 0 0 127.0.0.1:2266 0.0.0.0:* LISTEN
[me@MyServer] $ rdesktop 127.0.0.1:2266
若你在Linux的桌面環境則可以直接display遠程桌面PC,不然就export DISPLAY到其他主機。
此外,為了防止反向的Tunnel斷開,還需要一個autossh工具,它可以幫助斷線后自動重連。這個對我相當的重要,事實上我現在很少去B集群所在的地方。
對示例一做autossh可以如此做:
[userA@ServerA] $ autossh -M 12345-NfR2222:localhost:22 me@MyServer
當然,為了防止集群重啟或斷電等問題,可以將上語句寫到開機啟動腳本里。
以上的工作也可以通過putty完成,如示例3可以如下設置:
xshell也能干同樣的事:
趕緊試試吧~~~~
今天看到個好東西,補充一下。
再上文中做反向隧道后,只能在本機ssh localhost -p 來登錄,想要從其他IP來卻不行,因為SSH本地端口轉發綁定的是 lookback 接口。看網上博文http://blog.csdn.net/xyyangkun/article/details/7025854 說建立隧道時加-g參數可以實現,但我沒有成功。不過看完https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 后靈機一動,再建立個本機公網到本機localhost的隧道就OK了:
ssh -g -L 9099:localhost:2222 localhost
這樣就可以通過ssh 公網 -p 9099 來登錄了!