自己的 VPN 自己架,連線加密不靠第三方。

用 Docker 在 Synology NAS 上架設 WireGuard VPN:wg-easy 介面設定、客戶端設定、iOS / Android / Windows / Mac 全平台連線,比 Tailscale 更輕量、完全自主掌控。

你有 NAS,但出門在外怎麼安全存取它?

QuickConnect 方便,但每次傳輸都要經過 Synology 的中繼伺服器。DDNS + 直接開 port 讓服務暴露在公網,風險取決於你防護做得多嚴。Tailscale 幫你解決了打洞和金鑰管理,但流量要經過他們的協調伺服器,最終控制權不在你手上。

WireGuard 是另一條路:輕量、快速、現代加密,自己架、自己管、連線資料不過任何第三方。設定比想像中簡單,用 Docker 跑的話,整個過程不需要打半行指令。


🎯 這篇適合誰

你的情況 建議先看哪段
不確定 WireGuard 是否適合自己 先看「跟其他方案比較」
想直接動手安裝 跳到「安裝 wg-easy」
已裝好,想設定手機連線 跳到「客戶端設定」
連線連不上,需要排查 直接看「常見問題」

💡 WireGuard 是什麼

WireGuard 是近幾年崛起的 VPN 協定,2020 年正式合併進 Linux 核心。跟傳統 VPN(OpenVPN、IPsec)相比,它的優勢不是功能更多,而是設計更精簡:

  • 程式碼只有約 4,000 行,OpenVPN 超過 70,000 行。程式碼越少,攻擊面越小,審計也越容易
  • 連線速度快:握手過程極短,從 4G 切到 Wi-Fi 後連線可以自動恢復,不需要重新建立
  • 現代加密算法:ChaCha20、Poly1305、Curve25519,不需要選擇加密套件,設定失誤的空間幾乎為零
  • 設定極簡:每個端點就是一對公私鑰,設定檔只有十幾行

缺點是 WireGuard 本身沒有圖形介面,原生操作需要打指令。這就是為什麼我們用 wg-easy 這個 Docker 映像——它把 WireGuard 包裝成一個有 Web UI 的管理介面,在 NAS 上點幾下就能搞定。


⚖️ 跟其他方案比較

要理解 WireGuard 適不適合你,先看它跟其他選項的差異:

WireGuard(自架) Tailscale OpenVPN QuickConnect
控制權 完全自主 金鑰協調靠 Tailscale 完全自主 Synology 中繼
設定難度 中(需要了解概念) 極簡(幾乎零設定) 高(大量參數) 極簡
速度 快(P2P 直連時) 受中繼伺服器影響
需要開 port 是(UDP) 否(打洞) 是(TCP/UDP)
費用 免費(硬體自備) 免費方案有限制 免費 免費(附帶限速)
多設備管理 wg-easy 介面 自動(magic DNS) 需要 CA 管理 不適用

什麼時候選 WireGuard?

  • 在意資料不過第三方伺服器
  • 需要全流量 VPN(把所有網路流量走 NAS 出口)
  • 想要完整控制哪些設備能連、能存取什麼
  • 家裡有靜態 IP 或可靠的 DDNS

什麼時候選 Tailscale?

  • 網路環境複雜(CG-NAT、IPv6 only),難以開 port
  • 不想管憑證和金鑰,省時優先
  • 設備很多,想要自動 mesh 網路而不是手動管理每台

兩個不互斥——你可以 WireGuard 主力、Tailscale 備援,連不上 WireGuard 的環境(公司網路封鎖 UDP)就切 Tailscale。

WireGuard VPN 架構圖


🔌 開始前:確認前提條件

架設 WireGuard 需要幾個前提:

1. 固定對外 IP 或 DDNS

WireGuard 客戶端需要知道要連到哪個 IP。如果你的對外 IP 會變動,先設好 DDNS:

DSM → 控制台 → 外部存取 → DDNS → 新增

Synology 提供免費的 *.synology.me DDNS,或者用 Cloudflare DDNS 也可以。記下你的 DDNS 域名,後面設定 WireGuard 時要用。

2. 路由器開 UDP port

WireGuard 預設用 UDP port 51820。需要在家用路由器設定 port forwarding,把外部的 UDP 51820 轉到 NAS 的內網 IP。

不同路由器介面不同,通常在「進階設定」→「虛擬伺服器」或「Port Forwarding」找到。

3. NAS 支援 Container Manager

WireGuard 用 Docker 跑,需要 Container Manager。支援的機型:DS923+、DS925+、DS1522+ 等 x86_64 機型;J 系列不支援。


🐋 安裝 wg-easy

wg-easy 是一個把 WireGuard server + Web UI 包在一起的 Docker 映像,管理介面清楚,新增客戶端、查看連線狀態、下載設定檔都在瀏覽器裡操作。

步驟一:建立資料目錄

用 File Station 建立資料夾:/docker/wg-easy/

這個目錄會儲存 WireGuard 的設定檔、金鑰、客戶端清單,非常重要,備份 NAS 時記得包含進去。

步驟二:用 docker-compose 建立容器

