有時,綁定本地端口還不夠,還必須指定數據傳送的目標主機,從而形成點對點的"端口轉發"。為了區別后文的"遠程端口轉發",我們把這種情況稱為"本地端口轉發"(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參數表示指定登錄端口。