
屋企寬頻撞上 CGNAT:Oracle VPS 加 WireGuard 開 public ingress 仲值唔值得搞?
Funnel 已支援 TCP 同來源 IP,VPS 勝在 port 同網絡控制夠自由
屋企 router 明明設好 port forwarding,街外仍然連唔入 NAS、game server 或 self-hosted app,好多時問題出喺 ISP 上游嘅 CGNAT。XDA 作者 Joe Rice-Jones 用 Oracle Cloud Always Free VPS 做公開入口,再經 WireGuard 將流量送返屋企,成功保留連線來源 IP。個方法有料,不過原文話 Tailscale Funnel 只支援 HTTPS,呢點已經追唔上現行功能。
先確認係咪真係 CGNAT
登入 router 睇 WAN IPv4,再同公開 IP 查詢網站顯示嘅地址比較。如果 WAN 位於 100.64.0.0/10,呢段正正係 RFC 6598 留畀 ISP shared address space,用緊 CGNAT 嘅機會好高。兩邊地址唔同亦可能係上游 NAT,不過要先排除光纖 modem、5G router 或另一部 router 造成嘅 double NAT。最省事嘅第一步仍然係問 ISP 可唔可以提供 public IPv4,或者服務有冇原生 IPv6。
暫時冇通訊辦或主要 ISP 嘅公開資料,足以證明香港某類固網家居寬頻普遍採用 CGNAT,所以唔應該見到 port forwarding 失效就直接怪 ISP。流動網絡、家居 5G、屋苑網絡同個別方案嘅做法亦可能唔同。自己比對 WAN 同公開地址,再向供應商核實,會可靠過照搬網上個案。

圖片:Tailscale
Oracle VPS 呢條路點行
成條路線係「互聯網訪客 → Oracle VPS 公開 IPv4 → DNAT → WireGuard tunnel → 屋企 server」。屋企嗰端主動撥出 WireGuard,所以 CGNAT 唔會阻住建立 tunnel。VPS 只改封包目的地,唔做指向 tunnel 嘅 SNAT;屋企 peer 再用獨立 routing table,將由 WireGuard 地址送出嘅回應帶返 tunnel。咁後端收到嘅 socket 連線會保留訪客 IP,fail2ban、geo-block 同 access log 先有資料可用。
實際設定要開一部 VM.Standard.E2.1.Micro、揀 public subnet 同分配 public IPv4,跟住喺 OCI Security List 放行 WireGuard UDP port 同指定服務 port。VM 裏面亦要開 IP forwarding、設好 WireGuard peer、FORWARD 規則同逐個服務嘅 DNAT。XDA 作者仲遇到 Ubuntu image MTU 9000 令 tunnel 出問題,最後將 WireGuard MTU 設成 1420;呢個係佢嗰部 VM 嘅經驗,其他網絡要用 ping 同 packet capture 自己驗證,唔好當 1420 係萬用答案。
免費 VPS 有幾個伏位
Oracle 官方列明 E2.1 Micro 得 1GB RAM、最高 50Mbps internet bandwidth,而 Always Free 每月包括 10TB outbound data,做輕量轉發算夠。不過免費 shape 可能顯示 out of host capacity,開唔開到機要睇 home region 當時有冇位。Oracle 亦寫明,連續七日 CPU 95th percentile、網絡用量都低過 20% 嘅閒置免費 VM 可能俾佢回收;所以「forever free」只代表合資格資源冇月費,唔代表供應同運作永遠有保證。
XDA 建議升級 Pay As You Go,再設 US$1 budget alert。升級後合資格 Always Free 資源仍可免費,但一揀錯 shape、磁碟或網絡服務就可能計費。Budget 只係 soft limit 同電郵提示,唔會自動截停支出,而且官方話警報定期先評估。真係想防止意外賬單,要配合 compartment quota、限制可建立嘅資源,同定期檢查 Cost Analysis,唔好將一封電郵當成煞車掣。
Tailscale Funnel 已經追返好多
Tailscale 現行 CLI 文件列明 Funnel 支援 raw TCP、TLS-terminated TCP,同 PROXY protocol v1/v2;後端支援 PROXY protocol,就可以收到原本嘅來源 IP 同 port。即係原文所講「只得 HTTPS、後端一定睇唔到來源 IP」已經唔準。Funnel 設定短好多,亦唔使管理另一部 Linux VM,不過公開入口只可用 443、8443、10000,綁定 tailnet 嘅 ts.net 名稱,流量仲有不可調校嘅 bandwidth limit。
PROXY protocol 亦有兼容門檻。Caddy、HAProxy 或適當設定嘅 Nginx 可以處理,但好多 game server、舊 app 同 OpenSSH 本身唔會直接讀呢段 header。呢類服務要多加一層支援 PROXY protocol 嘅 proxy,先可以將來源地址寫入正確 log。Oracle 加 DNAT 就自由好多,可以開自訂 port,後端亦會喺網絡層直接見到來源 IP,代價係 routing、防火牆、更新同監察全部要自己管。
公開入口唔好直插 NAS 管理頁
無論用邊套,公開 ingress 都等於主動增加攻擊面。NAS 管理頁、SSH、資料庫同 container dashboard 最好繼續留喺私人 tailnet,只公開 webhook、遊戲服務或經反向 proxy 保護嘅 app。限制 OCI Security List 來源範圍、停用 SSH 密碼登入、定期更新系統,再確認 IPv6 防火牆都有規則。用 PROXY protocol 時,後端只應接受可信 proxy 連線,否則攻擊者有機會偽造來源資料。
如果只係臨時分享網站、收 webhook,Funnel 快好多;要自訂 port、服務唔識 PROXY protocol,或者想完全控制封包路徑,Oracle VPS 加 WireGuard 仍然啱用。至於純私人 NAS 存取,維持 Tailscale 私網最穩陣,冇必要為咗一個 public IP 將管理介面擺上網。
參考來源
- XDA Developers — I bypassed CGNAT for free using Oracle's forever-free cloud tier, and it fixed the one thing Tailscale couldn't — original report
- Tailscale Funnel CLI 官方文件 — 核對 raw TCP、TLS-terminated TCP、PROXY protocol 同可用 port。
- Tailscale Funnel 功能文件 — 核對 Funnel 運作方式、設定要求、DNS、port 同 bandwidth 限制。
- Oracle Always Free Resources — 核對免費 VM 規格、流量額度、容量不足提示同閒置回收條件。
- Oracle Cloud Infrastructure Budgets — 確認 budget 屬於 soft limit,只會追蹤支出同發出警報。
- RFC 6598:IANA-Reserved IPv4 Prefix for Shared Address Space — 確認 CGNAT 常用嘅 100.64.0.0/10 shared address space。
- WireGuard Quick Start — WireGuard 官方基本設定、peer 同 tunnel 操作參考。
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