Container Manager → 專案 → 新增 → 輸入以下內容:

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    environment:
      - LANG=zh-TW
      - WG_HOST=你的DDNS域名或對外IP
      - PASSWORD_HASH=你的密碼hash
      - WG_PORT=51820
      - WG_DEFAULT_ADDRESS=10.8.0.x
      - WG_DEFAULT_DNS=1.1.1.1
      - WG_ALLOWED_IPS=0.0.0.0/0
      - WG_PERSISTENT_KEEPALIVE=25
    volumes:
      - /volume1/docker/wg-easy:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

幾個欄位說明:

  • WG_HOST:填你的 DDNS 域名(例如 yourhome.synology.me)或固定 IP。客戶端靠這個找到伺服器。
  • PASSWORD_HASH:wg-easy 的 Web UI 登入密碼(hash 格式)。產生方式見下方。
  • WG_DEFAULT_DNS:VPN 客戶端使用的 DNS,填 1.1.1.1 是 Cloudflare 公共 DNS。如果你有跑 AdGuard Home,填 NAS 的內網 IP,VPN 連線時廣告一起擋。
  • WG_ALLOWED_IPS=0.0.0.0/0:全流量走 VPN(full tunnel)。如果只想透過 VPN 存取家裡內網,改成 192.168.1.0/24(你的內網段)。

產生密碼 hash:

wg-easy v14 之後要求密碼用 bcrypt hash 格式,不接受明文。最簡單的方式是用它自己的工具:

Container Manager 隨便跑一個 wg-easy 容器後,在記錄頁面找到自動產生的 hash 提示,或者用以下任一工具在線上產生 bcrypt hash(注意:bcrypt hash 不含密碼本身,可以放心在公開設定檔裡)。

常用工具:bcrypt-generator.com,rounds 設 12,產生後填入 PASSWORD_HASH= 後方(整個 hash 字串,含 $2b$... 前綴)。

步驟三:啟動並確認

Container Manager 儲存並啟動專案,等容器狀態變為「執行中」。

瀏覽器開 http://NAS的IP:51821,看到 wg-easy 登入頁面就成功了。輸入你設定的密碼登入。


📱 客戶端設定

wg-easy 啟動後,在 Web UI 裡新增客戶端(點「+ 新增客戶端」,輸入名稱,例如「iPhone」「Daniel 筆電」)。

每個客戶端會自動產生一對金鑰,Web UI 上可以直接掃 QR Code 或下載 .conf 設定檔。

iOS / Android

  1. App Store 或 Google Play 安裝「WireGuard」官方 App
  2. App 首頁點「+」→「從 QR Code 建立」
  3. 在 wg-easy Web UI 找到對應客戶端,點 QR Code 圖示
  4. 手機掃描,隧道名稱自訂(例如「Home VPN」)→ 儲存
  5. 點開隧道旁的開關,連線成功後狀態會變藍色

iOS 設定上需要允許 WireGuard App 新增 VPN 設定,系統會跳出確認視窗,允許即可。

Windows

  1. 下載 WireGuard Windows 客戶端(wireguard.com)並安裝
  2. 在 wg-easy Web UI 下載 .conf 設定檔(點客戶端項目右側的下載圖示)
  3. WireGuard Windows App → 「從檔案匯入隧道」→ 選擇下載的 .conf
  4. 點「啟動」連線,狀態列出現 WireGuard 圖示代表連線中

macOS

  1. App Store 安裝「WireGuard」官方 App(免費)
  2. 下載 .conf 設定檔
  3. WireGuard App → 「從檔案匯入隧道」→ 選擇 .conf
  4. 開關開啟,連線成功

確認連線成功

連線後用手機行動數據(確認不在 Wi-Fi 環境),瀏覽 http://192.168.1.100(你的 NAS 內網 IP),能打開 DSM 就代表 VPN 連線正常,流量已經走回家裡了。


🔧 進階設定:Split Tunnel vs Full Tunnel

wg-easy 預設是 Full TunnelWG_ALLOWED_IPS=0.0.0.0/0):連 VPN 後,手機 / 電腦的所有網路流量都走 NAS 出去,包含一般瀏覽網頁。

Full Tunnel 的優點: 在公共 Wi-Fi(咖啡廳、飯店)時所有流量都加密,最安全。

Full Tunnel 的缺點: 所有流量都跑你家的網路出口,如果家裡頻寬不夠大,上網速度會受影響。

Split Tunnel 設定: 只讓家裡內網流量走 VPN,其他流量直接從手機 / 電腦的網路出去。把 WG_ALLOWED_IPS 改成你的內網段,例如:

WG_ALLOWED_IPS=192.168.1.0/24

這樣連 VPN 後只有 192.168.1.x 的流量走隧道,可以存取 NAS 和家裡其他設備,但一般上網不受影響、速度也不會被限制。

如何選? 如果主要用途是在外面存取 NAS 資料,用 Split Tunnel 就夠了,速度更好,家裡頻寬壓力也小。如果在公共 Wi-Fi 很在意隱私,或者想讓所有流量都走 AdGuard Home 過濾,用 Full Tunnel。

