跳至主要内容

Raspberry Pi Zero 2 W 打造 Tailscale WoL Gateway

硬體:Raspberry Pi Zero 2 W | 架構:Tailscale (L3) + UpSnap (L2 Magic Packet) | 目的:從外網安全喚醒家中 PC


方案架構

外網裝置(手機/筆電)

│ Tailscale 加密通道

Raspberry Pi Zero 2 W(always-on)

│ UpSnap 發送 Magic Packet

家用路由器(L2 廣播)


PC 網路卡(收到後喚醒主機)

為什麼需要 Pi:Tailscale 運作在 OSI L3(網路層),WoL Magic Packet 是 L2(資料連結層)的廣播,Tailscale 無法直接送出,需要一台在 LAN 內的 always-on 裝置代為發送。

為什麼選 Pi Zero 2 W:

  • idle 功耗約 0.4W,一年電費約 NT$12
  • 價格便宜(約 NT$700)
  • ARM Cortex-A53 四核 1GHz + 512MB RAM,跑 Tailscale + UpSnap 綽綽有餘
  • Wi-Fi 連線即可,WoL 廣播會透過路由器送到有線 PC

硬體需求

  • Raspberry Pi Zero 2 W(2W 即可,不需要 2WH)
  • microSD 卡(8GB 以上,建議 A1 或 A2 等級)
  • USB-C 電源(5V 2.5A)
  • 同 LAN 內的 PC(支援 Wake-on-LAN)

步驟一:燒錄系統

  1. 下載並安裝 Raspberry Pi Imager
  2. 選擇 Raspberry Pi OS Lite (64-bit)
    • 必須是 64-bit,因為後面要用的 UpSnap binary 是 arm64
  3. 燒錄前點齒輪圖示(進階設定):
    • Hostname:upsnap(或你喜歡的名稱)
    • 啟用 SSH(密碼或 SSH key 都可以)
    • 設定 Wi-Fi SSID 和密碼
    • 設定使用者名稱和密碼(以下範例使用 jeff)
    • 設定地區與鍵盤(zh-TW、Asia/Taipei)
  4. 燒錄完成後插入 Pi,接上電源
  5. 等 1–2 分鐘讓 Pi 連上 Wi-Fi

步驟二:SSH 連入 Pi

連上後先更新系統:

sudo apt update && sudo apt upgrade -y

步驟三:安裝 Tailscale

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

複製跑出來的 URL 到瀏覽器登入,Pi 就加入你的 tailnet 了。

確認 Tailscale IP:

tailscale ip -4

步驟四:下載 UpSnap binary

⚠️ 不要用 sudo 下載或解壓,否則會造成後面遇到的權限問題。

# 切到家目錄
cd ~

# 到以下網址找最新版號
# https://github.com/seriousm4x/UpSnap/releases
# 找名稱類似 upsnap_X.X.X_linux_arm64.zip 的檔案

# 範例:5.3.2 版(請依實際最新版替換)
wget https://github.com/seriousm4x/UpSnap/releases/download/5.3.2/upsnap_5.3.2_linux_arm64.zip

# 解壓縮(若沒有 unzip:sudo apt install unzip -y)
unzip upsnap_5.3.2_linux_arm64.zip
chmod +x upsnap

確認檔案擁有者是當前使用者(不是 root):

ls -la ~/upsnap
# 應該顯示:-rwxr-xr-x 1 jeff jeff ...

步驟五:設定權限並測試啟動

# 給予發送 raw packet 的能力(只需執行一次)
sudo setcap cap_net_raw=+ep ./upsnap

# 安裝 nmap(讓 UpSnap 可以掃描網路找裝置)
sudo apt install nmap -y

# 測試啟動
./upsnap serve --http=0.0.0.0:8090

打開瀏覽器:http://<Pi的內網IP>:8090http://upsnap.local:8090,建立管理員帳號。

確認可以登入後,按 Ctrl+C 停止。


步驟六:設定為 systemd 服務(開機自動啟動)

sudo nano /etc/systemd/system/upsnap.service

貼入以下內容(注意 User 和路徑要符合你的環境):

[Unit]
Description=UpSnap Wake-on-LAN
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=jeff
WorkingDirectory=/home/jeff
ExecStart=/home/jeff/upsnap serve --http=0.0.0.0:8090
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

啟用服務:

sudo systemctl daemon-reload
sudo systemctl enable --now upsnap
sudo systemctl status upsnap

看到 active (running) 就代表成功了。


步驟七:Tailscale Serve 暴露 HTTPS(推薦)

讓你從外網用 https://upsnap.<your-tailnet>.ts.net 安全存取,免設 port forwarding,有合法 TLS 憑證。

