假設今天你一個人管理了好多伺服器,有些機器因為安全考量而躲在NAT的架構之下,而你又必須在外面連回主機管理機器的話那又如何做呢?
這時候可以使用到SSH Tunneling的技術來解決了,事先先挖個連線,假設A點是在NAT底下的主機,是虛擬IP 192.168.1.100,而B點是在外面的主機,IP 138.47.99.99,連線方向只能從A點連到B點,所以我們在A點主機先建一個連線隧道到B點,指令如下:
在A點:
# ssh -R 12345:localhost:22 root@138.47.99.99
root@138.47.99.99’s password: ← 輸入root的密碼
上面的指令 -R 表示隧道入口端在Remote,在遠端接受連線,遠端指B點138.47.99.99,port 是12345,連線後會經過轉傳,隧道直接通到隧道的另一端,另一端實際到達的是 localhost,也就是A點,port 是22,登入的使用者不拘,只要是在遠端的使用者即可,建立好這個連線就放著不動。
現在在B點138.47.99.99,要做的是進入隧道入口就能到達對岸另一端,所以下指令:
在B點:
# ssh localhost -p 12345
這樣就能順利從B點連回A點了!
補充一下,雖然上一個指令跟這個指令都是下localhost,localhost 指的是現在下指令的本機機器,因為前後兩句指令是在不同的機器下的,所以localhost實際所代表的連線位置也不相同喔。
為了熟悉指令,我們再做一下指令的變化,如果在A點下以下的指令,會有什麼效果?
在A點:
# ssh -R 23:ptt.cc:23 root@138.47.99.99
解讀一下指令,-R 在遠端建立連線入口,port 23,隧道直接通到隧道的另一端主機是ptt.cc,port 也是 23,這是什麼意思?
意思是說現在在遠端的B點連線port 23 就會直接登入ptt.cc的BBS了,而登入bbs的來源IP應該是A點,試驗一下
在B點:
# telnet localhost
的確是連到了ptt 的bbs了!
為了熟悉指令,再做一次指令變化
在A點:
# ssh -L 23:ptt.cc:23 root@138.47.99.99
解讀一下指令,-L 是指在本地端為連線入口,遠端為連線出口,而連線會轉連到ptt的bbs,而登入bbs的來源IP應該是B點,試驗一下
在A點:
# telnet localhost
一樣是連線成功!^^
想請問一下唷
那如果
A 跟 B 主機 都是在學網裡面
A 擁有一個固定ip(168.95.1.1)假設的
B 擁有一個虛擬ip(192.168.0.1)
那我從外面遠端回來A電腦是沒問題的
(因為對外是固ip)
那我要連到B也可以用你說的這方法嗎?
沒錯啊,你形容的狀況完全就是我文章所講的。
我文章跟你所指的A B點,剛好相反,對調就好了