Sunshine + Moonlight 外网访问方案

实践时间:2026-06-14 本文讨论如何从外网(非同一局域网)通过 Moonlight 连接到 Linux 上的 Sunshine


目录

  1. 方案总览与对比
  2. frpc 端口转发方案分析
  3. Tailscale 方案(推荐)
  4. 其他方案简介
  5. 方案选型建议

一、方案总览与对比

方案延迟配置复杂度成本推荐度
Tailscale(Mesh VPN)直连 < 5ms,中继 30–100ms极低免费(≤3 台设备)★★★★★
ZeroTier(Mesh VPN)类似 Tailscale免费(≤25 台设备)★★★★
WireGuard 自建取决于 VPS 到两端距离VPS 费用★★★
frpc 端口转发高(双倍 VPS 延迟 + 协议开销)VPS 费用 + 大带宽★★

核心区别

frpc(中心化中转):
  Moonlight → [公网] → frps 服务器 → [公网] → Sunshine
  所有流量必经服务器,延迟 = 两段之和,服务器带宽是瓶颈

Tailscale / ZeroTier(去中心化直连):
  Moonlight → [WireGuard 打洞] → Sunshine    (直连,延迟最低)
  Moonlight → [DERP 中继] → Sunshine          (打洞失败时回退)

二、frpc 端口转发方案分析

2.1 结论先行

有条件可行,但不推荐用于日常串流。

frpc 技术上可以跑通 Sunshine + Moonlight 的外网连接,但在延迟、带宽、成本三个维度上都不如 VPN 方案。如果你已有低延迟高带宽的 frps 服务器,可以作为临时应急手段。


2.2 Sunshine 完整端口/协议分析

Moonlight 连接 Sunshine 涉及以下端口(基于 port = 47989 默认配置):

端口协议用途流量特征
47984TCPHTTPS 客户端认证/配对低流量,仅连接/配对时使用
47989TCPHTTP 服务发现/协商低流量,控制信令
47990TCPWeb UI(可选,非串流必需)低流量,管理界面
48010TCPRTSP 会话控制低流量,串流建立/控制
47998UDP视频流高流量,40–80 Mbps
47999UDP控制输入(键鼠/手柄)低流量,但延迟极敏感
48000UDP音频流中流量,~512 Kbps
48002UDP麦克风回传低流量

关键点

  • 控制流(TCP):流量小、延迟不太敏感,frpc 可以胜任
  • 数据流(UDP):视频流是大头,带宽高、延迟敏感,这是 frpc 的瓶颈所在

2.3 frpc UDP 隧道的技术原理

frpc 的 UDP 隧道并不是简单的 UDP 转发,其工作原理:

frpc 端(本地)                    frps 端(服务器)
    |                                    |
    | Sunshine UDP 包                    |
    ↓                                    |
[封装进 TCP/KCP 隧道] ────────→ [解封装还原 UDP] → Moonlight
    |                                    |
    | frpc-frps 之间是 TCP 或 KCP 长连接  |

问题一:TCP 封装 UDP(Head-of-Line Blocking)

当 frpc 使用默认 TCP 传输模式时,UDP 视频包被封装进 TCP 流。TCP 的可靠传输机制会导致:

  • 一个包丢失 → 后续所有包排队等待重传(队头阻塞)
  • 视频流出现突发性卡顿(不是持续高延迟,而是间歇性冻结)

这是 frpc 用于实时视频最根本的问题。

问题二:KCP 模式可以缓解但不解决

frpc 支持 transport.protocol = kcp 模式,使用 KCP(基于 UDP 的可靠传输协议)替代 TCP 作为隧道承载:

  • 避免了 TCP 的队头阻塞
  • 但 KCP 仍有自己的可靠传输开销(ARQ 重传、拥塞窗口)
  • frps 服务器需要额外开放 UDP 端口
  • 稳定性不如 TCP 模式

问题三:带宽成本

1440p 60fps 串流需要 40–80 Mbps 持续带宽。所有流量过 frps:

  • 云服务器带宽费用:以阿里云为例,1 Mbps 弹性公网 ≈ ¥23/月,50 Mbps ≈ ¥1150/月
  • 即使使用按量付费(约 ¥0.8/GB),每小时 40 Mbps ≈ 18 GB ≈ ¥14.4/小时
  • 降低码率到 10–15 Mbps 可以降低成本,但画质会严重下降

2.4 完整 frpc 配置示例

如果仍然要使用 frpc,以下是完整配置:

frpc.toml(Sunshine 所在的 Ubuntu 主机)

serverAddr = "你的frps服务器IP"
serverPort = 7000
 
# 建议使用 KCP 减少队头阻塞(frps 也需要配置 kcpBindPort)
# transport.protocol = "kcp"
 
# ===== TCP 控制端口 =====
 
[[proxies]]
name = "sunshine-https-auth"
type = "tcp"
localIP = "127.0.0.1"
localPort = 47984
remotePort = 47984
 
[[proxies]]
name = "sunshine-http"
type = "tcp"
localIP = "127.0.0.1"
localPort = 47989
remotePort = 47989
 