sudo tailscale serve --bg --https=443 http://localhost:8090

確認狀態:

tailscale serve status

之後在外網用任何 Tailscale 連線的裝置開瀏覽器即可存取 UpSnap UI。


步驟八:在 UpSnap 加入 PC

  1. 登入 UpSnap web UI
  2. Add device
  3. 填入:
    • Name:你的 PC 名稱
    • MAC Address:在 Windows 用 ipconfig /all 找,或在路由器管理介面查
    • IP:PC 在 LAN 內的 IP(例如 192.168.1.100)
  4. 按下 Wake 測試

PC 端 Wake-on-LAN 設定(關鍵)

這是最容易卡關的地方,Pi 端 100% 沒問題,失敗通常都是 PC 設定錯。

BIOS(各家叫法不同,搜尋以下關鍵字)

  • ✅ 啟用 Wake on LAN / Power On by PCI-E / Resume by PCI-E Device
  • ✅ 關閉 ErP Ready / EuP
  • ✅ 關閉 Deep Sleep / Deep S5

Windows 10/11 設定

裝置管理員設定

  1. 開啟「裝置管理員」→ 展開「網路介面卡」→ 對你的有線網卡按右鍵 → 內容
  2. 電源管理索引標籤:
    • ✅ 勾「允許這個裝置喚醒電腦」
    • ✅ 勾「只允許 Magic 封包喚醒電腦」
  3. 進階索引標籤(視網卡型號可能略有不同):
    • Wake on Magic Packet → Enabled
    • Wake on Pattern Match → Enabled(可選)
    • Energy Efficient Ethernet → Disabled(部分網卡開啟會擋 WoL)

關閉快速啟動(非常重要)

不關閉的話,從完全關機狀態 WoL 會失效,只有從睡眠狀態能喚醒。

  1. 控制台 → 電源選項
  2. 點選「選擇按下電源按鈕的行為」
  3. 點「變更目前無法使用的設定」
  4. 取消勾選「啟用快速啟動
  5. 儲存變更

驗證

PC 進入睡眠或關機後,看網卡 RJ45 接孔的 LED 燈,應該還會亮著或慢速閃爍(網卡持續通電監聽 magic packet)。如果 LED 完全熄滅,代表 BIOS 或網卡設定沒對,WoL 不會生效。


路由器設定檢查

如果 magic packet 送出後 PC 沒反應,檢查路由器是否有以下設定擋住:

  • AP Isolation / Client Isolation:必須關閉,否則無線裝置無法對有線裝置廣播
  • IGMP Snooping:某些情況下會過濾廣播,可暫時關閉測試
  • mesh 系統(Eero、Orbi、Asus AiMesh 等)有時會有跨節點的隔離問題

常見問題

Q1:UpSnap 啟動報 attempt to write a readonly database

原因:pb_data/ 資料夾擁有者是 root(通常是之前用 sudo 跑過)。

# 檢查擁有者
ls -la ~/pb_data

# 改回當前使用者
sudo chown -R jeff:jeff ~/pb_data

# 或徹底重置(資料庫只有設定資料,還沒設定可以直接砍)
rm -rf ~/pb_data

Q2:Magic packet 送出後 PC 沒反應

依序檢查:

  1. PC 網卡 LED 是否在睡眠時還亮著(沒亮 → BIOS/網卡設定問題)
  2. 用 PC 上的 WoL 工具(如 WakeMeOnLan)在 LAN 內測試,排除 PC 本身問題
  3. 確認 Pi 和 PC 在同一個子網路(ip a 對照)
  4. 路由器關閉 AP Isolation
  5. PC 是否關閉「快速啟動」

Q3:Pi 重開機後 Tailscale 沒自動啟動

sudo systemctl enable tailscaled
sudo systemctl status tailscaled

Q4:想用 LAN 內網直接存取 UpSnap

http://upsnap.local:8090
# 或
http://<Pi的內網IP>:8090

Q5:UpSnap 升級

cd ~
sudo systemctl stop upsnap
wget <新版本的下載連結>
unzip upsnap_X.X.X_linux_arm64.zip
sudo setcap cap_net_raw=+ep ./upsnap
sudo systemctl start upsnap

安全性提醒

  • 不要把 UpSnap 直接暴露到公網:它的關機功能本質上是執行 shell 指令,被入侵等於被取得 LAN 內 root shell
  • 務必透過 Tailscale 存取,Tailscale 的零信任架構保證只有你授權的裝置能連線
  • 定期檢查 Tailscale ACL 設定,確認沒有不必要的裝置權限

參考資料