關(guān)于端口轉(zhuǎn)發(fā)簡介
端口轉(zhuǎn)發(fā)就是把網(wǎng)絡(luò)流量從一個網(wǎng)絡(luò)監(jiān)聽者(稱為一個“端口”)發(fā)送到另一個上,無論這兩個端口是否屬于同一臺電腦。在這里,端口不是某個物理實體,而是一個監(jiān)聽網(wǎng)絡(luò)活動的軟件程序。
當流量被定向發(fā)往到某個特定的端口,它會先到達一個路由器或是防火墻,亦或是其他的網(wǎng)絡(luò)程序。它最終收到的響應(yīng)可能會根據(jù)它想要通訊的端口來定義。比如,當你使用端口轉(zhuǎn)發(fā)時,你可以捕獲到發(fā)往 8080 端口的流量,然后把它轉(zhuǎn)發(fā)到 80 端口。對于接收信號的原端口來說,這個新的目標端口可能和它在同一臺設(shè)備上,也可能是在另一臺設(shè)備上。我們在很多情況下都會用到端口轉(zhuǎn)發(fā),實現(xiàn)的方式也有很多。本文將介紹其中最常見的幾種使用場景。
使用路由器來進行端口轉(zhuǎn)發(fā)
如果你在把服務(wù)器架設(shè)在家里,那么你通常是不需要轉(zhuǎn)發(fā)端口的。你的家庭路由器(通常是你從網(wǎng)絡(luò)服務(wù)提供商Internet Service Provider(ISP)獲得的 WiFi 設(shè)備)有一個內(nèi)置的防火墻,它的作用是阻止外面的世界訪問到你的家庭網(wǎng)絡(luò)。通過使用端口轉(zhuǎn)發(fā),你可以允許某個指定端口的流量穿過路由器的防火墻,并發(fā)送到局域網(wǎng)中的某個指定的 IP 地址。
比如說,你架設(shè)了一個 Minetest 服務(wù),并想要邀請你的朋友們來試試。為了讓他們能夠“穿過”你的路由器,從而到達這個 Minetest 服務(wù),你必須把路由器上的某個端口轉(zhuǎn)發(fā)到托管 Minetest 服務(wù)的電腦上。Minetest 服務(wù)默認運行在 30000 端口。你可以把路由器的 30000 端口轉(zhuǎn)發(fā)到你的電腦的 30000 端口上,或者你也可以隨便轉(zhuǎn)發(fā)到一個更簡單的端口上,這樣玩家們會更容易記住它。我發(fā)現(xiàn),當使用 30000 端口的時候,人們時常會少數(shù)幾個 0(特別是沒有逗號分隔符的幫助時),所以我一般使用路由器的 1234 端口,然后把它轉(zhuǎn)發(fā)到我內(nèi)部的 30000 端口。
每個制造商的路由器接口都不一樣,但是不管你用的是什么牌子的路由器,方法都是相同的。首先,你需要登錄到你的路由器。
通常,路由器的 IP 地址和登錄信息都會打印在路由器上,或者在是它的文檔里。我有一個型號為 TP-Link GX90 的路由器,我在瀏覽器里訪問 10.0.1.1 就可以登錄它,但你的路由器可能是 192.168.0.1 或者其他的地址。
我的 GX90 路由器把端口轉(zhuǎn)發(fā)功能稱為“虛擬服務(wù)器virtual servers”,它是路由器的“NAT 轉(zhuǎn)發(fā)”標簽下的一個功能選項。NAT 的意思是 “網(wǎng)絡(luò)地址轉(zhuǎn)換Network Address Translation”。在其他路由器中,這個功能可能直接就叫做“端口轉(zhuǎn)發(fā)”,或者叫“防火墻”、“服務(wù)”等。找到正確的功能選項可能需要花費一些時間,因此,你可能需要花點時間研究下你的路由器文檔。
當你找到了路由器的端口轉(zhuǎn)發(fā)設(shè)置,添加一個新規(guī)則,命名一個外部端口(在我的例子中是 1234)和一個內(nèi)部端口(30000)。把外部端口轉(zhuǎn)發(fā)到內(nèi)部端口上,而內(nèi)部端口綁定在你想要大家訪問的電腦的 IP 地址上。如果你需要一些查詢本機 IP 地址的幫助,你可以閱讀 Archit Modi 寫的 《??在 Linux 上如何查詢本地 IP 地址??》。
一個簡單端口轉(zhuǎn)發(fā)規(guī)則
(圖片提供者是 Seth Kenlon,遵循 ??署名-相同方式共享 4.0 國際?? 協(xié)議)
在這個例子中,訪問家庭網(wǎng)絡(luò)的 1234 端口的流量,都會被轉(zhuǎn)發(fā)到了我的家庭服務(wù)器的 30000 端口上,后者的 IP 地址是 10.0.1.2。
在繼續(xù)之前,先保存這個規(guī)則。
接下來,你需要知道你的家庭網(wǎng)絡(luò)的公網(wǎng) IP 地址是多少。你可以從 ??ifconfig.me?? 或者 ??icanhazip.com?? 上獲得這個地址。你可以在瀏覽器中打開這兩個網(wǎng)站的其中一個,也可以使用 ??curl?? 命令來獲取到這個 IP。
$ curl ifconfig.me
93.184.216.34
現(xiàn)在,你的朋友們就可以在 Minetest 客戶端里輸入 ??169.169.23.49:1234?
?,加入你的 Minetest 服務(wù)器啦。
使用防火墻來進行端口轉(zhuǎn)發(fā)
系統(tǒng)管理員有時候需要轉(zhuǎn)發(fā)訪問服務(wù)器的流量。比如說,你可能想要接收來自 80 端口的流量,但是用戶的服務(wù)卻運行在 8065 端口。如果不進行端口轉(zhuǎn)發(fā)的話,你的用戶就不得不在輸入瀏覽器的 URL 末尾,加上一個指定的端口號,例如 ??example.com:8065?
?。大多數(shù)用戶都不習(xí)慣于考慮端口的問題,所以你需要把訪問網(wǎng)絡(luò)通用的 80 端口的請求攔截下來,然后轉(zhuǎn)發(fā)到你的網(wǎng)絡(luò)應(yīng)用的具體端口,這會給用戶帶來巨大的方便。
你可以在服務(wù)器上使用 ??firewall-cmd?? 來轉(zhuǎn)發(fā)流量,它是訪問 ??firewalld?
? 后臺進程的前端front-end命令。
首先,設(shè)置好你想要轉(zhuǎn)發(fā)的端口和協(xié)議:
$ sudo firewall-cmd \
--add-forward-port \
port=80:proto=tcp:toport=8065
為使修改永久生效,你需要加上 ??--runtime-to-permanent?
? 選項:
$ sudo firewall-cmd --runtime-to-permanent
網(wǎng)絡(luò)轉(zhuǎn)發(fā)
在網(wǎng)絡(luò)傳輸中,除了端口轉(zhuǎn)發(fā)外,還有其他種類的轉(zhuǎn)發(fā)forwarding形式,例如 IP 轉(zhuǎn)發(fā)和代理等。當你熟悉了網(wǎng)絡(luò)信息在路由時是怎么被處理的之后,你可以試試不同的轉(zhuǎn)發(fā)形式(然后使用 ??tcpdump?
? 或類似的工具)來看看哪一種最好、最符合你的需求。