如果想要外部網路存取家中的電腦上的伺服器服務,其中一個方法就是通訊埠轉發 (port forwarding) 了。
port forwarding也有人翻譯為「端口映射」,有些機器則會把port forwarding稱作虛擬伺服器 (virtual server)。
通訊埠轉發可以讓外部連線到到躲在NAT背後的機器,比如Minecraft伺服器連線、存取NAS資源、P2P分享檔案等等。
舉個更具體的例子吧:我想要從外面的網路,連線到
Linux版qBittorrent的網頁界面,在家裡的時候我使用區域IPhttp://192.168.0.250:8080
就可以連線。但外部網路怎麼辦呢?我希望可以打http://140.112.91.11:8080
的公共IP連線到qBittorrent,此時就得設定通訊埠轉發了!
1. 環境#
測試過的作業系統:Ubuntu 24.04、Arch Linux 6.5.0
數據機:Zyxel P880(中華電信的數據機)
網路架構:本文假定Linux電腦透過網路線直接跟數據機(小烏龜,modem)連線的情況,中間沒有經過任何路由器。此時數據機作為NAT的角色。
2. Linux電腦端的設定#
- 假設我要開放的伺服器服務,使用的通訊埠為
8080/tcp
,防火牆要允許8080通過:
sudo ufw allow 8080/tcp
sudo ufw reload
用nmtui讓 Linux以固定IP連線到網際網路
使用
ip addr
指令取得Linux電腦的區域IP,應該是192.168.開頭,例如下面是192.168.1.101
# 範例輸出
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.1.101/24 brd 192.168.1.255 scope global dynamic noprefixroute enp2s0
- 要取得Linux電腦的公共IP,可以使用curl工具連線到ifconfig.io網站確認,例如下面是
140.112.91.11
curl ifconfig.io
# 範例輸出
140.112.91.11
3. 數據機端的設定#
開啟Linux電腦的瀏覽器,登入數據機後台。每台的數據機IP不同,Zyxel P880的IP是為
http://192.168.1.1
P880的帳密自行google,務必用admin管理員帳號登入後台
在左邊的選單勾選
Expert Mode
,Advanced Setup
的NAT
裡面就會出現Virtual Servers
,功能等同port forwarding。按下Add。勾選
Custom Service
如下填寫:
Server IP Address
填Linux電腦的IP。
External Port Start
和External Port End
填寫要轉發的通訊埠,這邊的例子我們都填寫8080,這樣外部連線到數據機8080通訊埠的時候,便會導向Linux電腦的8080通訊埠。
Protocol
改成TCP/UDP。
最後按下
Apply/Save
嘗試用另外一台裝置,輸入Linux電腦的公共IP,連線到Linux電腦吧。
需要注意家用網路的公共IP通常是浮動的,每過一段時間就會變化。如果你沒有買網域,最好搭配動態DNS的方案固定連線網址,比如 No-IP公司的方案。
4. 設定動態DNS服務#
此為選擇性步驟,如果你的公共IP時常變動,那麼你可以跑一個動態DNS (Dynamic DNS) 服務,改用域名來連線到遠端主機。
例如將http://140.112.91.11:8080
改成http://myservice.ddns.net:8080
來連線。
有很多公司提供動態DNS服務,以No-IP的為例,在Linux跑他們的客戶端,他們就會給你一個免費域名,定期按照你的公共IP更新DNS,再也不用記落落長的IP。