修改設定後,需要停止容器、更新 docker-compose.yml、重新啟動,並且重新下載所有客戶端的設定檔(舊的設定檔不會自動更新)。


🗂️ 管理多個客戶端

wg-easy 的 Web UI 可以管理所有已建立的客戶端,每個客戶端顯示:

  • 名稱和 VPN IP 位址(例如 10.8.0.2
  • 最後連線時間
  • 已傳送 / 已接收的流量
  • QR Code 和設定檔下載
  • 啟用 / 停用開關(暫時停用某個客戶端連線權限,不需要刪除)

命名建議: 每個客戶端用「裝置+用途」命名,例如:iPhone-DanielMacBook-workiPad-wife。幾個月後要清理舊設備時,清楚的名稱比 client1client2 容易辨識。

離職 / 設備遺失處理: wg-easy 裡停用或刪除對應客戶端,立即生效。該設備的私鑰馬上失效,就算有人拿到舊的設定檔也連不上。


❓ 常見問題排解

掃了 QR Code,手機顯示「握手超時」或連線不上?

最常見原因是路由器的 Port Forwarding 沒設好,或者設定的是 TCP 而不是 UDP。

確認步驟: 1. 路由器確認有 UDP 51820 forwarding 到 NAS 內網 IP 2. 從手機行動數據(不要用 Wi-Fi)測試,同一個網路的 loopback 通常不能用 3. 用 nmap -sU -p 51820 你的DDNS域名 從外部測試(需要另一台電腦在外網) 4. wg-easy Web UI 確認客戶端狀態是「已啟用」

家裡 Wi-Fi 連線時不要走 VPN,怎麼設定?

WireGuard 客戶端本身沒有「在某個 Wi-Fi 自動斷開」的功能。iOS 和 Android 版官方 App 可以設定「On Demand」(按需連線規則),例如「非家用 SSID 時自動開啟 VPN」,這樣回到家裡 Wi-Fi 就不會走 VPN 了。

iOS 設定路徑:WireGuard App → 選擇隧道 → 按需啟動 → 新增規則。

連線正常但存取 NAS 的 IP 沒反應?

確認 WG_ALLOWED_IPS 包含你的 NAS 內網 IP 段。如果設成 Split Tunnel,192.168.1.0/24 這個範圍必須包含 NAS 的 IP。

另外確認 NAS 的防火牆沒有封鎖 WireGuard VPN 客戶端的 IP 段(10.8.0.x)。

wg-easy 的 Web UI 開著一直沒有連線,是正常的嗎?

正常。WireGuard 的設計是「沒有流量就沒有封包」,客戶端沒連線的時候伺服器端不會看到任何心跳包。只有客戶端啟動連線,伺服器端才會有流量顯示。

NAS 重開機後 wg-easy 沒有自動啟動?

確認 docker-compose 的 restart: unless-stopped 有設定,並且 Container Manager 服務本身在 NAS 開機後會自動啟動(套件中心 → Container Manager → 開機時自動執行)。

家裡的 ISP 是 CG-NAT,無法開 port 怎麼辦?

CG-NAT(共享 NAT)下路由器拿到的是私有 IP,沒辦法做 port forwarding。這種情況 WireGuard 就很難從外部主動連進來。替代方案:

  1. Tailscale:專門解決這個問題,不需要開 port
  2. Cloudflare Tunnel:可以把服務透過 Cloudflare 反代出去,不需要開 port

如果確定是 CG-NAT(路由器 WAN 介面的 IP 是私有 IP 段,例如 100.x.x.x),聯絡 ISP 確認能否申請固定 IP 或移除 CG-NAT,部分 ISP 免費提供。


📋 安全注意事項

自架 VPN 安全不安全,取決於你怎麼管理。幾個基本原則:

WireGuard port 只開必要的: UDP 51820 對公網開放是必要的,但 wg-easy 的 Web UI port(51821)只需要在內網存取,不需要對外開。路由器的 port forwarding 只轉 51820。

定期審查客戶端清單: 舊手機換掉、電腦送修前,把對應的客戶端從 wg-easy 刪除。設定檔一旦外流,唯一解法是在伺服器端停用那個客戶端。

wg-easy 的 Web UI 密碼要夠強: 這個介面控制所有客戶端的連線權限,密碼弱等於整個 VPN 門洞大開。用密碼管理器產生一個隨機強密碼。

備份 /docker/wg-easy/ 目錄: 裡面包含伺服器的私鑰和所有客戶端設定。NAS 出問題要重新架的話,有這個備份可以直接恢復,不需要所有客戶端重新掃 QR Code。


✨ 小結

WireGuard 的核心吸引力是乾淨:協定簡單、設定精簡、金鑰管理透明。架好之後每天看不到它的存在,出門掏出手機開個開關,家裡的 NAS 就像在身邊一樣。

如果你之前因為「VPN 好像很難」而一直靠 QuickConnect 湊合,wg-easy 值得試一次。整個架設流程不需要打一行指令,難度跟裝一個 Docker 容器差不多。

能自己掌控連線的人,不需要把資料的安全交給別人。

🔗 延伸閱讀

這篇有幫助嗎? 自己的 VPN 自己架,連線加密不靠第三方。