一 什么是SSH隧道
首 先看下面這張圖,我們所面臨的大部分情況都和它類似。我們的電腦在右上角,通過公司帶有防火牆功能的路由器接入互聯網(當然可能還有交換機什么的在中間連 接着你和路由器,但是在我們的問題中交換機並不起到什么關鍵性的作用)。左下腳的部分是一個網站的服務器,它是我們公司防火牆策略的一部分,也就是說公司 不希望我們訪問這個服務器。在左上還有一台機器,它也是屬於我們的。但是這台機器並不在我們公司里面,換句話說他不受到公司防火牆的限制。最后也是最重 要的一點是,我們能夠在公司通過互聯網直接訪問這台機器。或者說這台位於公司防火牆外面的機器需要擁有一個獨立的互聯網IP,同時公司的防火牆規則不會屏 蔽這台機器,並且這台機器運行着一個OpenSSH服務器。
現 在,我們清楚地知道了自己所處的網絡環境。並且不難理解我們在公司無法訪問那個服務器的原因是:線路A-B-C上A-B之間的防火牆屏蔽了對那個服務器的 訪問。與此同時,我們也很快注意到,線路A-B-D之間、D-C之間是不受阻礙的。相信你已經想到了,在A-B之間的防火牆不會屏蔽對機器d的訪問。因此 我們可以通過機器d建立一個通道A-B-D-C,從而訪問到機器c上的數據。
這條通道可以用很多技術來建立,這里我們僅僅介紹如何使用SSH服務器來建立這樣一個通道-他被稱為SSH隧道。
二、建立SSH隧道
在我們計划建立一個本地SSH隧道之前,我們必須清楚下面這些數據:
- 中間服務器d的IP地址
- 要訪問服務器c的IP地址
- 要訪問服務器c的端口
現在,我們把上面這張圖變得具體一些,給這些機器加上IP地址。並且根據下面這張圖列出我們的計划:
- 需要訪問234.234.234.234的FTP服務,也就是端口21
- 中間服務器是123.123.123.123
現在我們使用下面這條命令來達成我們的目的
ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123 ftp localhost:2121 # 現在訪問本地2121端口,就能連接234.234.234.234的21端口了
這里我們用到了SSH客戶端的三個參數,下面我們一一做出解釋:
- -N 告訴SSH客戶端,這個連接不需要執行任何命令。僅僅做端口轉發
- -f 告訴SSH客戶端在后台運行
- -L 做本地映射端口,被冒號分割的三個部分含義分別是最后一個參數是我們用來建立隧道的中間機器的IP地址(IP: 123.123.123.123)
- 需要使用的本地端口號
- 需要訪問的目標機器IP地址(IP: 234.234.234.234)
- 需要訪問的目標機器端口(端口: 21)
我們再重復一下-L參數的行為。-L X:Y:Z的含義是,將IP為Y的機器的Z端口通過中間服務器映射到本地機器的X端口。
在這條命令成功執行之后,我們已經具有繞過公司防火牆的能力,並且成功訪問到了我們喜歡的一個FTP服務器了。
三、AutoSSH
使用SSH的方式不夠穩定,使用AutoSSH可以自動在連接斷開時自動重連,再把AutoSSH加入系統服務自動啟動,則可以做到穩定的連接。
autossh是個很好的東西,他是用來保證SSH隧道連接穩定性的。在Ubuntu下安裝
apt-get install autossh
使用方法很簡單,比如原來直接用ssh的命令:
ssh -N -v -D localhost:8527 root@remote_ssh_server -p remote_ssh_port
現在改成:
autossh -M 5122 -N -v -D localhost:8527 root@remote_ssh_server -p remote_ssh_port