埠轉發簡介
埠轉發就是把網路流量從一個網路監聽者(稱為一個「埠」)發送到另一個上,無論這兩個埠是否屬於同一台電腦。在這裡,埠不是某個物理實體,而是一個監聽網路活動的軟體程序。
當流量被定向發往到某個特定的埠,它會先到達一個路由器或是防火牆,亦或是其他的網路程序。它最終收到的響應可能會根據它想要通訊的埠來定義。比如,當你使用埠轉發時,你可以捕獲到發往 8080 埠的流量,然後把它轉發到 80 埠。對於接收信號的原埠來說,這個新的目標埠可能和它在同一台設備上,也可能是在另一台設備上。我們在很多情況下都會用到埠轉發,實現的方式也有很多。本文將介紹其中最常見的幾種使用場景。
使用路由器來進行埠轉發
如果你在把伺服器架設在家裡,那麼你通常是不需要轉發埠的。你的家庭路由器(通常是你從 網路服務提供商 (ISP)獲得的 WiFi 設備)有一個內置的防火牆,它的作用是阻止外面的世界訪問到你的家庭網路。通過使用埠轉發,你可以允許某個指定埠的流量穿過路由器的防火牆,並發送到區域網中的某個指定的 IP 地址。
比如說,你架設了一個 Minetest 服務,並想要邀請你的朋友們來試試。為了讓他們能夠「穿過」你的路由器,從而到達這個 Minetest 服務,你必須把路由器上的某個埠轉發到託管 Minetest 服務的電腦上。Minetest 服務默認運行在 30000 埠。你可以把路由器的 30000 埠轉發到你的電腦的 30000 埠上,或者你也可以隨便轉發到一個更簡單的埠上,這樣玩家們會更容易記住它。我發現,當使用 30000 埠的時候,人們時常會少數幾個 0(特別是沒有逗號分隔符的幫助時),所以我一般使用路由器的 1234 埠,然後把它轉發到我內部的 30000 埠。
每個製造商的路由器介面都不一樣,但是不管你用的是什麼牌子的路由器,方法都是相同的。首先,你需要登錄到你的路由器。
通常,路由器的 IP 地址和登錄信息都會列印在路由器上,或者在是它的文檔里。我有一個型號為 TP-Link GX90 的路由器,我在瀏覽器里訪問 10.0.1.1 就可以登錄它,但你的路由器可能是 192.168.0.1 或者其他的地址。
我的 GX90 路由器把埠轉發功能稱為「 虛擬伺服器 」,它是路由器的「NAT 轉發」標籤下的一個功能選項。NAT 的意思是 「 網路地址轉換 」。在其他路由器中,這個功能可能直接就叫做「埠轉發」,或者叫「防火牆」、「服務」等。找到正確的功能選項可能需要花費一些時間,因此,你可能需要花點時間研究下你的路由器文檔。
當你找到了路由器的埠轉發設置,添加一個新規則,命名一個外部埠(在我的例子中是 1234)和一個內部埠(30000)。把外部埠轉發到內部埠上,而內部埠綁定在你想要大家訪問的電腦的 IP 地址上。如果你需要一些查詢本機 IP 地址的幫助,你可以閱讀 Archit Modi 寫的 《在 Linux 上如何查詢本地 IP 地址》。
![A sample port forwarding rule](/data/attachment/album/202203/31/085036qblrwb0ksr61cm0r.jpg "A sample port forwarding rule")
一個簡單埠轉發規則
(圖片提供者是 Seth Kenlon,遵循 署名-相同方式共享 4.0 國際 協議)
在這個例子中,訪問家庭網路的 1234 埠的流量,都會被轉發到了我的家庭伺服器的 30000 埠上,後者的 IP 地址是 10.0.1.2。
在繼續之前,先保存這個規則。
接下來,你需要知道你的家庭網路的公網 IP 地址是多少。你可以從 ifconfig.me 或者 icanhazip.com 上獲得這個地址。你可以在瀏覽器中打開這兩個網站的其中一個,也可以使用 curl 命令來獲取到這個 IP。
$ curl ifconfig.me
93.184.216.34
現在,你的朋友們就可以在 Minetest 客戶端里輸入 169.169.23.49:1234
,加入你的 Minetest 伺服器啦。
使用防火牆來進行埠轉發
系統管理員有時候需要轉發訪問伺服器的流量。比如說,你可能想要接收來自 80 埠的流量,但是用戶的服務卻運行在 8065 埠。如果不進行埠轉發的話,你的用戶就不得不在輸入瀏覽器的 URL 末尾,加上一個指定的埠號,例如 example.com:8065
。大多數用戶都不習慣於考慮埠的問題,所以你需要把訪問網路通用的 80 埠的請求攔截下來,然後轉發到你的網路應用的具體埠,這會給用戶帶來巨大的方便。
你可以在伺服器上使用 firewall-cmd 來轉發流量,它是訪問 firewalld
後台進程的 前端 命令。
首先,設置好你想要轉發的埠和協議:
$ sudo firewall-cmd
--add-forward-port
port=80:proto=tcp:toport=8065
為使修改永久生效,你需要加上 --runtime-to-permanent
選項:
$ sudo firewall-cmd --runtime-to-permanent
網路轉發
在網路傳輸中,除了埠轉發外,還有其他種類的 轉發 形式,例如 IP 轉發和代理等。當你熟悉了網路信息在路由時是怎麼被處理的之後,你可以試試不同的轉發形式(然後使用 tcpdump
或類似的工具)來看看哪一種最好、最符合你的需求。
via: https://opensource.com/article/21/9/what-port-forwarding
作者:Seth Kenlon 選題:lujun9972 譯者:lkxed 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive