遠端桌面是最常見的「連回家裡」情境:出差要拿桌機上的檔案、人在外面要幫長輩修電腦、或從手機控制家裡的伺服器。常見的做法有 RustDesk、Windows 內建的 RDP(遠端桌面協定)、macOS 的螢幕共享(VNC)與 Linux 的 GNOME 遠端桌面。
它們都有一個共同的陷阱:為了從外面連進去,把協定的連接埠開到公網。這些埠長年是被掃描、爆破的目標。把 Tailscale 裝在被控端,再把這些埠只對 tailnet 開放,就能安全地從任何地方遠端控制,而且不用在路由器開埠、不用公開 IP。
本文依 2026 年 10 月的 Tailscale、RustDesk、Microsoft、Apple 與 GNOME 官方文件整理,以 Tailscale v1.104、RustDesk 1.5.0(2026 年 9 月 30 日發布)為準。本文屬文件整理,未在實機上跑完整套設定;各作業系統選單名稱以各官方文件為準,實際路徑可能隨版本微調。
遠端桌面做法一覽
| 協定 | 被控端軟體 | 預設埠 | 傳輸 | 被控端作業系統 |
|---|---|---|---|---|
| RustDesk 直連 IP | RustDesk | 21118 | TCP | 跨平台 |
| RDP | Windows 內建「遠端桌面」 | 3389 | TCP | Windows Pro/Enterprise/Education/Server |
| VNC | macOS「螢幕共享」 | 5900 | TCP | macOS |
| RDP/VNC | GNOME 遠端桌面 | 3389/5900 | TCP | Linux(GNOME) |
上表是 3 個協定、4 種做法(GNOME 那一列同時含 RDP 與 VNC),設定的細節各不同,但「走 Tailscale」的原則完全一樣:被控端裝 Tailscale,讓協定只聽 tailnet 的連線。以下逐一說明。
RustDesk:直連 IP 模式,不用自架 relay
RustDesk 是開源的遠端桌面軟體,跨 Windows、macOS、Linux、Android、iOS。它預設的連線方式是:兩台裝置先到 RustDesk 的伺服器(ID 伺服器 hbbs)互相找到彼此,打洞直連失敗時再經中繼伺服器(hbbr)轉送。這個伺服器可以用 RustDesk 官方的,也可以自架——但自架要維護一台 hbbs/hbbr,正是很多人不想碰的部分。
用 Tailscale 之後,兩台裝置已經在同一個私有網路裡,可以直接找到彼此,RustDesk 的伺服器就變成多餘的。做法是開啟 RustDesk 的「直接 IP 存取」(direct IP access)模式:
- 在被控端開啟 RustDesk,進入 Settings(設定)→ Security(安全性)。
- 打開 Enable direct IP access(啟用直接 IP 存取)。這個選項預設是關閉的,要手動打開。
- 被控端會開始監聽 TCP 21118,這個埠就是直接 IP 存取用的(可在同一頁的進階安全性設定裡改)。
選項名稱在 RustDesk 各平台的用戶端略有不同(官方文件也這麼提醒),但都位在 Security 區塊,關鍵字是「direct IP」。連接埠預設 TCP 21118,以 RustDesk 官方文件的 Advanced Settings 一節為準。
接著在控制端的 RustDesk,把連線目標從「ID」改成被控端的 Tailscale IP(100.x.y.z)或 MagicDNS 名稱,輸入密碼後連線。不需要輸入 RustDesk 的 9 碼 ID,也不會經過 RustDesk 的任何伺服器。
兩個細節:
- 密碼:直接 IP 存取可以用預設的「一次性密碼」,但無人值守的機器(例如沒接螢幕的桌機)最好設一組固定密碼,之後每次連線都用同一組。RustDesk 的 Security 區塊可以設定。
- 直接 IP 存取的連線本身未加密(RustDesk 官方 FAQ 明說這是設計如此)。但走 Tailscale 時,整條連線都在 WireGuard 隧道裡,由 Tailscale 加密,所以這點不構成問題——這正是「走 Tailscale」的另一個好處。
Windows RDP
Windows 的 RDP 是內建功能,走 TCP 3389。啟用方式:設定 → 系統 → 遠端桌面,打開 遠端桌面 開關。
Windows 家用版不能當 RDP 主機
這是很多人第一個卡住的點:Windows 家用版(Home)不能當 RDP 主機。依 Microsoft 的文件,RDP 主機(被連的那台)需要 Professional、Enterprise、Education 或 Windows Server 版本;家用版只有用戶端(連出去)的能力,不能接受連入。
要用內建 RDP 遠端控制一台 Windows,被控端必須是上述版本之一。如果被控端是家用版,改用本文的 RustDesk(或升級到 Pro)即可。
防火牆:RDP 只對 Tailscale 開放
啟用遠端桌面後,Windows 會建立一組名為 Remote Desktop 的防火牆規則(含 TCP 與 UDP 各一條),預設開放所有網路介面的 3389。要只讓 Tailscale 連得到,做法是停用這組預設規則,再加一條只允許 Tailscale 位址範圍(100.64.0.0/10)連入的規則。在以系統管理員身分開啟的 PowerShell 執行:
# 停用 Windows 預設開啟的 RDP 規則(對所有介面)。
# 用規則名稱 RemoteDesktop-* 而非顯示群組名稱,避免非英文 Windows 找不到規則
Get-NetFirewallRule -Name "RemoteDesktop-*" | Disable-NetFirewallRule
# 只允許來自 Tailscale IPv4 位址範圍的 RDP 連線
New-NetFirewallRule -DisplayName "RDP over Tailscale" -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress 100.64.0.0/10 -Action AllowWindows 內建 RDP 規則的名稱固定是英文(
RemoteDesktop-UserMode-In-TCP與RemoteDesktop-UserMode-In-UDP),不受 Windows 語系影響;Microsoft 文件常用的-DisplayGroup "Remote Desktop"在繁中等非英文 Windows 會因群組名稱被在地化(顯示為「遠端桌面」)而找不到規則,所以這裡改用規則名稱。上面停用整組規則後只重開了 TCP 3389;RDP 預設還有一條 UDP 3389 通道(可選、用於改善延遲),只用 TCP 也能正常連線,不重開 UDP 沒關係。
100.64.0.0/10 是 Tailscale 使用的 CGNAT 位址範圍(也就是所有 Tailscale IP 都在 100.64.x.x~100.127.x.x)。這樣一來,RDP 只對 tailnet 裡的其他裝置開放,實體區網或公網都連不進來。
連線與保持常開
- 控制端:Windows 用內建的「遠端桌面連線」(
mstsc);macOS、iOS、Android 用 Microsoft 的 Windows App;Linux 用 Remmina、FreeRDP 或 GNOME Connections。目標欄位填被控端的 Tailscale IP 或 MagicDNS 名稱。 - 重開機後要能連:RDP 主機通常要長時間可連,但 Windows 版 Tailscale 預設登出就斷線。要讓它重開機後、還沒人登入時就恢復連線,開啟無人值守模式(Run unattended),做法見站內〈Windows 無人值守模式與當 exit node〉。
macOS 螢幕共享(VNC)
macOS 的「螢幕共享」用的就是 VNC,預設 TCP 5900。開啟方式(macOS 13 之後的「系統設定」):
- 打開 系統設定 → 一般 → 共享 → 螢幕共享。
- 打開 螢幕共享 開關。
- 打開 VNC 檢視程式可以使用密碼控制螢幕,設一組 VNC 密碼。
從另一台 Mac 連線時,用內建的「螢幕共享」App 或在 Finder 選 前往 → 連接伺服器,輸入 vnc://<被控端的 MagicDNS 名稱>(或 Tailscale IP)。
兩點提醒:
- 「螢幕共享」與「遠端管理」不能同時開啟(Apple 文件明說)。只需要 VNC 連線的話,開「螢幕共享」就好。
- VNC 本身是未加密的協定,原始設計是給區網用的。這正是不要把 5900 開到公網的原因;走 Tailscale 時,流量在 WireGuard 隧道裡加密。
macOS 上用第三方 VNC 用戶端(Windows 的 TigerVNC、RealVNC,Linux 的 Remmina)也一樣,連到 <MagicDNS 名稱>:5900 即可。
Linux:GNOME 遠端桌面
GNOME 桌面的發行版(Ubuntu、Fedora 工作站等)內建 GNOME Remote Desktop,支援 RDP,多數發行版也編入 VNC。依 GNOME 官方文件:
- 打開 設定 → 系統 → 遠端桌面。
- 打開 桌面共享(Desktop Sharing),依需求再開 遠端控制(Remote Control) 讓對方能操作。
- 「如何連線」區塊會顯示主機名稱與連接埠;設定 RDP 的帳號密碼,或用
grdctl命令列設定 VNC 密碼。
RDP 預設走 3389(如果同時開了「遠端登入」,3389 會讓給遠端登入,桌面共享改用其他埠);VNC 走 5900。控制端用 Remmina、GNOME Connections 或 Windows 內建的遠端桌面連線,目標填被控端的 Tailscale IP 或 MagicDNS 名稱。
只想用命令列設定的話,grdctl rdp .../grdctl vnc ... 可以完成全部設定,細節見 GNOME Remote Desktop 的文件。
VNC 後端視發行版而定:Ubuntu 的
gnome-remote-desktop套件(例如 24.04 LTS 的 46.3)只編入 RDP、沒有 VNC,grdctl vnc用不了;Fedora、Debian、openSUSE 等發行版則有 VNC。裝到沒有 VNC 後端的發行版時,改用 RDP(3389)即可。
為什麼不要把 3389/5900 開到公網
RDP 和 VNC 是網路上被掃描、爆破最兇的目標之一。把 3389 或 5900 開到公網,等於把登入畫面直接攤在整個網際網路上,任何人、任何殭屍網路都能一直試密碼;就算密碼夠強,協定本身的歷史漏洞(尤其 VNC 幾乎不加密)也讓這種暴露風險很高。
把這些埠鎖在 Tailscale 的私有網路裡,服務就對公網不可見——外面連掃描都掃不到。這與 Cloudflare Tunnel、QuickConnect 這類「公開發布」的本質差異,見〈Tailscale、Cloudflare Tunnel、QuickConnect、傳統 VPN 怎麼選〉。
直連與 DERP 對桌面延遲的影響
遠端桌面對延遲非常敏感,滑鼠游標跟不跟手、鍵盤有沒有即時回應,全都取決於延遲。Tailscale 兩台裝置之間直連時延遲最低;直連失敗時會改走 DERP 中繼,封包要繞到中繼伺服器再回來,延遲明顯變高、還受限流。
所以遠端桌面卡頓時,第一件事就是確認兩台裝置是不是直連(tailscale ping <對方> 看結尾是 via <IP> 還是 via DERP(...))。判讀與改善方法見〈直連與 DERP 中繼:為什麼連線變慢、怎麼改善〉。
喚醒睡眠中的電腦
遠端桌面的前提是被控端開著機。如果目標電腦關機或睡眠,得先把它叫醒——這要靠 Wake-on-LAN 搭配一台常開的同網段小裝置,步驟見〈出門在外喚醒家裡的電腦:Wake-on-LAN 與 Tailscale〉。喚醒之後,再回到本文的 RustDesk/RDP/VNC 連進去。
給長輩遠端支援:搭配裝置分享
要幫家人、長輩修電腦,可以不用把對方拉進你的 tailnet,也不用教他架任何東西——用 RustDesk + 裝置分享(node sharing):
- 長輩的電腦裝 Tailscale 與 RustDesk,打開 RustDesk 的直接 IP 存取。
- 請對方(他 tailnet 的管理員)把電腦分享給你,你接受後,那台電腦就會出現在你自己的 tailnet 裡。
- 你在自己裝置上,用它的 Tailscale IP 或 MagicDNS 名稱連 RustDesk 的 21118 埠。
裝置分享只分享那一台機器,你連不到他 tailnet 的其他裝置,是最小暴露的做法。分享的操作、對方能與不能做的事、以及 ACL 怎麼配合,見〈分享裝置給 tailnet 以外的人〉。
最小權限的 grants
Tailscale 預設的存取規則是全開的。把遠端桌面主機打上 tag,再只放行需要的人連那三個埠,攻擊面就縮到最小:
{
"tagOwners": {
"tag:desktop": ["autogroup:admin"]
},
"grants": [
{
"src": ["autogroup:admin"],
"dst": ["tag:desktop"],
"ip": ["tcp:21118", "tcp:3389", "tcp:5900"]
}
]
}tag:desktop打在遠端桌面主機上(用 auth key 或 Admin console 套用,見 Tags 與 auth key)。- 這條
grants只讓管理員自己的裝置(autogroup:admin)連到主機的 21118(RustDesk)、3389(RDP)、5900(VNC)。一台主機通常只用到其中一個埠,可以依實際使用的協定把另外兩個拿掉。 - 有其他人也要連(例如家人),把他們加進一個群組、把群組放進
src,不要用*。 - 記得把預設的
*到*:*全開規則拿掉,這條限制才有作用。語法與拿掉全開規則的注意事項見 ACL / Grants 入門。
grants 只管「走 Tailscale 的流量」。上面 Windows 那節的防火牆規則是作業系統層的防線(連到實體區網也擋),兩者各管一層,建議都做:grants 控制 tailnet 內誰能連,防火牆控制這台機器除了 tailnet 之外誰都不能連。
參考資料
- Access remote desktops using RustDesk(Tailscale 官方)
- Access remote desktops using Windows RDP(Tailscale 官方)
- RustDesk Client(RustDesk 官方文件)
- RustDesk Advanced Settings(Direct IP access port 21118)
- RustDesk releases(GitHub,1.5.0)
- How to use Remote Desktop(Microsoft 官方)
- Turn Mac screen sharing on or off(Apple 官方)
- GNOME Remote Desktop configuration(GNOME 官方)
- Share your desktop(GNOME Help)
- Tailscale、Cloudflare Tunnel、QuickConnect、傳統 VPN 怎麼選
- 直連與 DERP 中繼:為什麼連線變慢、怎麼改善
- 出門在外喚醒家裡的電腦:Wake-on-LAN 與 Tailscale
- 分享裝置給 tailnet 以外的人
- Windows 無人值守模式與當 exit node
- ACL / Grants 入門:限制誰能連到哪裡
- Tags 與 auth key