如何使用 SSH 隧道訪問受限服務器並安全瀏覽

已發表: 2022-01-29

SSH 客戶端連接到 Secure Shell 服務器,這使您可以像坐在另一台計算機前一樣運行終端命令。 但是 SSH 客戶端還允許您在本地系統和遠程 SSH 服務器之間“隧道”連接一個端口。

存在三種不同類型的 SSH 隧道,它們都用於不同的目的。 每個都涉及使用 SSH 服務器將流量從一個網絡端口重定向到另一個網絡端口。 流量通過加密的 SSH 連接發送,因此在傳輸過程中無法監控或修改。

您可以使用 Linux、macOS 和其他類 UNIX 操作系統中包含的ssh命令執行此操作,並且可以創建一個 ssh 配置文件來保存您的設置。 在不包含內置 ssh 命令的 Windows 上,我們建議使用免費工具 PuTTY 連接到 SSH 服務器。 它也支持 SSH 隧道。

本地端口轉發:使本地系統上的遠程資源可訪問

“本地端口轉發”允許您訪問不暴露於 Internet 的本地網絡資源。 例如,假設您想在家中訪問辦公室的數據庫服務器。 出於安全原因,該數據庫服務器僅配置為接受來自本地辦公網絡的連接。 但是,如果您可以訪問辦公室的 SSH 服務器,並且該 SSH 服務器允許來自辦公室網絡外部的連接,那麼您可以在家中連接到該 SSH 服務器並訪問數據庫服務器,就像您在辦公室一樣。 這通常是這種情況,因為保護單個 SSH 服務器免受攻擊比保護各種不同的網絡資源更容易。

為此,您需要與 SSH 服務器建立 SSH 連接,並告訴客戶端將來自本地 PC 的特定端口(例如端口 1234)的流量轉發到數據庫服務器的地址及其在辦公網絡上的端口。 因此,當您嘗試通過端口 1234 訪問您當前 PC(“localhost”)的數據庫服務器時,該流量會自動通過 SSH 連接“隧道化”並發送到數據庫服務器。 SSH 服務器位於中間,來迴轉發流量。 您可以使用任何命令行或圖形工具來訪問數據庫服務器,就像它在本地 PC 上運行一樣。

廣告

要使用本地轉發,請正常連接到 SSH 服務器,但還要提供-L參數。 語法是:

 ssh -L local_port:remote_address:remote_port [email protected]

例如,假設您辦公室的數據庫服務器位於辦公室網絡上的 192.168.1.111。 您可以通過ssh.youroffice.com訪問辦公室的 SSH 服務器,並且您在 SSH 服務器上的用戶帳戶是bob 。 在這種情況下,您的命令將如下所示:

 ssh -L 8888:192.168.1.111:1234 [email protected]

運行該命令後,您將能夠在 localhost 的 8888 端口訪問數據庫服務器。 因此,如果數據庫服務器提供 Web 訪問,您可以將 http://localhost:8888 插入 Web 瀏覽器來訪問它。 如果您有一個需要數據庫網絡地址的命令行工具,您可以將其指向 localhost:8888。 發送到您 PC 上端口 8888 的所有流量都將通過隧道傳輸到您辦公室網絡上的 192.168.1.111:1234。

如果您想連接到與 SSH 服務器本身在同一系統上運行的服務器應用程序,這會更加令人困惑。 例如,假設您在辦公室計算機上的端口 22 上運行了一個 SSH 服務器,但在同一系統的同一地址上,您還有一個在端口 1234 上運行的數據庫服務器。 您想從家裡訪問數據庫服務器,但係統只接受端口 22 上的 SSH 連接,並且其防火牆不允許任何其他外部連接。

在這種情況下,您可以運行如下命令:

 ssh -L 8888:localhost:1234 [email protected]

