背景與需求

智能家居 EP11:用反向代理取代端口轉發 之後,我的 home server 已經不需要替每個服務逐個開端口轉發了。大部分的服務我都是透過 VPN 連回家來進行訪問,而少部分需要外網訪問的需求就用跟智能家居 EP11 一樣的反向代理來處理。

邏輯簡單捋一下:域名服務商(我現在用 Cloudflare)替我做純 DNS,透過 CNAME 去指向我的 DDNS 服務商(我現在用 DuckDNS),而 DDNS 幫我導到我 server 的 IP 位置,此時外網就能訪問到我的反向代理服務(我一直都是用自架的 Nginx Proxy Manager,下稱 NPM),此時根據我輸入的網址,NPM 會再幫我導向目標服務。

self-host-app

在這種設定方式之下,只要有該服務的網址,就能訪問。此時如果服務有自己的訪問控制方式(比如說帳號密碼登入)那倒就無妨,但已經 2026 年了,其實很多服務我們是 vibe coding 詠唱出來自用的,是否有方法可以不用自己刻訪問控制呢?畢竟很多小功能並不值得消耗 token 來多做這一層。

解決方案

其實有現成的方法在眼前,NPM 本身就自帶訪問控制,太好了,來實做吧!

假設我的 home server 在內網中的 IP 是 192.168.87.87,並且我讓這次架設的服務 run 在 port 5487,那麼此時在 NPM 裡面:

self-host-app-1

  • A 填入訪問網址,比如 fuwu.mydomain.tw
  • B 填入內網目標,此例中就是 http://192.168.87.87:5487

此例中的 NPM 與服務都位於可信任的內網,因此目標填寫 http 即可;外部 HTTPS 連線會在 NPM 終止,再由 NPM 透過內網 HTTP 連向服務。

接著我們在 Access Lists 中進行設置,其中:

self-host-2

  • 由 A 進入設置。
  • B 我這裡設 allow all,這樣我就可以從任意位置訪問進來。但若要嚴謹一點,也可以僅僅加入你的 IP 白名單就好。
  • C 的部分就可以設置帳號密碼。

最後回到該服務,選擇剛剛設置好的 access list:

self-host-3

並且注意,Force SSL 記得要開,否則 HTTP 訪問時輸入帳密會是明文。

至此設置完畢!

如此一來,以後這個服務就可以由外網訪問,但同時有一層訪問控制,使其不至於裸奔。