跳至正文

為什麼打造 fn-knock

許多人買 NAS,是想把照片、檔案及自己的服務留在自己手上。裝好設備後,很快就會碰到一個問題:人在外面時,要怎麼連回家裡的 NAS?

最直接的做法是設定 Port Forwarding。相簿開一個 Port、下載器開一個 Port、管理後台再開一個 Port,用起來確實方便。但這些 Port 一旦直接暴露到公網,面對的就不只有你和家人,還有 24 小時不間斷掃描公網位址的 Bot。你看到的是家裡的服務,它們看到的則是一批可以持續嘗試入侵的入口。

我們打造 敲門 Knock,是希望讓公網存取更簡單:服務照常使用,入口統一交由敲門接管;訪客先完成登入,確認具備權限後,閘道才會把 Request 轉送至 NAS。

為什麼要在服務前再加一道門

2026 年初,飛牛 fnOS 發生了一起嚴重的資安事件。飛牛團隊在後續的事件說明中確認,當時發現並修補了越權存取、Path Traversal 及 Authentication Bypass 三項漏洞。部分攻擊手法公開後,尚未更新的裝置開始遭到大規模探測與攻擊。

奇安信 XLab 對惡意 Sample 的分析顯示,部分受感染裝置被納入 Netdragon Botnet,用來發動 DDoS 及執行遠端指令。惡意程式還會修改防火牆規則與 hosts 檔,干擾裝置取得更新。

這起事件帶來一個很現實的提醒:登入頁與雙因素驗證只能保護正常登入流程。若漏洞發生在登入之前,或攻擊者能繞過原有驗證,增加再多登入 Factor 也擋不住那條 Request。

這並不是飛牛獨有的問題。NAS 系統、第三方應用程式與 Docker Container 都會更新程式碼,也都可能出現新的漏洞。該更新時仍要及時更新,但不能把所有希望都寄託在「我已經是最新版」。少暴露一個入口,攻擊者就少一個能直接碰到服務的地方。

再加一層 Basic Auth 就夠了嗎

Lucky、Nginx 等工具都能很方便地替頁面加上 Basic Auth。若只是暫時保護頁面,或擋掉一些沒有特定目標的 Scanner,它確實很好用。

但 Basic Auth 通常就是一組長期使用的帳號密碼。它在網路上傳遞的憑據只有 Base64 Encoding,並未加密,因此必須搭配 HTTPS;MDN也明確提醒了這一點。憑據一旦外洩,取得的人就能繼續使用。

實際使用時也會遇到相容性問題。瀏覽器、WebDAV、Player 及手機 App 對 Authentication Header 的處理方式不盡相同,常見情況是登入視窗反覆跳出,或某個 Client 完全無法使用,最後只能不斷依 Path 與 Client 加入例外。

Basic Auth 可以繼續作為補強措施,但我們不希望它成為 NAS 公網存取的唯一憑據。敲門使用獨立的登入憑據與工作階段,可以加入 TOTP、Passkey 及外部帳號,也能檢視、撤銷工作階段,並限制每組憑據可以存取哪些服務。

已經有 WAF,還需要敲門嗎

雷池(SafeLine)這類 WAF 很適合保護公開網站。網站原本就要接待所有訪客,WAF 負責從 Request 中辨識 SQL Injection、XSS、Path Traversal 及惡意 Bot。

NAS 管理後台、下載器及私人相簿通常不需要接待陌生訪客。與其讓所有 Request 先碰到服務,再判斷它像不像攻擊,我們更希望未登入的人完全連不到服務。

兩者可以搭配使用。敲門本身也提供 WAF、Scanner 攔截、封鎖清單及 Rate Limit。登入負責確認訪客是否具有權限,WAF 則繼續檢查已進入閘道的異常 Request,各自處理不同層級的問題。

為什麼不直接使用 Tailscale 或 ZeroTier

Tailscale、ZeroTier、EasyTier 及 WireGuard 都是成熟的 Mesh VPN 方案。如果使用的裝置相對固定,而且每台裝置都能安裝 Client,它們提供的網路隔離會更完整。

問題在於,手機、平板與電腦都必須先加入虛擬網路。臨時更換裝置,或想分享某項服務給家人時,都要多做一次 Client 設定。裝置上已經執行其他 VPN 或 Proxy 時,還可能遇到 Routing、DNS 或系統 VPN 權限衝突。

