之前我們介紹過的 Tailscale ,它讓 WireGuard 這種 VPN 連線多裝置到一個可彼此互聯的虛擬內網這件事,變得幾乎零設定,但它的控制伺服器始終是在 Tailscale 公司的雲端執行。對於重視資料主權、需要符合稽核要求,或單純不想被席次計價綁住的使用者來說,Headscale 提供了另一條路。這篇文章說明 Headscale 是什麼、為什麼 QNAP NAS 是合適的宿主,並提供一套可以直接套用的 Container Station 部署流程。
Headscale 是什麼
Tailscale 的架構可以拆成兩層。資料平面是節點之間的 WireGuard 點對點加密通道,控制平面則負責交換公鑰、分配 100.64.0.0/10 網段位址、下發 ACL 與 DNS 設定,以及協調 NAT 穿透。Tailscale 的用戶端與大部分元件都是開源的,唯獨控制伺服器沒有公開。
Headscale 則是由社群維護、以 BSD-3 授權釋出的 Tailscale 控制伺服器開源實作,目標明確定位在自架使用者、愛好者與小型開源組織。一個 Headscale 實例只服務一個 tailnet,不支援多租戶。專案主要維護者之一任職於 Tailscale,並獲准在工作時間內貢獻,官方與社群之間維持一種公開的協作關係。
截至本文撰寫時,Headscale 最新穩定版為 v0.29.3,於 2026 年 7 月 29 日釋出,最低支援的 Tailscale 用戶端版本為 v1.80.0。GitHub 專案累積超過 43,000 顆星。
為什麼要自建
資料主權與稽核需求
控制伺服器掌握整個網路的節點清單、公鑰、ACL 政策與登入紀錄。這些資料放在第三方雲端,對多數個人用途無妨,但在 ISO 27001 或 ITGC 稽核情境下,「網路存取控制的決策點在哪裡」是會被問到的題目。Headscale 讓這個決策點回到自己的機房,所有節點註冊、金鑰輪替與政策變更的紀錄都留在本地資料庫,可直接納入日誌管理流程。
席次成本
Tailscale 在 2026 年 4 月 8 日調整方案,免費的 Personal 方案開放至 6 位使用者,付費方案改為以指派席次計費,使用者一旦加入 tailnet 便佔用一個席次。第三方整理的定價資料顯示 Standard 方案約為每位使用者每月 8 美元,Premium 約 18 美元 。對於家庭或十人以下的小團隊,超過 6 位使用者就會進入付費區間。Headscale 沒有使用者數量限制,成本只有 NAS 本身的電費與維護時間。
不依賴外部服務可用性
自建控制平面後,節點註冊與政策下發不再受外部服務中斷影響。需要留意的是,Tailscale 的資料平面本來就是點對點,控制伺服器短暫離線時既有連線仍可維持,但新節點無法加入,金鑰到期後也無法續期。
功能完整度
Headscale 支援 Tailscale 的核心功能,包括 MagicDNS、ACL、預授權金鑰、OIDC 單一登入、子網路路由與出口節點、暫時性節點、Taildrop 檔案傳輸,以及內建 DERP 中繼伺服器。v0.29 系列新增了 autogroup:member、autogroup:tagged 與實驗性的 autogroup:self,並支援 SSH 政策中的 check 動作。
為什麼放在 QNAP NAS 上
控制伺服器的負載極輕。它不轉送任何使用者流量,只在節點上線、政策變更或金鑰輪替時做少量協調工作。這種常駐、低負載、需要持久儲存的服務,正好是 7 x 24 運作 NAS 的強項。
QNAP 的 Container Station 內建 Docker Engine 與 Compose V2,可以直接以 YAML 建立多容器應用,容器資料預設放在 /share/Container 下,重開機後仍會保留。相較於另外養一台 VPS,NAS 通常已經全天候運轉,也已經有 RAID 與快照保護,把 Headscale 的 SQLite 資料庫放在上面,備份策略可以直接沿用。
QNAP 官方另有 Tailscale QPKG 套件,NAS 本身可以同時是控制伺服器與網路中的一個節點,對外提供子網路路由,讓 LAN 內無法安裝 Tailscale 的裝置也能被存取。
部署前準備
需要準備的項目如下。
一台可執行 Container Station 的 QNAP NAS,本文以 QuTS Hero 6.0.x 搭配 Container Station 為例
一個公開網域,例如 headscale.example.com,DNS A 紀錄指向家中或機房的公網 IP
路由器上將 443/TCP 與 3478/UDP 轉發至 NAS
若 NAS 的 443 已被 QTS 管理介面佔用,先在控制台將管理埠改到其他埠號 。
控制伺服器必須以 HTTPS 提供服務,Tailscale 用戶端不接受純 HTTP 的 login server。本文使用 Caddy 作為反向代理並自動申請 Let’s Encrypt 憑證。
部署步驟
建立目錄結構
透過 SSH 登入 NAS,建立設定與資料目錄。
mkdir -p /share/Container/headscale/config mkdir -p /share/Container/headscale/data mkdir -p /share/Container/headscale/caddy
撰寫 Headscale 設定檔
將以下內容存為 /share/Container/headscale/config/config.yaml,並把 server_url 改成自己的網域。
server_url: https://headscale.example.com listen_addr: 0.0.0.0:8080 metrics_listen_addr: 127.0.0.1:9090 noise: private_key_path: /var/lib/headscale/noise_private.key prefixes: v4: 100.64.0.0/10 v6: fd7a:115c:a1e0::/48 allocation: sequential derp: server: enabled: true region_id: 999 region_code: “qnap” region_name: “QNAP NAS DERP” stun_listen_addr: “0.0.0.0:3478” private_key_path: /var/lib/headscale/derp_server_private.key urls: – https://controlplane.tailscale.com/derpmap/default auto_update_enabled: true update_frequency: 3h database: type: sqlite sqlite: path: /var/lib/headscale/db.sqlite write_ahead_log: true dns: magic_dns: true base_domain: ts.example.com nameservers: global: – 1.1.1.1 – 8.8.8.8 policy: mode: file path: “” log: level: info
幾個重點說明。derp.server.enabled 打開內建 DERP 中繼,讓 NAT 穿透失敗時流量仍有備援路徑,同時保留 Tailscale 官方 DERP 清單作為補充。update_frequency 設為 3h 是 v0.29 升級指南的建議值。base_domain 必須與 server_url 的網域不同,否則 MagicDNS 會與控制伺服器的主機名稱衝突。
撰寫 Caddyfile
存為 /share/Container/headscale/caddy/Caddyfile。
headscale.example.com { reverse_proxy headscale:8080 }
Caddy 會自動申請並續期憑證,前提是 80/TCP 或 443/TCP 能從網際網路抵達 NAS。若只轉發 443,需改用 TLS-ALPN 挑戰,Caddy 預設會自動嘗試。
在 Container Station 建立應用
開啟 Container Station,進入「應用程式」,點選「建立」,貼上以下 Compose 內容。
services: headscale: image: headscale/headscale:0.29.3 container_name: headscale restart: unless-stopped command: serve volumes: – /share/Container/headscale/config:/etc/headscale – /share/Container/headscale/data:/var/lib/headscale ports: – “3478:3478/udp” networks: – headscale-net caddy: image: caddy:2 container_name: headscale-caddy restart: unless-stopped volumes: – /share/Container/headscale/caddy/Caddyfile:/etc/caddy/Caddyfile:ro – /share/Container/headscale/caddy/data:/data – /share/Container/headscale/caddy/config:/config ports: – “80:80” – “443:443” networks: – headscale-net depends_on: – headscale networks: headscale-net: driver: bridge
映像檔版本建議釘在明確的版本號,避免自動更新時跨過需要手動遷移的版本。Headscale 官方明確要求跨版本升級時逐一經過每個穩定版,並在升級前備份資料庫。
按下「驗證」確認 YAML 無誤後建立應用。等待數十秒,在 Caddy 的日誌中應可看到憑證申請成功的訊息。
建立使用者與預授權金鑰
Headscale 沒有官方 Web UI,日常管理透過 CLI 進行。在 NAS 上執行以下指令。
docker exec headscale headscale users create cyberq
docker exec headscale headscale users list
BASH
記下使用者的 ID,接著建立可重複使用、24 小時內有效的預授權金鑰。
docker exec headscale headscale preauthkeys create \
--user 1 --reusable --expiration 24hBASH
v0.29 起 preauthkeys 系列指令改以 ID 操作,–user 參數變為選填。
讓 QNAP NAS 自己加入網路
安裝 Tailscale QPKG 後,透過 SSH 使用 CLI 指向自建的控制伺服器。QPKG 的網頁介面只能連線至官方伺服器,自訂 login server 必須走命令列 (較新版本的 QPKG 是否已加入自訂伺服器選項,待查)。
export PATH=$PATH:$(getcfg SHARE_DEF defVolMP -f /etc/config/def_share.info)/.qpkg/Tailscale/
tailscale up \
--login-server=https://headscale.example.com \
--authkey=<預授權金鑰> \
--advertise-routes=192.168.1.0/24 \
--accept-dns=falseBASH
–advertise-routes 讓 NAS 成為子網路路由器,回到控制伺服器核准路由。
docker exec headscale headscale nodes list
docker exec headscale headscale nodes approve-routes --identifier 1 --routes 192.168.1.0/24BASH
加入其他裝置
Windows、macOS 與 Linux 用戶端可直接下指令。
tailscale up --login-server=https://headscale.example.comBASH
用戶端會顯示一段註冊網址,開啟後取得 machine key,回到 NAS 執行註冊。
docker exec headscale headscale nodes register --user cyberq --key <machine-key>BASH
iOS 與 Android 的 Tailscale 官方 App 在登入畫面的選單中提供「使用自訂協調伺服器」選項,填入 Headscale 網址即可。
設定 ACL
Headscale 的 ACL 語法與 Tailscale 相容。以下範例讓所有成員可以互連,並限制標記為 tag:iot 的裝置只能被存取而不能主動連線。
{
"tagOwners": {
"tag:iot": ["cyberq@"]
},
"acls": [
{
"action": "accept",
"src": ["autogroup:member"],
"dst": ["*:*"]
}
]
}JSON
將檔案存為 /share/Container/headscale/config/acl.json,在 config.yaml 的 policy.path 填入 /etc/headscale/acl.json,重啟容器即生效。
維運建議
備份 /share/Container/headscale/data 整個目錄,其中包含 SQLite 資料庫與兩把私鑰。建議直接納入 NAS 的快照排程
升級前閱讀 GitHub Releases 的 breaking changes,v0.28 已移除 0.25 以前的資料庫遷移,v0.29 進一步移除 0.28 以前的遷移
若需要圖形介面,社群專案 headscale-ui 與 headplane 可作為補充,兩者皆非官方維護
Headscale 的 metrics 端點預設監聽 9090,可接入既有的 Prometheus
適合與不適合的情境
Headscale 適合家庭實驗室、小型工作室,以及對資料落地有明確要求的組織。單一 tailnet 的設計對這些場景足夠。
若組織需要多租戶、依賴 OIDC 群組直接對應 ACL、需要商業支援合約,或不願意承擔控制平面的維運責任,官方 Tailscale 仍是較穩妥的選擇。Headscale v0.28 的文件註明 OIDC 群組尚不能直接用於 ACL,需以標籤對應。
延伸閱讀
Headscale 官方文件 https://headscale.net/
Headscale GitHub Releases v0.29.3 https://github.com/juanfont/headscale/releases/tag/v0.29.3
Headscale CHANGELOG https://github.com/juanfont/headscale/blob/main/CHANGELOG.md
Tailscale 免費方案說明 https://tailscale.com/docs/account/manage-plans/free-plans-discounts
Tailscale 定價頁 https://tailscale.com/pricing
Tailscale QNAP 整合文件 https://tailscale.com/kb/1273/qnap
QNAP Container Station 3 使用教學 https://www.qnap.com/en/how-to/tutorial/article/how-to-use-container-station-3











