iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
IT Operation

網路為什麼筆記本:從一個封包開始,把 Router、Switch 與 Routing 串起來系列 第 24 篇

Day 24|Port Forwarding 都設好了,為什麼外面還是連不進來?Public IP、Double NAT、CGNAT 差在哪?

  • 分享至 

  • xImage
  •  

Day 23 我們終於知道 Port Forwarding / DNAT 是在做什麼:

Public Endpoint
203.0.113.10:8080
        ↓
Port Forwarding
        ↓
Internal Server
192.168.1.30:80

但我明明已經設定好,朋友從外面還是連不到。

以前的我可能直接懷疑:「是不是防火牆沒開?Router 壞了?Nginx 沒有啟動?」

這些都有可能。

可是今天要先問更前面的一題:

Internet 送過來的封包,真的有到達我設定 Port Forwarding 的那一台 Router 嗎?

假設封包連家門口都還沒走到,我在房間裡調整 Server 設定,當然不會讓它突然通起來。

今天繼續沿用 Day 22、Day 23 的同一台 Server,從外面往內走,看看 Public IP、Double NAT、CGNAT 到底各自代表什麼。

本文所有 203.0.113.x、198.51.100.x 都是文件示例位址,不是可拿來上線的真實 Public IP。實機、Packet Tracer 和 ISP CGNAT 尚未驗證。

第一個疑問:Router 的 WAN IP,真的是 Internet 看到的 IP 嗎?

我打開家裡 Router 後台,發現:

Router WAN IPv4
192.168.0.2

但用同一條家用網路開「查我的 IPv4」網站,卻看到:

External IPv4
203.0.113.10

我可能會問:

為什麼 Router 說我是 192.168.0.2,但 Internet 卻看到 203.0.113.10?

因為這兩個觀察角度不一樣。

WAN IPv4
→ 這台 Router 的上游介面分配到什麼地址?

External IPv4
→ 外部網站看到這條連線從哪個來源 IPv4 出現?

如果兩個不一樣,就要往上游追查 NAT、上游閘道、出口線路、VPN 或 Proxy。

「不同」是一個線索,不是單憑這一點就能認定一定是 CGNAT。

情境一:家裡 Router 本身就有可到達的 Public IPv4

先想最簡單的模型:

Internet Client
198.51.100.20
        ↓
Internet
        ↓
Home Router
WAN: 203.0.113.10
LAN: 192.168.1.1
        ↓
Web Server
192.168.1.30:80

朋友從 Internet 發出:

198.51.100.20:53000
        ↓
203.0.113.10:8080

這個目的地就是家裡 Router 可接收的公開入口。

Router 事先有規則:

TCP 8080
→ 192.168.1.30:80

如果外部封包確實到達 Router,才有機會經過 DNAT、Firewall、LAN Routing,最後送到 Server。

所以真正的前提是:

外部入口可到達
+
NAT Mapping 存在
+
Security Policy 允許
+
Server Listen 正確
+
回程路徑正確

不是:

有 Public IPv4
=
一定可以連進來

即使是 Public IPv4,ISP 的入站限制、Router Firewall 或 Server 自身也可能造成失敗。

情境二:Double NAT——我家可能不只一台 Router

想像房子外面有兩扇門。

中華電信或其他 ISP 提供的 Gateway,本身就是 NAT Router。

我又在後面接了一台自己的 Wi-Fi Router。

Internet
        ↓
ISP Gateway
WAN: 203.0.113.10
LAN: 192.168.0.1
        ↓
192.168.0.0/24
        ↓
My Router
WAN: 192.168.0.2
LAN: 192.168.1.1
        ↓
192.168.1.0/24
        ↓
Web Server
192.168.1.30:80

這時封包會穿過兩個 NAT 邊界:

第一層
ISP Gateway 的 NAT

第二層
My Router 的 NAT

這就可以叫 Double NAT。

但要注意,不是每個 ONT、光纖數據機都在做 NAT。有的只做 Bridge,實際要以設備模式為準。

為什麼只在自己的 Router 設 Port Forwarding 還是不通?

我在內層 My Router 設:

192.168.0.2:8080
        ↓
192.168.1.30:80

可是朋友連的是:

203.0.113.10:8080

外面封包會先到達 ISP Gateway。

Internet Client
        ↓
203.0.113.10:8080
        ↓
ISP Gateway
        ↓
沒有 Inbound Mapping
        ↓
封包不會自動跑到 My Router

所以 My Router 那條設定,根本沒有機會被使用。

我只告訴第二道門該怎麼開,卻忘了第一道門也要知道該把人帶去哪裡。

