SSH隧道或SSH端口轉(zhuǎn)發(fā)是一種在客戶端和服務(wù)器機器之間創(chuàng)建加密SSH連接的方法,通過該連接可以中繼服務(wù)端口。
SSH轉(zhuǎn)發(fā)對于傳輸使用未加密協(xié)議(如VNC或FTP),訪問地理限制內(nèi)容或繞過中間防火墻的服務(wù)的網(wǎng)絡(luò)數(shù)據(jù)非常有用。 基本上,您可以轉(zhuǎn)發(fā)任何TCP端口并通過安全的SSH連接隧道傳輸流量。
SSH 端口轉(zhuǎn)發(fā)有三種類型:
- 本地端口轉(zhuǎn)發(fā)。 – 將連接從客戶端主機轉(zhuǎn)發(fā)到 SSH 服務(wù)器主機,然后轉(zhuǎn)發(fā)到目標主機端口。
- 遠程端口轉(zhuǎn)發(fā)。 – 將端口從服務(wù)器主機轉(zhuǎn)發(fā)到客戶端主機,然后轉(zhuǎn)發(fā)到目標主機端口。
- 動態(tài)端口轉(zhuǎn)發(fā)。 – 創(chuàng)建 SOCKS 代理服務(wù)器,允許跨一系列端口進行通信。
在本文中,我們將討論如何設(shè)置本地,遠程和動態(tài)加密的 SSH 隧道。
本地端口轉(zhuǎn)發(fā)
本地端口轉(zhuǎn)發(fā)允許您將本地 (ssh 客戶端)計算機上的端口轉(zhuǎn)發(fā)到遠程 (ssh 服務(wù)器)計算機上的端口,然后將其轉(zhuǎn)發(fā)到目標計算機上的端口。
在這種類型的轉(zhuǎn)發(fā)中, SSH 客戶端偵聽給定端口,并將與該端口的任何連接隧道連接到遠程 SSH 服務(wù)器上的指定端口,然后該端口連接到目標計算機上的端口。目標計算機可以是遠程 SSH 服務(wù)器或任何其他計算機。
本地端口轉(zhuǎn)發(fā)主要用于連接內(nèi)部網(wǎng)絡(luò)(如數(shù)據(jù)庫或 VNC 服務(wù)器)上的遠程服務(wù)。
在 Linux , macOS 和其他 Unix 系統(tǒng)中創(chuàng)建本地端口轉(zhuǎn)發(fā)將 -L 選項傳遞給 ssh 客戶端:
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
使用的選項如下:
- [LOCAL_IP:]LOCAL_PORT – 本地機器的 ip 和端口號。當 LOCAL_IP 省略 SSH 客戶端會連接本地主機。
- DESTINATION:DESTINATION_PORT – 目標計算機的 IP 或主機名和端口。
- [USER@]SERVER_IP – 遠程 SSH 用戶和服務(wù)器 IP 地址。
LOCAL_PORT 可以使用任何大于 1024 的端口號。端口號小于 1024 特權(quán)端口,只能由 root 用戶使用。如果您的 SSH 服務(wù)器正在偵聽 22 以外的端口(默認值),請使用該 -p [PORT_NUMBER] 選項。
目標主機名必須可從 SSH 服務(wù)器解析。
假設(shè)您在內(nèi)部(專用)網(wǎng)絡(luò)上的計算機 db001.host 上運行 MySQL 數(shù)據(jù)庫服務(wù)器,在端口 3306 上可以從計算機訪問,并且您希望使用本地計算機 pub001.host 上的 mysql 客戶端連接到數(shù)據(jù)庫服務(wù)器。為此,您可以轉(zhuǎn)發(fā)連接,如下所示:
ssh -L 3336:db001.host:3306 user@pub001.host
運行該命令后,系統(tǒng)將提示您輸入遠程 SSH 用戶密碼。輸入后,您將登錄遠程服務(wù)器并建立 SSH 隧道。建立基于 SSH 密鑰的身份驗證連接到服務(wù)器而不輸入密碼是更好的選擇。
現(xiàn)在,如果您將本地計算機數(shù)據(jù)庫客戶端指向 127.0.0.1:3336 ,則連接將 db001.host:3306 通過 pub001.host 將充當中間服務(wù)器的計算機轉(zhuǎn)發(fā)到 MySQL 服務(wù)器。
您可以在單個 ssh 命令中將多個端口轉(zhuǎn)發(fā)到多個目標。例如,您在計算機上運行另一個 MySQL 數(shù)據(jù)庫服務(wù)器, db002.host 并且您希望從您將運行的本地客戶端連接到兩個服務(wù)器:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host
要連接到您將使用的第二臺服務(wù)器 127.0.0.1:3337 。
目標主機與 SSH 服務(wù)器相同時,而不是指定可以使用的目標主機 IP 或主機名 localhost 。
假設(shè)您需要通過在同一服務(wù)器上運行的 VNC 連接到遠程計算機,并且無法從外部訪問它。您將使用的命令是:
ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host
該 -f 選項告訴 ssh 命令在后臺運行而 -N 不是執(zhí)行遠程命令。我們正在使用, localhost 因為 VNC 和 SSH 服務(wù)器在同一主機上運行。
如果您在設(shè)置隧道時遇到問題,請檢查遠程 SSH 服務(wù)器配置并確保 AllowTcpForwarding 未設(shè)置為 no 。默認情況下,允許轉(zhuǎn)發(fā)。
遠程端口轉(zhuǎn)發(fā)
遠程端口轉(zhuǎn)發(fā)與本地端口轉(zhuǎn)發(fā)相反。它允許您將遠程 (ssh 服務(wù)器)計算機上的端口轉(zhuǎn)發(fā)到本地 (ssh 客戶端)計算機上的端口,然后將其轉(zhuǎn)發(fā)到目標計算機上的端口。
在這種類型的轉(zhuǎn)發(fā)中, SSH 服務(wù)器偵聽給定端口,并將與該端口的任何連接隧道連接到本地 SSH 客戶端上的指定端口,然后該端口連接到目標計算機上的端口。目標計算機可以是本地計算機或任何其他計算機。
在 Linux , macOS 和其他 Unix 系統(tǒng)中創(chuàng)建遠程端口轉(zhuǎn)發(fā)將 -R 選項傳遞給 ssh 客戶端:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
使用的選項如下:
- [REMOTE:]REMOTE_PORT – 遠程 SSH 服務(wù)器上的 IP 和端口號???REMOTE 表示遠程 SSH 服務(wù)器將在所有接口上綁定。
- DESTINATION:DESTINATION_PORT – 目標計算機的 IP 或主機名和端口。
- [USER@]SERVER_IP – 遠程 SSH 用戶和服務(wù)器 IP 地址。
本地端口轉(zhuǎn)發(fā)主要用于從外部向某人提供對內(nèi)部服務(wù)的訪問。
假設(shè)您正在本地計算機上開發(fā) Web 應(yīng)用程序,并且希望向其他開發(fā)人員顯示預(yù)覽。您沒有公共 IP ,因此其他開發(fā)人員無法通過 Internet 訪問該應(yīng)用程序。
如果您可以訪問遠程 SSH 服務(wù)器,則可以按如下方式設(shè)置遠程端口轉(zhuǎn)發(fā):
ssh -L 8080:127.0.0.1:3000 -N -f user@remote.host
上面的命令將使 ssh 服務(wù)器偵聽端口 8080 并將從該端口到端口的本地計算機的所有流量隧道傳輸 3000 。
現(xiàn)在您的開發(fā)人員可以輸入 the_ssh_server_ip:8080 他/她的瀏覽器并預(yù)覽您的應(yīng)用程序。
如果您有麻煩設(shè)置遠程端口轉(zhuǎn)發(fā),確保 GatewayPorts 被設(shè)置為 yes 在遠程 SSH 服務(wù)器配置。
動態(tài)端口轉(zhuǎn)發(fā)
動態(tài)端口轉(zhuǎn)發(fā)允許您在充當 SOCKS 代理服務(wù)器的本地 (ssh 客戶端)計算機上創(chuàng)建套接字。當客戶端連接到此端口時,連接將轉(zhuǎn)發(fā)到遠程 (ssh 服務(wù)器)計算機,然后將其轉(zhuǎn)發(fā)到目標計算機上的動態(tài)端口。
這樣,使用 SOCKS 代理的所有應(yīng)用程序?qū)⑦B接到 SSH 服務(wù)器,服務(wù)器將所有流量轉(zhuǎn)發(fā)到其實際目的地。
在 Linux , macOS 和其他 Unix 系統(tǒng)中創(chuàng)建動態(tài)端口轉(zhuǎn)發(fā) (SOCKS) 將 -D 選項傳遞給 ssh 客戶端:
ssh -R [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
使用的選項如下:
- [LOCAL_IP:]LOCAL_PORT – 本地機器的 ip 和端口號。當 LOCAL_IP 省略 SSH 客戶端結(jié)合在本地主機。
- [USER@]SERVER_IP – 遠程 SSH 用戶和服務(wù)器 IP 地址。
動態(tài)端口轉(zhuǎn)發(fā)的典型示例是通過 SSH 服務(wù)器隧道傳輸 Web 瀏覽器流量。
以下命令將在端口上創(chuàng)建 SOCKS 隧道 9090 :
ssh -D 9090 -N -f user@remote.host
建立隧道后,您可以配置應(yīng)用程序以使用它。本文介紹如何配置 Firefox 和 Google Chrome 瀏覽器以使用 SOCKS 代理。
必須為要對其進行隧道傳輸?shù)拿總€應(yīng)用程序單獨配置端口轉(zhuǎn)發(fā)。
在 Windows 中設(shè)置 SSH 隧道
Windows 用戶可以使用 PuTTY SSH 客戶端創(chuàng)建 SSH 隧道。你可以在這里下載 PuTTY 。
-
啟動 Putty 并在 Host name (or IP address) 字段中輸入 SSH 服務(wù)器 IP 地址。
-
在 Connection 菜單下,展開 SSH 并選擇 Tunnels 。檢查 Local 單選按鈕以設(shè)置本地, Remote 遠程和 Dynamic 動態(tài)端口轉(zhuǎn)發(fā)。
- 如果設(shè)置本地轉(zhuǎn)發(fā),請在該 Source Port 字段中 Destination 輸入本地轉(zhuǎn)發(fā)端口,然后輸入目標主機和 IP ,例如 localhost:5901 。
- 對于遠程端口轉(zhuǎn)發(fā),請在該 Source Port 字段中 Destination 輸入遠程 SSH 服務(wù)器轉(zhuǎn)發(fā)端口,然后輸入目標主機和 IP ,例如 localhost:3000 。
- 如果設(shè)置動態(tài)轉(zhuǎn)發(fā),則僅輸入 Source Port 字段中的本地 SOCKS 端口。
-
單擊 Add 按鈕,如下圖所示。
-
返回 Session 頁面以保存設(shè)置,這樣您每次都不需要輸入它們。在 Saved Session 字段中輸入會話名稱,然后單擊 Save 按鈕。
-
選擇已保存的會話,然后單擊 Open 按鈕登錄遠程服務(wù)器。
將顯示一個詢問您的用戶名和密碼的新窗口。輸入用戶名和密碼后,您將登錄到服務(wù)器并啟動 SSH 隧道。
設(shè)置公鑰驗證將允許您在不輸入密碼的情況下連接到服務(wù)器。
總結(jié)
我們已經(jīng)向您展示了如何設(shè)置 SSH 隧道并通過安全的 SSH 連接轉(zhuǎn)發(fā)流量。為了便于使用,您可以在 SSH 配置文件中定義 SSH 隧道,或創(chuàng)建將設(shè)置 SSH 隧道的 Bash 別名。
如果您遇到問題或有反饋,請在下面留言。
在Linux系統(tǒng)中創(chuàng)建SSH服務(wù)器別名 http://www.sfodin.cn/Linux/2019-05/158868.htm