公網直連:子網域路由
本方案適用於裝置具備公網 IPv4、可用的 IPv6,或已透過 Edge Platform 回源的環境。fn-knock 會依存取網域名稱轉送請求,讓訪客先通過統一登入,再進入對應服務。
- 網路拓撲:公網直連
- 路由方式:依
Host區分服務 - 建議原則:優先登入
- 後台位置:
系統設定 → 模式 → 子網域模式
開始前
需要準備:
- 一個可管理 DNS 的網域名稱,例如
example.com。 - 公網入口可以連線至 fn-knock 閘道。fnOS 原生 FPK、Docker Compose、OpenWrt、Linux、Synology DSM 7 SPK 與 Windows 預設使用
7999。下文統稱為「實際閘道連接埠」。 - 至少一種可用的登入方式:TOTP、密碼、Passkey 或已設定的 OIDC。
- fn-knock 所在裝置能夠存取業務服務。
沒有公網入口時,請改用內網穿透:子網域路由。需要保護 SSH、遠端桌面等原始 TCP/UDP 連接埠時,請參閱原始連接埠存取:直連授權。
部署限制
| 部署方式 | 可用性 | 注意事項 |
|---|---|---|
| fnOS 原生 FPK | 完整支援 | 可使用自動 HTTPS、主機防火牆與智慧連線 |
| Docker Compose | 支援子網域路由 | 不管理主機防火牆;不提供智慧連線與自動 HTTPS |
| OpenWrt 外掛套件 | 支援子網域路由 | 可搭配主機防火牆;不提供自動 HTTPS;智慧連線仰賴既有的 dnsmasq,且主設定必須 Include /etc/dnsmasq.d/ |
| Synology DSM 7 SPK | 支援子網域路由 | 不支援直連、主機防火牆管理與智慧連線;透過 DSM 防火牆及路由器/NAT 管理入站路徑 |
| Windows x86_64 | 可作為公網閘道 | 7999 預設監聽所有介面;需要自行確認 Windows Firewall Profile、路由器/NAT、IPv6 防火牆與 ISP 入站原則,不支援直連授權 |
Docker 中的 127.0.0.1 是 Container 本身。如果業務服務位於主機或其他裝置,請填入 Container 可存取的位址。
1. 設定公網入口與 DNS
將身分驗證網域名稱與業務網域名稱解析至公網入口。例如:
| 網域名稱 | 用途 | 解析目標 |
|---|---|---|
auth.example.com | 統一登入 | 192.0.2.10 |
nas.example.com | NAS 服務 | 192.0.2.10 |
也可以為 *.example.com 設定 Wildcard DNS Record。
路由器應將公網連接埠轉送至 fn-knock 閘道:
- 公網
443→ 實際閘道連接埠:存取時通常不需要指定連接埠。 - 公網自訂連接埠 → 實際閘道連接埠:存取位址需要保留該公網連接埠。
管理入口只用於設定 fn-knock,不應作為公網回源目標。各部署方式使用的連接埠請參閱連接埠與入口。
2. 切換至子網域模式
前往 系統設定 → 模式,選擇 子網域模式 並儲存。
儲存後,側邊欄應顯示 子網域映射。如果先前使用內網穿透,切換模式會停止相關 Tunnel;路徑映射也可能遭到清除,因此切換前應先備份現有設定。
Docker 部署不會自動修改主機防火牆,需要自行只開放規劃中的公網連接埠。
3. 設定根網域
前往 子網域映射,展開 子網域模式設定,填入:
網域名稱:example.com身分驗證服務使用的連接埠:填入訪客實際存取的公網連接埠。例如公網443轉送至實際閘道連接埠時,請填入443Edge Network 真實 IP 辨識:只有使用 EdgeOne 或 ESA 時,才依對應平台啟用
根網域會決定子網域映射的完整存取位址。修改後,請檢查既有的身分驗證服務與業務映射是否仍相符。
4. 新增身分驗證服務
在 子網域映射 中按一下 新增身分驗證服務,加入 auth.example.com。儲存後,它會顯示於 子網域模式設定 → 目前身分驗證服務。
身分驗證服務必須符合下列條件:
- 只能有一個目前生效的身分驗證入口。
- 允許公開存取,否則訪客無法進入登入頁面。
- 舊版映射若仍帶有嚴格允許清單規則,不能直接作為身分驗證服務;請記下原設定後重新建立。
- DNS 與公網連接埠已可連線至 fn-knock 閘道。
請先使用手機行動網路開啟身分驗證位址,確認能看到登入頁面,再繼續新增業務服務。
5. 新增業務映射
前往 子網域映射,新增服務。例如:
| 設定項目 | 範例 |
|---|---|
| 子網域 | nas |
| 目標 | http://192.168.1.20:5666 |
| 要求登入 | 開啟 |
| Host 回應 | 預設保留訪客存取的 Host;只有上游僅接受自身位址/Host 時才關閉 |
儲存後,業務入口為 https://nas.example.com,或包含實際公網連接埠的對應位址。
如果上游連線使用 Basic Auth,請在映射的進階設定中啟用 略過 Basic Auth,並填入上游憑證。此設定只影響 fn-knock 傳送至上游的請求,不是訪客登入方式。
Host 回應也適用於 內網穿透 → 子網域映射。除非上游明確拒絕外部 Host,否則應保留預設的「保留 Host」,避免應用程式產生錯誤的 Callback URL 或 Redirect。
Host 回應在 Runtime 中依上游 Target 生效。如果多個 Host 共用同一個 Target,它們也會共用此設定;若需要不同的回應原則,請使用不同 Target。
6. 設定存取原則
編輯 Host 映射時,目前介面會提供 要求登入 開關:
| 設定 | 行為 |
|---|---|
關閉 要求登入(目前優先登入映射) | 公開存取,不檢查 fn-knock 登入狀態與 IP 允許清單 |
開啟 要求登入 | 手動來源授權可獨立放行;自動 IP 授權通常可讓同一來源繼續存取,但不會覆蓋瀏覽器已帶有的服務範圍拒絕;沒有可用的來源授權時才檢查工作階段 |
| 舊版嚴格允許清單規則 | 即使關閉 要求登入 也不一定公開;只依有效的來源授權記錄判斷(手動加入或登入後自動建立),工作階段 Cookie 本身不能取代來源條件 |
新建個人服務通常應開啟 要求登入。目前介面不提供嚴格允許清單選項;如果升級後已有這類規則,請同時檢查手動與自動 IP 授權記錄。若要退出舊版嚴格規則,請先完整記下映射設定,再透過目前介面重新建立;只關閉 要求登入 不足以將其公開。若嚴格規則只允許手動來源,請關閉登入後自動 IP 授權,並清除遺留的自動記錄。
7. 設定 HTTPS
為 *.example.com 設定 Wildcard Certificate,並將憑證關聯至對應網域名稱。Wildcard Certificate 通常不會涵蓋根網域 example.com;如果根網域也提供服務,需要將其加入憑證 SAN。
fnOS 原生 FPK 可使用自動 HTTPS。Docker 與 OpenWrt 需要自行準備憑證,或由前置 Proxy/Edge Platform 終止 TLS。詳細設定請參閱 SSL 憑證。
8. 公網位址變動時設定 DDNS
動態公網位址應透過 DDNS 更新 DNS。請只為確實可從公網連線的 Address Family 建立 Record;如果沒有可用的 IPv6 入站能力,請勿發布 AAAA Record。
9. 從外部網路驗證
關閉手機 Wi-Fi,並依下列順序測試:
- 開啟身分驗證位址,確認登入頁面可存取。
- 開啟業務位址,確認未登入時會進入身分驗證流程。
- 完成登入,確認系統返回原本的業務位址。
- 在
請求記錄中確認命中的網域名稱、上游位址與回應狀態。
內部網路測試成功不能取代外部網路測試。家用網路的 NAT Loopback、Split DNS 與 Cache 可能會掩蓋設定錯誤。
常見問題
| 現象 | 優先檢查 |
|---|---|
| 網域名稱連線逾時 | DNS、公網位址、Port Forwarding、ISP 入站限制 |
| 開啟後進入管理頁面 | 公網回源連接埠錯誤;應指向閘道,而不是管理入口 |
| 登入後不斷重新導向 | 身分驗證網域名稱、根網域、Cookie Scope、公開 Protocol,以及前置 Proxy 的 Host / X-Forwarded-* 是否一致;請從原本的業務 Host 重新發起存取 |
| 回傳 502 | fn-knock 無法存取上游,或上游 Protocol/連接埠填寫錯誤 |
| 子網域進入錯誤服務 | Host 未被保留,或前置 Proxy 覆寫了 Host |
| HTTPS 憑證錯誤 | 憑證未涵蓋該子網域,或憑證未關聯至正確的網域名稱 |
完整疑難排解請參閱 FAQ。