當您嘗試在當前 PC 上的端口 8888 訪問數據庫服務器時,流量將通過 SSH 連接發送。 當它到達運行 SSH 服務器的系統時,SSH 服務器會將其發送到“localhost”上的 1234 端口,即運行 SSH 服務器的同一台 PC。 所以上面命令中的“localhost”,從遠程服務器的角度來看,就是“localhost”。

廣告

要在 Windows 上的 PuTTY 應用程序中執行此操作,請選擇連接 > SSH > 隧道。 選擇“本地”選項。 對於“源端口”,輸入本地端口。 對於“Destination”,以 remote_address:remote_port 形式輸入目標地址和端口。

例如,如果您想設置與上述相同的 SSH 隧道,則輸入8888作為源端口,輸入localhost:1234作為目標。 之後單擊“添加”,然後單擊“打開”以打開 SSH 連接。 當然,在連接之前,您還需要在主“會話”屏幕上輸入 SSH 服務器本身的地址和端口。

相關:什麼是 SSH 代理轉發以及如何使用它?

遠程端口轉發:使本地資源在遠程系統上可訪問

“遠程端口轉發”與本地轉發相反,使用頻率不高。 它允許您使本地 PC 上的資源在 SSH 服務器上可用。 例如,假設您正在坐在您面前的本地 PC 上運行 Web 服務器。 但是您的 PC 位於不允許傳入流量到服務器軟件的防火牆後面。

假設您可以訪問遠程 SSH 服務器,您可以連接到該 SSH 服務器並使用遠程端口轉發。 您的 SSH 客戶端將告訴服務器將 SSH 服務器上的特定端口(例如端口 1234)轉發到您當前 PC 或本地網絡上的特定地址和端口。 當有人訪問 SSH 服務器上的端口 1234 時,該流量將自動通過 SSH 連接“隧道化”。 任何有權訪問 SSH 服務器的人都可以訪問您 PC 上運行的 Web 服務器。 這實際上是一種通過防火牆的隧道方式。

要使用遠程轉發,請使用帶有-R參數的ssh命令。 語法與本地轉發基本相同:

 ssh -R remote_port:local_address:local_port [email protected]

假設您想讓一個在本地 PC 上的端口 1234 上偵聽的服務器應用程序在遠程 SSH 服務器上的端口 8888 上可用。 SSH 服務器的地址是ssh.youroffice.com並且您在 SSH 服務器上的用戶名是bob 。 您將運行以下命令:

 ssh -R 8888:localhost:1234 [email protected]
廣告

然後有人可以通過端口 8888 連接到 SSH 服務器,並且該連接將通過隧道連接到在您建立連接的本地 PC 上的端口 1234 上運行的服務器應用程序。

要在 Windows 上的 PuTTY 中執行此操作,請選擇連接 > SSH > 隧道。 選擇“遠程”選項。 對於“源端口”,輸入遠程端口。 對於“目標”,以 local_address:local_port 形式輸入目標地址和端口。

例如,如果要設置上面的示例,則輸入8888作為源端口,輸入localhost:1234作為目標。 之後單擊“添加”,然後單擊“打開”以打開 SSH 連接。 當然,在連接之前,您還需要在主“會話”屏幕上輸入 SSH 服務器本身的地址和端口。

然後人們可以連接到 SSH 服務器上的端口 8888,他們的流量將通過隧道傳輸到本地系統上的端口 1234。

默認情況下,遠程 SSH 服務器只會監聽來自同一主機的連接。 換句話說,只有與 SSH 服務器本身在同一系統上的人才能連接。 這是出於安全原因。 如果要覆蓋此行為,則需要在遠程 SSH 服務器上的 sshd_config 中啟用“GatewayPorts”選項。

相關:如何在 Windows 和 Linux 中管理 SSH 配置文件

動態端口轉發:使用您的 SSH 服務器作為代理

相關: VPN 和代理之間有什麼區別?