[[proxies]]
name = "sunshine-webui"
type = "tcp"
localIP = "127.0.0.1"
localPort = 47990
remotePort = 47990
 
[[proxies]]
name = "sunshine-rtsp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 48010
remotePort = 48010
 
# ===== UDP 数据端口 =====
 
[[proxies]]
name = "sunshine-video"
type = "udp"
localIP = "127.0.0.1"
localPort = 47998
remotePort = 47998
 
[[proxies]]
name = "sunshine-input"
type = "udp"
localIP = "127.0.0.1"
localPort = 47999
remotePort = 47999
 
[[proxies]]
name = "sunshine-audio"
type = "udp"
localIP = "127.0.0.1"
localPort = 48000
remotePort = 48000
 
[[proxies]]
name = "sunshine-mic"
type = "udp"
localIP = "127.0.0.1"
localPort = 48002
remotePort = 48002

frps.toml(公网服务器端)

bindAddr = "0.0.0.0"
bindPort = 7000
# kcpBindPort = 7000    # 如果启用 KCP 模式取消注释

Moonlight 连接:在 Moonlight 中输入 frps 服务器的公网 IP


2.5 frpc 方案的已知问题汇总

问题严重度说明
TCP 队头阻塞UDP 视频包封装进 TCP,丢包时全部排队等待,画面间歇性冻结
带宽成本高50 Mbps 持续流量过服务器,月费可达数百甚至上千元
服务器成为单点故障frps 服务器宕机或带宽跑满,直接断流
端口映射繁琐需要映射 8 个端口(4 TCP + 4 UDP),任一端口错误即连接失败
延迟叠加总延迟 ≈ Moonlight→frps + frps→Sunshine,通常 > 50ms
Moonlight 连接不稳定部分用户反馈 frpc UDP 隧道在高负载下频繁断开重连
无端到端加密frps 服务器可以看到解封装后的明文流量(WireGuard 方案有端到端加密)

社区反馈:在 Sunshine GitHub Discussions 和 Reddit r/cloudygamer 中,有用户报告通过 frpc 跑通了低码率(10–15 Mbps)的 1080p 串流,但普遍评价是”能用但体验远不如 VPN 方案”,尤其是画面冻结和输入延迟问题。


2.6 什么情况下 frpc 是合理选择

  • 已有 frps 服务器,不想再装新软件
  • 临时/应急使用,不追求画质(降到 1080p 10–15 Mbps)
  • 国内网络环境下 Tailscale DERP 节点不可达,但有国内低延迟 VPS
  • 只需要远程控制(非长时间观看/办公),对卡顿容忍度高

三、Tailscale 方案(推荐)

3.1 方案原理

Tailscale 基于 WireGuard 协议,为每台设备分配 100.x.x.x 虚拟 IP,设备间通过加密隧道直接通信。Moonlight 用 Tailscale IP 替代局域网 IP 连接 Sunshine,其他配置无需改动。

直连模式(NAT 穿透成功):
  Moonlight ←──── WireGuard P2P 隧道 ────→ Sunshine
  延迟增加:仅 1–3ms(加密开销)

中继模式(NAT 穿透失败):
  Moonlight ←→ DERP 中继节点 ←→ Sunshine
  延迟增加:30–100ms(取决于 DERP 节点距离)

3.2 Ubuntu 安装 Tailscale

# 一键安装
curl -fsSL https://tailscale.com/install.sh | sh
 
# 启动并认证(会输出一个 URL,在浏览器中打开登录)
sudo tailscale up
 
# 验证
tailscale ip -4          # 查看本机 Tailscale IP(如 100.64.x.x)
tailscale status         # 查看已连接设备列表
 
# 确认开机自启
sudo systemctl enable --now tailscaled

3.3 Windows 安装 Tailscale

  1. 访问 https://tailscale.com/download/windows 下载安装包
  2. 安装后系统托盘出现 Tailscale 图标
  3. 点击图标 → Log in → 浏览器弹出授权页 → 用同一账号登录
  4. 登录后图标变绿,鼠标悬停可看到 Tailscale IP

验证连通性

# Windows PowerShell 中 ping Ubuntu 的 Tailscale IP
ping 100.64.x.x

3.4 Moonlight 通过 Tailscale 连接