如果兩台 Router 我都能管理呢?

可以在概念上串起兩層映射:

Internet
        ↓
203.0.113.10:8080
        ↓
ISP Gateway
第一層 DNAT
        ↓
192.168.0.2:8080
        ↓
My Router
第二層 DNAT
        ↓
192.168.1.30:80
        ↓
Web Server

第一台設定:

203.0.113.10:8080
→ 192.168.0.2:8080

第二台設定:

192.168.0.2:8080
→ 192.168.1.30:80

然後確認兩台設備的 Firewall、Route 和 Return Traffic。

有時也可以評估讓上游設備改成 Bridge,把 Public IPv4 交給自己的 Router;但 ISP 是否允許、PPPoE 或 DHCP 該怎麼配,必須先看實際服務。

不要為了省事,直接把所有服務放進上游 Router 的 DMZ,卻沒有評估對外暴露風險。

情境三:CGNAT——做 NAT 的上游不是我,而是 ISP

現在換一個場景。

家用 Router 的 WAN 顯示:

100.72.10.25

但對外網站看到:

203.0.113.10

網路可能長這樣:

Internet
        ↓
ISP 的 Public IPv4
203.0.113.10
        ↓
ISP CGNAT
        ↓
ISP Shared Address Space
100.64.0.0/10
        ↓
My Router WAN
100.72.10.25
        ↓
Home LAN
192.168.1.0/24
        ↓
Web Server
192.168.1.30:80

CGNAT 是 Carrier-Grade NAT,也常寫成 CGN。

它讓 ISP 在營運商網路裡管理多個用戶的 IPv4 連線,減少每個用戶都要各自持有獨立 Public IPv4 的需求。

100.64.0.0/10 是什麼?

以前我記得 Private IPv4 只有三段:

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

但這裡冒出:

100.64.0.0/10

範圍:
100.64.0.0 ~ 100.127.255.255

它不是 RFC 1918 那三段 Private IPv4,而是另外保留的 Shared Address Space。

它也不是可以直接在全球 Internet 當公開入口使用的 IPv4。

如果我的 ISP 連線 WAN 位址落在這段,就有理由優先詢問 ISP:這是否為共享位址/CGN 網路?

但是不能反過來硬背:

只要不是 100.64.0.0/10
→ 就絕對沒有 CGNAT

營運商的上游 NAT 架構可能不只一種;看到 10.x.x.x 或其他內部位址,同樣可能需要往上查。

為什麼 CGNAT 讓 Port Forwarding 特別麻煩?

家裡 Router 設定:

100.72.10.25:8080
        ↓
192.168.1.30:80

但 Internet 上的朋友連的是:

203.0.113.10:8080

封包先遇到 ISP 的 CGNAT。

除非 ISP 提供可用的入站轉送機制,否則我沒辦法只靠家用 Router 後台的設定,替 ISP 那台 NAT 建立公開入口。

所以不是我家 Port Forwarding 的語法錯了。

而是:

封包還沒到家用 Router,就已經需要另一層我無法自行控制的 Mapping。

Double NAT 跟 CGNAT 是不是同一種東西?

不是,但也不是二選一。

兩個詞在回答不同問題。

概念 真正在描述什麼?
Double NAT 封包經過兩層 NAT,是拓撲的描述
CGNAT NAT 部署在 ISP 營運商網路,是管理位置與架構的描述

如果:

Home Router NAT
+
ISP CGNAT

那封包同時經過多層 NAT。

換句話說:

CGNAT 可以出現在 Double NAT 的故事裡,但不是所有 Double NAT 都是 CGNAT。

自己家裡兩台可管理的 Router 造成 Double NAT,和 ISP 管理上游 CGNAT,排錯方式與可控制範圍不同。

為什麼我明明可以上網,外面卻不能主動連進來?

這是 Day 22 和 Day 23 最容易接起來的地方。

我的電腦主動連出去:

Home PC
192.168.1.20:53000
        ↓
Home Router NAT
        ↓
ISP CGNAT
        ↓
Internet Website

因為連線先由內部發起,上游 NAT 可以建立回程所需的 Translation State。

網站回來的封包,沿著已建立的狀態,一層一層回到電腦。

Internet 從零開始主動連進來:

Internet Client
        ↓
ISP Public IPv4:8080
        ↓
ISP CGNAT
        ↓
沒有給我的 Inbound Mapping
        ↓
到不了 Home Router

沒有對應的轉送規則,ISP CGNAT 無法任意把新的入站連線猜給某一個用戶。

所以:

能打開 YouTube、連 API、寄信,不代表家裡擁有可讓外面隨意主動連入的 Public IPv4。

DDNS 也不會解決這個問題。

home.example.com
→ 目前對外 IPv4

這只是讓網域名稱指向地址,不是替 ISP CGNAT 新增一條 Inbound Mapping。

那我要怎麼查?不要再亂按 Router 設定了

我想把排錯整理成六個步驟。

Step 1:先在 LAN 裡確認 Server 正常

先從家裡另一台電腦測:

http://192.168.1.30:80

或執行:

curl -I http://192.168.1.30

如果 LAN 裡就連不到,那先查 Web Server、Listen Port、Host Firewall、LAN 連線。

此時還不需要先怪 ISP 或 CGNAT。

Step 2:找真正負責路由的 Router WAN IPv4

打開 Router 後台,找到:

WAN IPv4 Address
Internet IPv4 Address

記錄下來,例如:

192.168.0.2

或:

100.72.10.25

重點是 WAN 介面真正拿到什麼,不是自己在 LAN 裡的 192.168.1.1。

Step 3:用同一條寬頻查對外 IPv4

用一個不經 VPN / Proxy 的裝置,在相同寬頻上確認外部網站看到的 IPv4。

例如 macOS / Linux 可以示範:

curl -4 https://api.ipify.org

注意:

  • 要比較 IPv4 對 IPv4,不要拿 IPv6 跟 IPv4 比。
  • 若有 VPN、Proxy、多 WAN 或特殊出口,就要先排除干擾。
  • WAN 與對外 IPv4 不同,只代表還要追,不等於一定是 CGNAT。

Step 4:把外層拓撲找出來

這張簡表可以幫我決定下一步:

看到的狀況 下一步先查什麼?
WAN 與對外的全球可路由 IPv4 一致 查 ISP 入站限制、Router Firewall、DNAT 和 Server
WAN 是 192.168.x.x、10.x.x.x 或 172.16~31.x.x 查自己能否管理上游 Gateway,是否雙層 NAT
WAN 在 100.64.0.0/10 優先向 ISP 確認是否為 CGN / Shared Address
WAN 與外部位址不一致,但原因不明 查 NAT、VPN、Proxy、出口線路,不能直接猜原因

注意:不是「只要不在 RFC 1918 範圍」就一定是可全球路由的 Public IPv4;還有其他保留及特殊用途 IPv4 範圍。

Step 5:真的從外部網路測試

拿手機關閉 Wi-Fi,改用行動網路測試家裡可用的公開入口。

手機(行動網路)
        ↓
Internet
        ↓
家裡 WAN 入口
        ↓
NAT / Firewall
        ↓
Web Server

為什麼不能只在家裡 Wi-Fi 裡輸入自己的 Public IP?

因為那可能遇到 NAT Loopback / Hairpin NAT。

LAN Client
→ 自己的 Public IP
→ 又回到 LAN Server

有些 Router 支援,有些不支援。

所以內部測 Public IP 失敗,不能單獨證明真正的 Internet 入站一定失敗。

Step 6:外面真的有到 Router 了,才往內追

External Packet
        ↓
WAN 可達?
        ↓
DNAT Rule 有命中?
        ↓
Firewall 放行?
        ↓
LAN Route 正確?
        ↓
Server Listen?
        ↓
Host Firewall?
        ↓
Return Traffic 經過正確 NAT 路徑?

如果使用受控的 Cisco IOS 實驗環境,也可以規劃觀察:

show ip interface brief
show ip route
show ip nat translations
show ip nat statistics
show access-lists

這些是未來 Lab 的觀察項目,不是今天已經執行成功的紀錄。不同 Packet Tracer、IOS 或家用 Router 版本可用功能也不完全相同。

如果 ISP 真的給我 CGNAT,還有其他解法嗎?

有,但要先問:

我是要讓全世界任何人用瀏覽器連網站,還是只讓授權的人連回自己的設備?

這兩種需求不能混成同一個答案。

解法 A:向 ISP 詢問可接受入站連線的 Public IPv4

這最接近 Day 23 的傳統 Port Forwarding。

但要確認:

是否有真正可用的 Public IPv4?
ISP 有沒有封鎖入站 Port?
費用與固定/動態 IP 怎麼算?
上游設備是否還有 NAT?

拿到 Public IPv4,也還是得做好 Firewall、驗證與服務安全。

解法 B:改走 IPv6

如果家裡 Server 有可全球路由的 IPv6,外部 Client 也有 IPv6 連線,就可能透過 IPv6 正常接入。

