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 後台,發現:
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。
先想最簡單的模型:
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 自身也可能造成失敗。
想像房子外面有兩扇門。
中華電信或其他 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,實際要以設備模式為準。
我在內層 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 那條設定,根本沒有機會被使用。
我只告訴第二道門該怎麼開,卻忘了第一道門也要知道該把人帶去哪裡。
可以在概念上串起兩層映射:
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,卻沒有評估對外暴露風險。
現在換一個場景。
家用 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 的需求。
以前我記得 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 或其他內部位址,同樣可能需要往上查。
家裡 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 | 封包經過兩層 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。
我想把排錯整理成六個步驟。
先從家裡另一台電腦測:
http://192.168.1.30:80
或執行:
curl -I http://192.168.1.30
如果 LAN 裡就連不到,那先查 Web Server、Listen Port、Host Firewall、LAN 連線。
此時還不需要先怪 ISP 或 CGNAT。
打開 Router 後台,找到:
WAN IPv4 Address
Internet IPv4 Address
記錄下來,例如:
192.168.0.2
或:
100.72.10.25
重點是 WAN 介面真正拿到什麼,不是自己在 LAN 裡的 192.168.1.1。
用一個不經 VPN / Proxy 的裝置,在相同寬頻上確認外部網站看到的 IPv4。
例如 macOS / Linux 可以示範:
curl -4 https://api.ipify.org
注意:
這張簡表可以幫我決定下一步:
| 看到的狀況 | 下一步先查什麼? |
|---|---|
| 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 範圍。
拿手機關閉 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 入站一定失敗。
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 版本可用功能也不完全相同。
有,但要先問:
我是要讓全世界任何人用瀏覽器連網站,還是只讓授權的人連回自己的設備?
這兩種需求不能混成同一個答案。
這最接近 Day 23 的傳統 Port Forwarding。
但要確認:
是否有真正可用的 Public IPv4?
ISP 有沒有封鎖入站 Port?
費用與固定/動態 IP 怎麼算?
上游設備是否還有 NAT?
拿到 Public IPv4,也還是得做好 Firewall、驗證與服務安全。
如果家裡 Server 有可全球路由的 IPv6,外部 Client 也有 IPv6 連線,就可能透過 IPv6 正常接入。
但必須確認:
IPv6 Address / Prefix
IPv6 Route
IPv6 Firewall
DNS AAAA Record(若需要網域)
Service Listen
IPv6 不等於「把所有埠直接打開」,反而更要清楚定義誰可以連進來。
Home Server
↓ 先主動連出去
Tunnel / Relay
↓
Public Entry
↓
Internet Client
它不要求 Internet 先直接打進家裡的 IPv4 NAT。
這對網頁服務很實用,但要另外考慮 Tunnel 供應商、存取控制、身分驗證和服務暴露範圍。
如果只是自己、家人或授權員工需要連回內部主機:
授權手機/筆電
↓
VPN / Overlay
↓
內部 Server
這通常比直接把管理介面公開到 Internet 更符合需求。
但它和「讓任何陌生瀏覽器都能打開公開網站」是不同的產品設計。
最後補兩個常見誤解:
DDNS 不會幫忙打通 CGNAT。 它解決的是名字對應位址。
在內網再架 Reverse Proxy,也不會憑空跨越 ISP 的入站 NAT。 Reverse Proxy 能幫忙分流,但前提是外部流量得先到達它,或者另外有可用的公開入口/Tunnel。
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
今天學到的不是多背三個名詞,而是再把「資料到底怎麼走」的起點往外推了一步。
第一件:
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,究竟各自在網路的哪一層打通了入口?
\