天天看點

SSH原理與運用(二):遠端操作與端口轉發

                    SSH原理與運用(二):遠端操作與端口轉發

七、遠端操作(SSH不僅可以用于遠端主機登入,還可以直接在遠端主機上執行操作。)

上一節的操作,就是一個例子:

  $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

單引号中間的部分,表示在遠端主機上執行的操作;後面的輸入重定向,表示資料通過SSH傳向遠端主機。

這就是說,SSH可以在使用者和遠端主機之間,建立指令和資料的傳輸通道,是以很多事情都可以通過SSH來完成。

下面看幾個例子。

1、将$HOME/src/目錄下面的所有檔案,複制到遠端主機的$HOME/src/目錄。

  $ cd && tar czv src | ssh user@host 'tar xz'

2、将遠端主機$HOME/src/目錄下面的所有檔案,複制到使用者的目前目錄。

  $ ssh user@host 'tar cz src' | tar xzv

3、檢視遠端主機是否運作程序httpd。

  $ ssh user@host 'ps ax | grep [h]ttpd'

八、綁定本地端口

    既然SSH可以傳送資料,那麼我們可以讓那些不加密的網絡連接配接,全部改走SSH連接配接,進而提高安全性。

假定我們要讓8080端口的資料,都通過SSH傳向遠端主機,指令就這樣寫:

  $ ssh -D 8080 user@host

SSH會建立一個socket,去監聽本地的8080端口。一旦有資料傳向那個端口,就自動把它轉移到SSH連接配接上面,發往遠端主機。可以想象,如果8080端口原來是一個不加密端口,現在将變成一個加密端口。

九、本地端口轉發

    有時,綁定本地端口還不夠,還必須指定資料傳送的目标主機,進而形成點對點的"端口轉發"。為了差別後文的"遠端端口轉發",我們把這種情況稱為"本地端口轉發"(Local forwarding)。

假定host1是本地主機,host2是遠端主機。由于種種原因,這兩台主機之間無法連通。但是,另外還有一台host3,可以同時連通前面兩台主機。是以,很自然的想法就是,通過host3,将host1連上host2。

我們在host1執行下面的指令:

  $ ssh -L 2121:host2:21 host3

指令中的L參數一共接受三個值,分别是"本地端口:目标主機:目标主機端口",它們之間用冒号分隔。這條指令的意思,就是指定SSH綁定本地端口2121,然後指定host3将所有的資料,轉發到目标主機host2的21端口(假定host2運作FTP,預設端口為21)。

這樣一來,我們隻要連接配接host1的2121端口,就等于連上了host2的21端口。

  $ ftp localhost:2121

"本地端口轉發"使得host1和host3之間仿佛形成一個資料傳輸的秘密隧道,是以又被稱為"SSH隧道"。

下面是一個比較有趣的例子。

  $ ssh -L 5900:localhost:5900 host3

它表示将本機的5900端口綁定host3的5900端口(這裡的localhost指的是host3,因為目标主機是相對host3而言的)。

另一個例子是通過host3的端口轉發,ssh登入host2。

  $ ssh -L 9001:host2:22 host3

這時,隻要ssh登入本機的9001端口,就相當于登入host2了。

  $ ssh -p 9001 localhost

上面的-p參數表示指定登入端口。

十、遠端端口轉發

    既然"本地端口轉發"是指綁定本地端口的轉發,那麼"遠端端口轉發"(remote forwarding)當然是指綁定遠端端口的轉發。

還是接着看上面那個例子,host1與host2之間無法連通,必須借助host3轉發。但是,特殊情況出現了,host3是一台内網機器,它可以連接配接外網的host1,但是反過來就不行,外網的host1連不上内網的host3。這時,"本地端口轉發"就不能用了,怎麼辦?

解決辦法是,既然host3可以連host1,那麼就從host3上建立與host1的SSH連接配接,然後在host1上使用這條連接配接就可以了。

我們在host3執行下面的指令:

  $ ssh -R 2121:host2:21 host1

R參數也是接受三個值,分别是"遠端主機端口:目标主機:目标主機端口"。這條指令的意思,就是讓host1監聽它自己的2121端口,然後将所有資料經由host3,轉發到host2的21端口。由于對于host3來說,host1是遠端主機,是以這種情況就被稱為"遠端端口綁定"。

綁定之後,我們在host1就可以連接配接host2了:

這裡必須指出,"遠端端口轉發"的前提條件是,host1和host3兩台主機都有sshD和ssh用戶端。

十一、SSH的其他參數

    SSH還有一些别的參數,也值得介紹。

    N參數,表示隻連接配接遠端主機,不打開遠端shell;T參數,表示不為這個連接配接配置設定TTY。這個兩個參數可以放在一起用,代表這個SSH連接配接隻用來傳資料,不執行遠端操作。

  $ ssh -NT -D 8080 host

f參數,表示SSH連接配接成功後,轉入背景運作。這樣一來,你就可以在不中斷SSH連接配接的情況下,在本地shell中執行其他操作。

  $ ssh -f -D 8080 host

要關閉這個背景連接配接,就隻有用kill指令去殺掉程序。

十二、參考文獻

  * IBM developerWorks: 實作SSH端口轉發

  * WikiBooks: Internet Technologies/SSH

(完)

繼續閱讀