敲門面向的是另一種使用方式:開啟瀏覽器、輸入自己的網域,登入後直接使用。它不要求每台裝置安裝 Mesh VPN Client,也不會接管整台裝置的網路出口。

這兩類方案沒有絕對的優劣。如果完全不想提供公網入口,可以選擇虛擬組網;如果希望家人也能方便使用相簿、影音庫等 Web 服務,則可以將敲門放在公網入口前。

敲門實際做了什麼

以 Web 服務為例,可以為每個服務分配一個子網域:

text
auth.example.com     登入入口
nas.example.com      NAS
media.example.com    影音庫
download.example.com 下載器

這些網域都會先進入敲門閘道。尚未登入時,閘道會將訪客帶到驗證頁面;登入成功後,再把 Request 轉送到對應的內網服務。外部只需要一個統一入口,不必把每個應用程式的原始 Port 都轉送到公網。

家中沒有 Public IP 時,可以透過 FRP 或 Cloudflared 建立內網穿透,登入與服務映射的使用方式不變。少數必須保留 TCP / UDP 原始 Port 的服務,則可以在支援 Host 防火牆控制的平台上使用直連授權

一次存取大致會經過下列流程:

  1. 閘道檢查 Scanner 行為、封鎖/允許清單及存取來源;
  2. 要求登入的服務檢查目前工作階段;
  3. 使用者透過 TOTP、Passkey、帳號密碼或外部帳號登入;
  4. 閘道確認這組憑據是否有權存取目前服務;
  5. Request 通過 WAF 等檢查後,轉送到內網應用程式;
  6. 存取結果寫入 Request Log,異常狀況可以傳送通知。

若某個映射已啟用登入保護,沒有有效工作階段時,Request 就不會送給 Upstream。要讓這套保護真正生效,所有公網流量都必須經過敲門,原本的服務 Port 也不能繼續獨立暴露。

Request 如何流動

text
訪客

DNS / Router / CDN / Tunnel

敲門 Knock 閘道
  ├─ 登入、工作階段、允許清單、WAF、Request Log
  └─ 依網域、Path 或 Protocol 選擇內網服務

NAS、檔案服務、媒體服務或其他應用程式

管理後台只供管理員設定敲門,不是一般訪客的服務入口。實際執行由三個部分協同運作:

元件負責內容
Rust Service管理後台、登入驗證、安全政策、憑證、DDNS、Tunnel 及維運工作
Go 閘道接收外部 Request,執行登入檢查、服務路由及 Reverse Proxy
SQLite保存設定與 Runtime 資料,不需要另外安裝 Redis

管理頁面已經打包在安裝套件與 Image 中,正常執行時不需要安裝 Node.js。各平台的 Management Port、Gateway Port 及監聽範圍不同,部署時請參考連接埠、入口與存取路徑

敲門能管理什麼,又不能管理什麼

敲門只能保護經過閘道的 Request。若 Router 仍轉送原本的 Management Port,或 Cloud Platform 仍保留另一條 Origin 位址,攻擊者依然能繞過去。

安裝完成後,還需要做好下列事項:

  • 及時更新 NAS 系統、Docker Image 及服務應用程式;
  • 關閉不再使用的公網 Port 及 Origin 位址;
  • 正確設定 Router、CDN 及 Reverse Proxy 傳遞的訪客 IP;
  • 為不同帳號分配真正需要的服務,不要共用高權限憑據;
  • 定期備份設定、憑證及重要資料;
  • 使用行動網路測試一次完整的公網登入流程。

敲門預設會放行部分區域網路、Loopback 及 Private Network 來源,讓使用者在家中可以直接使用。因此,在 LAN 中能開啟頁面,不代表公網登入已正確設定,務必切換到真實外部網路測試。

先通過門禁,再存取服務

安全工具常見兩個問題:簡單的功能不夠用,專業的工具又很難設定。許多使用者只是想在手機上安全地開啟家中的相簿與檔案,並不想先從頭學習 Reverse Proxy、防火牆、憑證及各種驗證協定。

敲門希望將這些環節整合在一起,讓使用者透過手機也能完成安裝、登入、服務映射及基本防護。服務出現漏洞的可能性不會消失,但先讓未登入的人碰不到服務,就能減少很大一部分風險。

我們不會承諾裝上敲門就絕對安全,也不會建議任何人因此停止更新系統。這項產品只做一件務實的事:先確認訪客是誰,再決定是否開門。

可以先接入一項服務試用:

參考資料

最後更新:

QQ 群組:1081609274