Sunshine 不需要修改任何配置。Tailscale 工作在网络层,对 Sunshine 完全透明。

  1. 打开 Moonlight → 点击 + 添加主机
  2. 输入 Ubuntu 的 Tailscale IP(如 100.64.1.5
  3. 后续 PIN 配对流程与局域网完全相同
  4. 配对成功后点击 Desktop 即可投屏

提示:如果启用了 Tailscale 的 MagicDNS,也可以用主机名代替 IP: zbc-system-product-name.tail1234ab.ts.net


3.5 防火墙配置(如果启用了 UFW)

本机 UFW 当前未启用(inactive),无需配置。如果将来启用了 UFW:

# 方式一:允许 Tailscale 接口的所有流量(简单)
sudo ufw allow in on tailscale0
 
# 方式二:精确放行 Sunshine 端口(更安全)
sudo ufw allow from 100.64.0.0/10 to any port 47984,47989,48010 proto tcp
sudo ufw allow from 100.64.0.0/10 to any port 47998,47999,48000 proto udp

3.6 直连 vs DERP 中继

连接模式触发条件延迟影响
直连 P2P至少一方 NAT 可穿透(家用路由器通常可以)仅增加 ~1–3ms
DERP 中继双方都在严格对称型 NAT 后(企业/校园网)增加 30–100ms

查看当前连接模式

tailscale status
# "direct" = 直连,"relay" = 经过 DERP 中继

提升直连成功率

  • 在路由器上启用 UPnP
  • 或手动转发 UDP 端口 41641(WireGuard 使用的端口)

3.7 免费版限制

项目限制
设备数量最多 3 台(2024 年 5 月起从 100 台缩减)
带宽无限制
DERP 中继使用官方节点,免费
MagicDNS支持
子网路由支持

对 Sunshine 场景的评估

  • 2 台设备(1 Ubuntu + 1 Windows)→ 完全够用
  • 3 台(加手机 Moonlight)→ 刚好用满
  • 超过 3 台 → 需付费(Personal Pro ~$5/月)或使用 Headscale(开源自建控制面,无设备限制)

3.8 已知的坑

1. 中国大陆 DERP 节点不稳定

Tailscale 官方 DERP 节点在中国大陆访问不稳定。如果无法 P2P 直连,中继连接可能很差甚至断开。

解决方案:

  • 确保两端能 P2P 直连(家用宽带通常可以)
  • 使用 Headscale + 自建 DERP 节点(需要有一台 VPS)
  • 或改用 ZeroTier(见下文)

2. Sunshine Web UI 远程访问

通过 Tailscale IP 访问 Sunshine Web UI 时,如果 origin_web_ui_allowed = lan,可能被拒绝(Tailscale IP 不被视为 LAN)。需要改为:

# ~/.config/sunshine/sunshine.conf
origin_web_ui_allowed = wan

安全提醒:改为 wan 后,任何能访问到该 IP 的人都能尝试登录 Web UI。因为 Tailscale 本身已经提供了网络隔离,只有加入你 Tailscale 网络的设备才能访问,所以风险可控。

3. Windows Tailscale 的 DNS 劫持

Tailscale 在 Windows 上启用 MagicDNS 后会修改系统 DNS,可能影响其他应用。如果不需要用主机名连接,可以在 Tailscale 管理面板中关闭 MagicDNS。

4. CPU 开销

WireGuard 加密/解密会占用 CPU。在 Intel UHD 630 这种集显平台上,如果同时跑 VAAPI 编码和 WireGuard 加密,高码率(>60 Mbps)时可能出现 CPU 瓶颈。可以通过 Ctrl+Alt+Shift+S(Moonlight 性能面板)观察 Encoder Latency 是否异常升高。


四、其他方案简介

4.1 ZeroTier

与 Tailscale 同类的 Mesh VPN,核心区别:

对比TailscaleZeroTier
底层协议WireGuard自研(Layer 2 仿真)
免费设备数3 台25 台
配置复杂度极简略复杂(需要管理网络 ID 和规则)
中国可用性DERP 节点不稳定可自建 Moon 节点,更灵活
延迟直连时极低略高于 Tailscale(协议开销更大)

适合场景:设备超过 3 台、国内网络环境复杂需要自建中继节点。

安装

# Ubuntu
curl -s https://install.zerotier.com | sudo bash
sudo zerotier-cli join <network-id>
 
# Windows:下载安装包后加入同一网络 ID

4.2 WireGuard 自建

适合有公网 IP VPS 且需要完全自主控制的用户。

架构

Moonlight(Windows) → WireGuard → VPS(公网) → WireGuard → Sunshine(Ubuntu)

优点:无设备数限制,无第三方依赖 缺点:需要自行管理密钥、配置路由;所有流量过 VPS(无 P2P 直连)


五、方案选型建议

你的情况推荐方案
快速上手,设备 ≤ 3 台Tailscale
设备较多(>3 台)ZeroTier(25 台免费)
中国大陆,DERP/Moon 不稳定Headscale 自建ZeroTier + 自建 Moon
已有高带宽低延迟 VPSWireGuard 自建
已有 frps,临时应急frpc(降码率到 10–15 Mbps)
追求画质,不差钱Tailscale(直连)或 高带宽 VPS + WireGuard

附:frpc vs Tailscale 一句话总结

  • frpc:所有流量必须经过中转服务器,延迟 = 两段之和,服务器带宽是天花板,高码率串流成本高昂
  • Tailscale:尽量 P2P 直连(延迟接近局域网),打洞失败才走中继,安装 5 分钟,免费

对于 Sunshine + Moonlight 这种对延迟和带宽都敏感的实时串流场景,能直连就不要中转,这是选择 Tailscale 而非 frpc 的根本原因。