但必須確認:

IPv6 Address / Prefix
IPv6 Route
IPv6 Firewall
DNS AAAA Record(若需要網域)
Service Listen

IPv6 不等於「把所有埠直接打開」,反而更要清楚定義誰可以連進來。

解法 C:從家裡主動建立 Tunnel

Home Server
        ↓ 先主動連出去
Tunnel / Relay
        ↓
Public Entry
        ↓
Internet Client

它不要求 Internet 先直接打進家裡的 IPv4 NAT。

這對網頁服務很實用,但要另外考慮 Tunnel 供應商、存取控制、身分驗證和服務暴露範圍。

解法 D:VPN / Overlay Network

如果只是自己、家人或授權員工需要連回內部主機:

授權手機/筆電
        ↓
VPN / Overlay
        ↓
內部 Server

這通常比直接把管理介面公開到 Internet 更符合需求。

但它和「讓任何陌生瀏覽器都能打開公開網站」是不同的產品設計。

最後補兩個常見誤解:

DDNS 不會幫忙打通 CGNAT。 它解決的是名字對應位址。

在內網再架 Reverse Proxy,也不會憑空跨越 ISP 的入站 NAT。 Reverse Proxy 能幫忙分流,但前提是外部流量得先到達它,或者另外有可用的公開入口/Tunnel。

把 Day 22、Day 23、Day 24 串回同一條路徑

Day 22 問:

很多台 Private IP 主動上網,Router 怎麼知道回程給誰?

Inside 發起 Flow
→ NAT / PAT 建立狀態
→ Return Traffic 找得到原本主機

Day 23 問:

Internet 第一次主動連家裡 Server,要怎麼把公開端點交給內部主機?

Public IP:Port
→ Inbound Mapping / DNAT
→ Private IP:Port

Day 24 則是往外面再追一層:

如果我設 Port Forwarding 的 Router 根本不是 Internet 封包遇到的第一台 NAT 呢?

Internet Client
        ↓
真正的公開入口在哪?
        ↓
是否經過上游 NAT?
        ↓
上游 NAT 由誰管理?
        ↓
外部封包能不能到 My Router?
        ↓
My Router 的 Port Forwarding
        ↓
LAN Server

今天學到的不是多背三個名詞,而是再把「資料到底怎麼走」的起點往外推了一步。

先別往下看,想五題

1. Router WAN 是 192.168.0.2,但查 IP 網站看到 203.0.113.10,可以直接判定是 ISP CGNAT 嗎?

2. 有兩台都能管理的 NAT Router,為什麼只設定內層 Router 的 Port Forwarding 常常無效?

3. ISP 配給 Router 的 WAN IPv4 是 100.72.10.25,它是哪一種特殊用途位址?會讓你優先查什麼?

4. 在家中 Wi-Fi 輸入自己 Public IP 失敗,是否代表外部一定也連不進來?

5. 兩位員工只需要安全連進私人 Server,為什麼 VPN / Overlay 可能比開放 SSH Port 更合適?

  1. 不能。只能確定需要追查上游出口。也可能只是自己可管理的 ISP Gateway 在做 NAT。
  2. 外部封包會先到第一台 NAT;如果沒有第一層對應映射,它可能根本到不了內層 Router。
  3. 它落在 100.64.0.0/10 的 Shared Address Space,不是 RFC 1918;應先向 ISP 確認 CGN / 上游 NAT。
  4. 不代表。可能是 NAT Loopback / Hairpin NAT 的差異;需要使用真正的外部網路測試。
  5. 因為只有已授權的裝置與使用者能存取,不必把管理服務開放給整個 Internet 嘗試連線。

如果今天只記得三件事

第一件:

Router WAN IP 和外部網站看到的 IPv4,不一定是同一個位址。

第二件:

Double NAT
→ 經過多層 NAT

CGNAT
→ ISP 管理的 NAT

兩者可以同時出現

第三件:

Port Forwarding 必須先有封包能到達那台 Router。上游 NAT 不可控時,才需要從 Public IPv4、IPv6、Tunnel 或 VPN 的角度重新設計入口。

下一個「為什麼」

如果沒有能直接接受 IPv4 入站連線的 Public IPv4,為什麼有些服務卻還是能讓外面連回來?

下一篇繼續問:

IPv6、Tunnel 與 VPN,究竟各自在網路的哪一層打通了入口?

\


上一篇
Day 23|家裡的 Server 在線,為什麼外面連不進來?
系列文
網路為什麼筆記本:從一個封包開始,把 Router、Switch 與 Routing 串起來 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言