在Fedora上使用SSH端口轉(zhuǎn)發(fā)
你可能已經(jīng)熟悉使用 ssh 命令訪問遠(yuǎn)程系統(tǒng)。ssh
命令背后所使用的協(xié)議允許終端的輸入和輸出流經(jīng)安全通道。但是你知道也可以使用 ssh
來安全地發(fā)送和接收其他數(shù)據(jù)嗎?一種方法是使用“端口轉(zhuǎn)發(fā)”,它允許你在進行 ssh
會話時安全地連接網(wǎng)絡(luò)端口。本文向你展示了它是如何工作的。
關(guān)于端口
標(biāo)準(zhǔn) Linux 系統(tǒng)已分配了一組網(wǎng)絡(luò)端口,范圍是 0 - 65535。系統(tǒng)會保留 0 - 1023 的端口以供系統(tǒng)使用。在許多系統(tǒng)中,你不能選擇使用這些低端口號。通常有幾個端口用于運行特定的服務(wù)。你可以在系統(tǒng)的 /etc/services
文件中找到這些定義。
你可以認(rèn)為網(wǎng)絡(luò)端口是類似的物理端口或可以連接到電纜的插孔。端口可以連接到系統(tǒng)上的某種服務(wù),類似物理插孔后面的接線。一個例子是 Apache Web 服務(wù)器(也稱為 httpd
)。對于 HTTP 非安全連接,Web 服務(wù)器通常要求在主機系統(tǒng)上使用端口 80,對于 HTTPS 安全連接通常要求使用 443。
當(dāng)你連接到遠(yuǎn)程系統(tǒng)(例如,使用 Web 瀏覽器)時,你是將瀏覽器“連接”到你的主機上的端口。這通常是一個隨機的高端口號,例如 54001。你的主機上的端口連接到遠(yuǎn)程主機上的端口(例如 443)來訪問其安全的 Web 服務(wù)器。
那么,當(dāng)你有這么多可用端口時,為什么還要使用端口轉(zhuǎn)發(fā)呢?這是 Web 開發(fā)人員生活中的幾種常見情況。
本地端口轉(zhuǎn)發(fā)
想象一下,你正在名為 remote.example.com
的遠(yuǎn)程系統(tǒng)上進行 Web 開發(fā)。通常,你是通過 ssh
進入此系統(tǒng)的,但是它位于防火墻后面,而且該防火墻很少允許其他類型的訪問,并且會阻塞大多數(shù)其他端口。要嘗試你的網(wǎng)絡(luò)應(yīng)用,能夠使用瀏覽器訪問遠(yuǎn)程系統(tǒng)會很有幫助。但是,由于使用了討厭的防火墻,你無法通過在瀏覽器中輸入 URL 的常規(guī)方法來訪問它。
本地轉(zhuǎn)發(fā)使你可以通過 ssh
連接來建立可通過遠(yuǎn)程系統(tǒng)訪問的端口。該端口在系統(tǒng)上顯示為本地端口(因而稱為“本地轉(zhuǎn)發(fā)”)。
假設(shè)你的網(wǎng)絡(luò)應(yīng)用在 remote.example.com
的 8000 端口上運行。要將那個系統(tǒng)的 8000 端口本地轉(zhuǎn)發(fā)到你系統(tǒng)上的 8000 端口,請在開始會話時將 -L
選項與 ssh
結(jié)合使用:
$ ssh -L 8000:localhost:8000 remote.example.com
等等,為什么我們使用 localhost
作為轉(zhuǎn)發(fā)目標(biāo)?這是因為從 remote.example.com
的角度來看,你是在要求主機使用其自己的端口 8000。(回想一下,任何主機通??梢酝ㄟ^網(wǎng)絡(luò)連接 localhost
而連接到自身。)現(xiàn)在那個端口連接到你系統(tǒng)的 8000 端口了。ssh
會話準(zhǔn)備就緒后,將其保持打開狀態(tài),然后可以在瀏覽器中鍵入 http://localhost:8000
來查看你的 Web 應(yīng)用?,F(xiàn)在,系統(tǒng)之間的流量可以通過 ssh
隧道安全地傳輸!
如果你有敏銳的眼睛,你可能已經(jīng)注意到了一些東西。如果我們要 remote.example.com
轉(zhuǎn)發(fā)到與 localhost
不同的主機名怎么辦?如果它可以訪問該網(wǎng)絡(luò)上另一個系統(tǒng)上的端口,那么通??梢酝瑯虞p松地轉(zhuǎn)發(fā)該端口。例如,假設(shè)你想訪問也在該遠(yuǎn)程網(wǎng)絡(luò)中的 db.example.com
的 MariaDB 或 MySQL 服務(wù)。該服務(wù)通常在端口 3306 上運行。因此,即使你無法 ssh
到實際的 db.example.com
主機,你也可以使用此命令將其轉(zhuǎn)發(fā):
$ ssh -L 3306:db.example.com:3306 remote.example.com
現(xiàn)在,你可以在 localhost
上運行 MariaDB 命令,而實際上是在使用 db.example.com
主機。
遠(yuǎn)程端口轉(zhuǎn)發(fā)
遠(yuǎn)程轉(zhuǎn)發(fā)讓你可以進行相反操作。想象一下,你正在為辦公室的朋友設(shè)計一個 Web 應(yīng)用,并想向他們展示你的工作。不過,不幸的是,你在咖啡店里工作,并且由于網(wǎng)絡(luò)設(shè)置,他們無法通過網(wǎng)絡(luò)連接訪問你的筆記本電腦。但是,你同時使用著辦公室的 remote.example.com
系統(tǒng),并且仍然可在這里登錄。你的 Web 應(yīng)用似乎在本地 5000 端口上運行良好。
遠(yuǎn)程端口轉(zhuǎn)發(fā)使你可以通過 ssh
連接從本地系統(tǒng)建立端口的隧道,并使該端口在遠(yuǎn)程系統(tǒng)上可用。在開始 ssh
會話時,只需使用 -R
選項:
$ ssh -R 6000:localhost:5000 remote.example.com
現(xiàn)在,當(dāng)在公司防火墻內(nèi)的朋友打開瀏覽器時,他們可以進入 http://remote.example.com:6000
查看你的工作。就像在本地端口轉(zhuǎn)發(fā)示例中一樣,通信通過 ssh
會話安全地進行。
默認(rèn)情況下,sshd
守護進程運行在設(shè)置的主機上,因此只有該主機可以連接它的遠(yuǎn)程轉(zhuǎn)發(fā)端口。假設(shè)你的朋友希望能夠讓其他 example.com
公司主機上的人看到你的工作,而他們不在 remote.example.com
上。你需要讓 remote.example.com
主機的所有者將以下選項之一添加到 /etc/ssh/sshd_config
中:
GatewayPorts yes # 或
GatewayPorts clientspecified
第一個選項意味著 remote.example.com
上的所有網(wǎng)絡(luò)接口都可以使用遠(yuǎn)程轉(zhuǎn)發(fā)的端口。第二個意味著建立隧道的客戶端可以選擇地址。默認(rèn)情況下,此選項設(shè)置為 no
。
使用此選項,你作為 ssh
客戶端仍必須指定可以共享你這邊轉(zhuǎn)發(fā)端口的接口。通過在本地端口之前添加網(wǎng)絡(luò)地址范圍來進行此操作。有幾種方法可以做到,包括:
$ ssh -R *:6000:localhost:5000 # 所有網(wǎng)絡(luò)
$ ssh -R 0.0.0.0:6000:localhost:5000 # 所有網(wǎng)絡(luò)
$ ssh -R 192.168.1.15:6000:localhost:5000 # 單個網(wǎng)絡(luò)
$ ssh -R remote.example.com:6000:localhost:5000 # 單個網(wǎng)絡(luò)
其他注意事項
請注意,本地和遠(yuǎn)程系統(tǒng)上的端口號不必相同。實際上,有時你甚至可能無法使用相同的端口。例如,普通用戶可能不會在默認(rèn)設(shè)置中轉(zhuǎn)發(fā)到系統(tǒng)端口。
另外,可以限制主機上的轉(zhuǎn)發(fā)。如果你需要在聯(lián)網(wǎng)主機上更嚴(yán)格的安全性,那么這你來說可能很重要。 sshd
守護程進程的 PermitOpen
選項控制是否以及哪些端口可用于 TCP 轉(zhuǎn)發(fā)。默認(rèn)設(shè)置為 any
,這讓上面的所有示例都能正常工作。要禁止任何端口轉(zhuǎn)發(fā),請選擇 none
,或僅允許的特定的“主機:端口”。有關(guān)更多信息,請在手冊頁中搜索 PermitOpen
來配置 sshd
守護進程:
$ man sshd_config
最后,請記住,只有在 ssh
會話處于打開狀態(tài)時才會端口轉(zhuǎn)發(fā)。如果需要長時間保持轉(zhuǎn)發(fā)活動,請嘗試使用 -N
選項在后臺運行會話。確??刂婆_已鎖定,以防止在你離開控制臺時其被篡奪。