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