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