人在外面,家裡的桌機或 NAS 卻關機了,開不到。Wake-on-LAN(WoL)能「隔空開機」,但 WoL 靠的是區域網路的二層廣播,出了家門就送不到。把 Tailscale 和一台常開的小裝置接起來,就能從任何地方喚醒家裡的機器。
本文依 2026 年 10 月的 Tailscale 官方文件與原始碼整理,以 Tailscale v1.104 為準;UpSnap 以 v5.7.2、
etherwake以 Debian bookworm 的 1.09、wakeonlan以 0.41 為準。本文未在實機上跑完整套設定,屬文件整理。
為什麼 Tailscale 自己不能喚醒電腦
WoL 的 magic packet 是一串很短的封包:6 個位元組的 0xFF,後面接 16 次目標網卡的 MAC 位址。這串封包是在資料連結層(Layer 2)以廣播送出的,睡眠中的網卡一直聽著自己所在的區網,認出這串「叫自己的」訊號就把主機叫醒。
關鍵就在「二層廣播」這四個字。二層廣播不會跨越網段,只會在送出者所在的同一個廣播域(也就是同一條實體 LAN)裡傳播。
Tailscale 跑的是 WireGuard,工作在三層(Layer 3):流量經由 tailscale0 這個隧道介面進出,出來時已經是加密封包,只會到達其他 tailnet 裝置,到不了你家實體 LAN 上的網卡。所以你在筆電上「送一個 magic packet 給家裡的電腦」,封包只會停在 tailscale0,永遠碰不到那張睡眠中的網卡。就算設了 Subnet Router 也一樣——subnet router 轉送的是三層封包,不是二層廣播(這點在後面「常見失敗」會再講)。
Tailscale 官方在 2025 年的部落格也寫得直白:Tailscale 能做的事很多,但「自己」無法喚醒一台睡著或關機的裝置。
解法:一台常開、和目標同網段的小裝置
既然 magic packet 必須從同一個區網送出去,解法就是:在家裡放一台常開的小裝置,讓它待在區網裡當「發送端」。你在外面用 Tailscale 連進這台小裝置,再叫它把 magic packet 送出去。
常見的發送端:
- Raspberry Pi:省電、便宜、24/7 開著。站內〈Raspberry Pi 當 subnet router 兼 exit node〉最後一節就是把它順手當 WoL 發送端。
- NAS:群暉、威聯通這類本來就常開的機器。
- 路由器:有些路由器韌體內建 WoL(見下一節)。
小裝置和目標機器必須在同一個區網、用有線乙太網路。Wi-Fi 通常不支援 WoL(見「BIOS 與作業系統設定」)。
發送端本身也有幾個選項:指令列工具(etherwake、wakeonlan)、Web 介面(UpSnap),或路由器內建功能。下面依序介紹。
方法一:etherwake 或 wakeonlan 指令
最簡單的做法是 SSH 進發送端,跑一行指令送出 magic packet。
etherwake
Debian/Ubuntu/Raspberry Pi OS 用 apt 安裝:
sudo apt install etherwake它的語法是 etherwake [選項] 主機識別,重點是兩個選項:
-i ifname:指定用哪個網路介面送出,預設是eth0,介面名不對就送不出去。-b:送到廣播位址。
etherwake 用 raw socket 送封包,需要 root(非 root 執行會以狀態碼 2 失敗)。實際使用:
# 先確認介面名(可能是 eth0、end0、br0 等)
ip link
# 指定介面送出 magic packet
sudo etherwake -i eth0 AA:BB:CC:DD:EE:FFAA:BB:CC:DD:EE:FF 換成目標機器的 MAC 位址。完整的參數表見 etherwake man page。
wakeonlan
wakeonlan 是另一個工具(Perl 寫的),Debian/Ubuntu 也裝得到:
sudo apt install wakeonlan它和 etherwake 的差別在選項語意完全不同:
wakeonlan [-i IP位址] [-p 連接埠] [[MAC 位址] ...]-i是目的地 IP,不是介面;預設255.255.255.255(limited broadcast)。-p是目的地連接埠,預設9(discard port)。
wakeonlan AA:BB:CC:DD:EE:FF
# 或指定區網的廣播位址
wakeonlan -i 192.168.1.255 AA:BB:CC:DD:EE:FF它用 UDP 送封包,所以不需要 root。完整參數見 wakeonlan man page。
兩個工具都能用,etherwake 在 Raspberry Pi 教學裡比較常見。要從外面送,就是先 Tailscale SSH 或一般 SSH 連進那台常開的 Pi,再執行上面其中一行。
方法二:UpSnap Web 介面
指令列好用,但每次都要開終端機、記 MAC 位址。想要在手機上點一下就喚醒,可以自架 UpSnap:一個用 SvelteKit、Go 和 PocketBase 寫的輕量 WoL Web 應用程式(目前 v5.7.2),有網頁儀表板、可記住每台裝置、還能把關機指令設成按鈕,介面也有繁體中文(zh-TW)。
UpSnap 提供獨立 binary 和 Docker 兩種安裝方式。以 Docker 為例:
services:
upsnap:
image: ghcr.io/seriousm4x/upsnap:5
container_name: upsnap
network_mode: host # 一定要 host,見下方說明
cap_add:
- NET_RAW # 網路掃描與 ping 需要
cap_drop:
- ALL
restart: unless-stopped
volumes:
- ./data:/app/pb_data為什麼要 network_mode: host
這和 WoL 是二層廣播是同一件事。Docker 預設的 bridge 網路是三層 NAT,容器送出去的 magic packet 會被卡在虛擬網路裡,到不了實體乙太網卡。network_mode: host 讓容器直接分享宿主的網路堆疊,UpSnap 才能在實體 LAN 介面上送出二層廣播。官方 compose 檔的註解就寫著 host is required for WOL magic packets。
裝好後,用 http://<小裝置的 Tailscale IP>:8090 就能打開(預設連接埠 8090,可用 UPSNAP_HTTP_LISTEN 環境變數改)。想免去「記 IP 加連接埠」、順便拿到 HTTPS,可以用 Tailscale Serve 把 8090 發布成 https://<MagicDNS 名稱>。
UpSnap 的 README 有一句重要的安全提醒:不要把 UpSnap 暴露到公網——它的關機指令基本上是把指令丟進 shell 執行,被外人碰到等於拿到一台 root shell。這正是用 Tailscale 只開給自己連的價值。
路由器內建 WoL
如果發送端想直接用路由器,不少韌體內建 WoL:
- OpenWrt:裝
luci-app-wol套件,LuCI 選單會多出 Services → Wake on LAN;底層其實也是呼叫etherwake。只想用指令列的話裝etherwake套件即可。 - Asuswrt-Merlin:華碩韌體(含 Merlin)內建 Network Tools → Wake on LAN 介面,可以預存目標裝置、按一下就喚醒。Merlin 本身就是站內〈華碩路由器裝 Tailscale:Asuswrt-Merlin + Entware〉的主角,路由器跑 Tailscale 的同時就能從外面連進它的 WoL 介面。
這條路的好處是不用另外養一台機器;壞處是路由器韌體的 WoL 介面通常比較陽春,沒有 UpSnap 的排程、掃描那類功能。
BIOS 與作業系統設定
發送端準備好了,目標機器也得先「願意被叫醒」。各家選單路徑不同,這裡只寫一般原則,不代寫廠牌選單:
BIOS/韌體
進 BIOS(或 UEFI)設定,找 Wake on LAN、Power On By PCI-E、Resume by LAN 這類選項並開啟。有些主機板還要求開啟「ErP/EuP 省電」的例外,或把「待機供電(+5VSB)」保持開啟——這和下面「網卡沒電」的失敗原因有關。
Windows
兩個常見設定:
- 網路卡進階屬性:裝置管理員 → 網卡 → 內容 → 進階,把 Wake on Magic Packet(或「魔術封包喚醒」)設為啟用;電源管理分頁勾選「允許這個裝置喚醒電腦」和「只允許 magic packet 喚醒電腦」。
- 快速啟動:Windows 的「快速啟動」是把關機變成類似休眠的混合狀態,有時會讓網卡進入不回應 magic packet 的狀態。喚醒不順時,到電源選項關閉「快速啟動」再試。
Linux
用 ethtool 檢查與開啟:
# 查看目前 Wake-on 狀態
sudo ethtool eth0 | grep Wake-on
# 開啟 magic packet 喚醒(g = magic packet)
sudo ethtool -s eth0 wol g介面名一樣要先確認(ip link)。設了之後重開機會失效的話,要寫進網路管理工具的設定或開機腳本。
Wi-Fi 一般不支援
標準的 WoL 是有線乙太網路的功能。Wi-Fi 雖然有 Wake-on-Wireless-LAN(WoWLAN)這個延伸,但支援度差、不穩定,實務上別指望用 Wi-Fi 喚醒——發送端和目標機器都接有線最穩。
常見失敗
照做卻喚不醒,多半是下面幾種原因:
- 封包只送到
tailscale0:直接「從外面送 magic packet 給目標機器」,封包進不了實體 LAN。一定要經由一台和目標同網段的發送端代送。 - directed broadcast 跨網段失敗:有人想用 Subnet Router 把 magic packet 送到區網的廣播位址(例如
192.168.1.255)。但 subnet router 轉送的是三層封包,而且路由器預設不轉送廣播,這個「directed broadcast」的路走不通。發送端必須實體接在目標那個網段。 - 睡眠與關機的差別(S3/S4/S5):睡眠(S3,suspend to RAM)和關機但插著電(S5,soft off)都能被 WoL 喚醒,休眠(S4)也可以。問題通常不在狀態,而在網卡有沒有電、有沒有開 WoL。
- 網卡沒電:電源供應器被切斷、主機板沒有提供待機電源(5VSB)、或 BIOS 開了 ErP 深度省電把待機電源關掉,網卡就完全沒在聽,怎麼送都喚不醒。關機狀態下網卡指示燈有亮,才代表它有待機電源。
- 介面名或 MAC 位址錯:
etherwake預設eth0,介面名不符就送不到;MAC 位址抓成別張網卡(例如 USB 網卡)也一樣。
最小權限的 grants
WoL 小裝置開著 Web 介面(UpSnap)或 SSH,就要限制誰能連。Tailscale 預設全開,但這台機器只該給你自己用。把發送端打上 tag:wol,只放行你自己的裝置連它的 Web 介面與 SSH:
{
"tagOwners": {
"tag:wol": ["autogroup:admin"]
},
"grants": [
{
"src": ["autogroup:admin"],
"dst": ["tag:wol"],
"ip": ["tcp:443", "tcp:8090", "tcp:22"]
}
]
}tag:wol打在小裝置上(用 auth key 或 Admin console 套用,見 Tags 與 auth key)。- 這條
grants只讓管理員自己的裝置(autogroup:admin)連到它:tcp:443是 Tailscale Serve 的 HTTPS、tcp:8090是 UpSnap 的原始連接埠、tcp:22是 SSH。不用 Serve 的話,tcp:443可以拿掉。 - 記得把預設的
*到*:*全開規則拿掉,這條限制才有作用。語法與拿掉全開規則的注意事項見 ACL / Grants 入門。
兩個小提醒:grants 只管「走 Tailscale 的流量」,UpSnap 在區網裡送 magic packet 是本機動作,不受影響;另外如果用 Tailscale SSH,連線要同時通過兩種規則——上面這條 tcp:22 的網路規則,加上 policy 的 ssh 區段裡的 SSH 規則,兩者都要有才會放行。
Tailscale 本身有沒有 WoL 功能?
沒有可直接使用的功能。查證結果是:
- 官方文件:沒有 Wake-on-LAN 的文件頁(
tailscale.com/docs/features/wake-on-lan回 404)。 - 官方部落格(2025 年 8 月的〈Make a dedicated Wake-on-LAN server with Tailscale〉)明說 Tailscale 自己無法喚醒睡著或關機的裝置,要靠另一台裝置代送。
- v1.104.1 原始碼:
feature/wakeonlan這個套件裡註冊了一個 PeerAPI 端點/v0/wol(讓其他 tailnet 節點叫這台節點對實體 LAN 送 magic packet),對應的權限是 peer capabilityhttps://tailscale.com/cap/wake-on-lan;還有一個TS_WAKE_MAC環境變數,用來回報本機自己的 MAC(對應 issue #306 的討論)。但這些是未對外揭露的內部機制:沒有 CLI 指令、沒有管理後台按鈕、沒有文件,一般使用者用不到。
所以現階段的結論是:喚醒還是要靠本文這種「同網段小裝置代送」的做法,Tailscale 的角色是把外面安全地接到那台小裝置。
喚醒之後
開機只是第一步。喚醒之後通常要接著做遠端桌面或遊戲串流——站內之後會有遠端桌面與 Moonlight/Sunshine 的專文,它們會以本篇當「先把機器叫醒」的前置步驟。
參考資料
- Make a dedicated Wake-on-LAN server with Tailscale(Tailscale 官方部落格,2025-08-19)
- UpSnap(GitHub)
- etherwake(8)(Debian man page)
- wakeonlan(1)(Debian man page)
- Wake-on-LAN(Wikipedia)
- Wake-on-LAN packet support(Tailscale issue #306)
- luci-app-wol(OpenWrt 套件)
- Asuswrt-Merlin 功能清單(含 WakeOnLan web interface)
- Raspberry Pi 當 subnet router 兼 exit node 的實作(發送端打底)
- 華碩路由器裝 Tailscale:Asuswrt-Merlin + Entware
- ACL / Grants 入門:限制誰能連到哪裡
- Tags 與 auth key
- Tailscale Serve:把本機服務發布到 tailnet
- Tailscale SSH