你可能已經熟悉使用 ssh 命令訪問遠程系統。ssh
命令背後所使用的協議容許終端的輸入和輸出流經安全通道。可是你知道也可使用 ssh
來安全地發送和接收其餘數據嗎?一種方法是使用「端口轉發」,它容許你在進行 ssh
會話時安全地鏈接網絡端口。本文向你展現了它是如何工做的。linux
標準 Linux 系統已分配了一組網絡端口,範圍是 0 - 65535。系統會保留 0 - 1023 的端口以供系統使用。在許多系統中,你不能選擇使用這些低端口號。一般有幾個端口用於運行特定的服務。你能夠在系統的 /etc/services
文件中找到這些定義。git
你能夠認爲網絡端口是相似的物理端口或能夠鏈接到電纜的插孔。端口能夠鏈接到系統上的某種服務,相似物理插孔後面的接線。一個例子是 Apache Web 服務器(也稱爲 httpd
)。對於 HTTP 非安全鏈接,Web 服務器一般要求在主機系統上使用端口 80,對於 HTTPS 安全鏈接一般要求使用 443。github
當你鏈接到遠程系統(例如,使用 Web 瀏覽器)時,你是將瀏覽器「鏈接」到你的主機上的端口。這一般是一個隨機的高端口號,例如 54001。你的主機上的端口鏈接到遠程主機上的端口(例如 443)來訪問其安全的 Web 服務器。瀏覽器
那麼,當你有這麼多可用端口時,爲何還要使用端口轉發呢?這是 Web 開發人員生活中的幾種常見狀況。安全
想象一下,你正在名爲 remote.example.com
的遠程系統上進行 Web 開發。一般,你是經過 ssh
進入此係統的,可是它位於防火牆後面,並且該防火牆不多容許其餘類型的訪問,而且會阻塞大多數其餘端口。要嘗試你的網絡應用,可以使用瀏覽器訪問遠程系統會頗有幫助。可是,因爲使用了討厭的防火牆,你沒法經過在瀏覽器中輸入 URL 的常規方法來訪問它。ruby
本地轉發使你能夠經過 ssh
鏈接來創建可經過遠程系統訪問的端口。該端口在系統上顯示爲本地端口(於是稱爲「本地轉發」)。bash
假設你的網絡應用在 remote.example.com
的 8000 端口上運行。要將那個系統的 8000 端口本地轉發到你係統上的 8000 端口,請在開始會話時將 -L
選項與 ssh
結合使用:服務器
$ ssh -L 8000:localhost:8000 remote.example.com
複製代碼
等等,爲何咱們使用 localhost
做爲轉發目標?這是由於從 remote.example.com
的角度來看,你是在要求主機使用其本身的端口 8000。(回想一下,任何主機一般能夠經過網絡鏈接 localhost
而鏈接到自身。)如今那個端口鏈接到你係統的 8000 端口了。ssh
會話準備就緒後,將其保持打開狀態,而後能夠在瀏覽器中鍵入 http://localhost:8000
來查看你的 Web 應用。如今,系統之間的流量能夠經過 ssh
隧道安全地傳輸!網絡
若是你有敏銳的眼睛,你可能已經注意到了一些東西。若是咱們要 remote.example.com
轉發到與 localhost
不一樣的主機名怎麼辦?若是它能夠訪問該網絡上另外一個系統上的端口,那麼一般能夠一樣輕鬆地轉發該端口。例如,假設你想訪問也在該遠程網絡中的 db.example.com
的 MariaDB 或 MySQL 服務。該服務一般在端口 3306 上運行。所以,即便你沒法 ssh
到實際的 db.example.com
主機,你也可使用此命令將其轉發:ssh
$ ssh -L 3306:db.example.com:3306 remote.example.com
複製代碼
如今,你能夠在 localhost
上運行 MariaDB 命令,而其實是在使用 db.example.com
主機。
遠程轉發讓你能夠進行相反操做。想象一下,你正在爲辦公室的朋友設計一個 Web 應用,並想向他們展現你的工做。不過,不幸的是,你在咖啡店裏工做,而且因爲網絡設置,他們沒法經過網絡鏈接訪問你的筆記本電腦。可是,你同時使用着辦公室的 remote.example.com
系統,而且仍然可在這裏登陸。你的 Web 應用彷佛在本地 5000 端口上運行良好。
遠程端口轉發使你能夠經過 ssh
鏈接從本地系統創建端口的隧道,並使該端口在遠程系統上可用。在開始 ssh
會話時,只需使用 -R
選項:
$ ssh -R 6000:localhost:5000 remote.example.com
複製代碼
如今,當在公司防火牆內的朋友打開瀏覽器時,他們能夠進入 http://remote.example.com:6000
查看你的工做。就像在本地端口轉發示例中同樣,通訊經過 ssh
會話安全地進行。
默認狀況下,sshd
守護進程運行在設置的主機上,所以只有該主機能夠鏈接它的遠程轉發端口。假設你的朋友但願可以讓其餘 example.com
公司主機上的人看到你的工做,而他們不在 remote.example.com
上。你須要讓 remote.example.com
主機的全部者將如下選項之一添加到 /etc/ssh/sshd_config
中:
GatewayPorts yes # 或
GatewayPorts clientspecified
複製代碼
第一個選項意味着 remote.example.com
上的全部網絡接口均可以使用遠程轉發的端口。第二個意味着創建隧道的客戶端能夠選擇地址。默認狀況下,此選項設置爲 no
。
使用此選項,你做爲 ssh
客戶端仍必須指定能夠共享你這邊轉發端口的接口。經過在本地端口以前添加網絡地址範圍來進行此操做。有幾種方法能夠作到,包括:
$ ssh -R *:6000:localhost:5000 # 全部網絡
$ ssh -R 0.0.0.0:6000:localhost:5000 # 全部網絡
$ ssh -R 192.168.1.15:6000:localhost:5000 # 單個網絡
$ ssh -R remote.example.com:6000:localhost:5000 # 單個網絡
複製代碼
請注意,本地和遠程系統上的端口號沒必要相同。實際上,有時你甚至可能沒法使用相同的端口。例如,普通用戶可能不會在默認設置中轉發到系統端口。
另外,能夠限制主機上的轉發。若是你須要在聯網主機上更嚴格的安全性,那麼這你來講可能很重要。 sshd
守護程進程的 PermitOpen
選項控制是否以及哪些端口可用於 TCP 轉發。默認設置爲 any
,這讓上面的全部示例都能正常工做。要禁止任何端口轉發,請選擇 none
,或僅容許的特定的「主機:端口」。有關更多信息,請在手冊頁中搜索 PermitOpen
來配置 sshd
守護進程:
$ man sshd_config
複製代碼
最後,請記住,只有在 ssh
會話處於打開狀態時纔會端口轉發。若是須要長時間保持轉發活動,請嘗試使用 -N
選項在後臺運行會話。確保控制檯已鎖定,以防止在你離開控制檯時其被篡奪。
via: fedoramagazine.org/using-ssh-p…
做者:Paul W. Frields 選題:lujun9972 譯者:geekpi 校對:wxy