SSH端口轉發(隧道)

此頁由 Linux Wiki用戶Chenxing 於 2012年2月5日 (星期日) 03:31 的最後更改。

出自Linux Wiki

提示:此文已超过 12 年(4457 天)未更新,如发现内容过时或有误,欢迎改进:)

SSH端口轉發(Port Forwarding),是一種隧道技術,流往某端口的數據被加密後傳向另一機器,依據轉發方式的不同,有多種應用場景。[1][2]

以下所有的命令都是用SSH客戶端執行的。執行命令的電腦下面稱為“本地”電腦;而“遠程服務器”則是運行着SSH服務器的機器(本文以my-remote-host.com為例)。

目錄

本地轉發

有時,遠程機器能訪問某個端口(如remote-secret.com:8080),但本地機器無法訪問。這時使用SSH的本地轉發功能,即可將遠程端口映射到本地:

ssh -L 9090:remote-secret.com:8080 my-remote-host.com

此時訪問本地的9090端口就相當於用遠程服務器my-remote-host.com訪問remote-secret.com:8080

Hint.gif
提示:
如果寫成-L 9090:localhost:8080,就是把遠程服務器的8080端口映射到本地的9090端口了

應用舉例:如果遠程服務器處於某受保護的內網中,可以藉助其SSH服務獲得與其等同的訪問權限。

Hint.gif
提示:
默認情況下,本地轉發的端口只能在本機上訪問,要想允許外部訪問,請添加-g選項。

遠程轉發

讓遠程服務器監聽remote_port端口,使其被訪問時像本地電腦在訪問somehost:its_port一樣。

ssh -R 9090:local-secret.com:8080 my-remote-host.com

這樣,訪問my-remote-host.com:9090就等同於用本機訪問local-secret.com:8080

應用舉例:有時,本地電腦處於NAT內網中,難以從外部訪問;而遠程服務器可輕易被訪問。利用遠程轉發功能,可允許他人通過遠程服務器間接訪問本地電腦的某個端口。

Note.gif
注意:
類似本地轉發,遠程轉發的端口默認也只能在遠程服務器本機上訪問,要想允許外部訪問,可改寫為-R *:9090:local-secrent.com:8080,並確保在服務器的sshd_config中打開了GatewayPorts選項。

動態轉發

動態轉發動態地將各種數據轉發到遠程端口。實際上相當於在本地電腦的指定端口開了一個SOCKS代理。如:

ssh -D 9090 my-remote-host.com

本地的9090端口就是一個SOCKS代理了。

Hint.gif
提示:
如果my-remote-host.com是境外服務器,則該SOCKS代理實際上具備了“翻牆”功能。

常用參數

端口轉發常與以下參數配合使用[3]

-f
ssh將在後台運行
-N
不執行命令,僅轉發端口
-C
壓縮傳送的數據
-i
使用指定的密鑰登錄

相關資料

  1. SSH隧道技術簡介
  2. 實戰 SSH 端口轉發
  3. Ubuntu Forum: SSH Port forwarding, without shell invocation

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
简体繁体转换