還有“動態端口轉發”,其工作方式類似於代理或 VPN。 SSH 客戶端將創建一個 SOCKS 代理,您可以配置應用程序使用。 通過代理髮送的所有流量都將通過 SSH 服務器發送。 這類似於本地轉發——它將本地流量發送到您 PC 上的特定端口,然後通過 SSH 連接將其發送到遠程位置。

相關:為什麼使用公共 Wi-Fi 網絡可能是危險的,即使在訪問加密網站時也是如此

例如,假設您使用的是公共 Wi-Fi 網絡。 您想安全地瀏覽而不被窺探。 如果您可以在家中訪問 SSH 服務器,則可以連接到它並使用動態端口轉發。 SSH 客戶端將在您的 PC 上創建一個 SOCKS 代理。 發送到該代理的所有流量都將通過 SSH 服務器連接發送。 監控公共 Wi-Fi 網絡的任何人都無法監控您的瀏覽或審查您可以訪問的網站。 從您訪問的任何網站的角度來看,就好像您坐在家裡的 PC 前一樣。 這也意味著您可以在美國境外使用此技巧訪問僅限美國的網站——當然,假設您可以訪問美國的 SSH 服務器。

廣告

作為另一個示例,您可能想要訪問家庭網絡上的媒體服務器應用程序。 出於安全原因,您可能只有一個 SSH 服務器暴露在 Internet 上。 您不允許從 Internet 到您的媒體服務器應用程序的傳入連接。 您可以設置動態端口轉發,配置 Web 瀏覽器以使用 SOCKS 代理,然後通過 Web 瀏覽器訪問在您的家庭網絡上運行的服務器,就像您坐在家裡的 SSH 系統前一樣。 例如,如果您的媒體服務器位於家庭網絡上的端口 192.168.1.123,您可以使用 SOCKS 代理將地址192.168.1.123插入任何應用程序,您就可以像在家庭網絡上一樣訪問媒體服務器.

要使用動態轉發,請使用-D參數運行 ssh 命令,如下所示:

 ssh -D local_port 用戶名@server.com

例如,假設您可以訪問ssh.yourhome.com上的 SSH 服務器,並且您在 SSH 服務器上的用戶名是bob 。 您想使用動態轉發在當前 PC 的 8888 端口打開一個 SOCKS 代理。 您將運行以下命令:

 ssh -D 8888 [email protected]

然後,您可以配置 Web 瀏覽器或其他應用程序以使用您的本地 IP 地址 (127.0.01) 和端口 8888。來自該應用程序的所有流量都將通過隧道重定向。

要在 Windows 上的 PuTTY 中執行此操作,請選擇連接 > SSH > 隧道。 選擇“動態”選項。 對於“源端口”,輸入本地端口。

廣告

例如,如果您想在端口 8888 上創建 SOCKS 代理,則輸入8888作為源端口。 之後單擊“添加”,然後單擊“打開”以打開 SSH 連接。 當然,在連接之前,您還需要在主“會話”屏幕上輸入 SSH 服務器本身的地址和端口。

然後,您可以配置應用程序以訪問本地 PC 上的 SOCKS 代理(即 IP 地址 127.0.0.1,它指向您的本地 PC)並指定正確的端口。

相關:如何在 Firefox 中配置代理服務器

例如,您可以將 Firefox 配置為使用 SOCKS 代理。 這特別有用,因為 Firefox 可以擁有自己的代理設置,而不必使用系統範圍的代理設置。 Firefox 將通過 SSH 隧道發送其流量,而其他應用程序將正常使用您的 Internet 連接。

在 Firefox 中執行此操作時,選擇“手動代理配置”,在 SOCKS 主機框中輸入“127.0.0.1”,並在“端口”框中輸入動態端口。 將 HTTP 代理、SSL 代理和 FTP 代理框留空。

只要您打開 SSH 會話連接,隧道就會保持活動狀態並打開。 當您結束 SSH 會話並與服務器斷開連接時,隧道也將關閉。 只需使用適當的命令(或 PuTTY 中的適當選項)重新連接即可重新打開隧道。

相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