SUNSHINE+MOONLIGHT+LUCKY公网串流笔记
大耳朵t_t
2025年08月22日 15:30

需求由来:

之前一直使用Sunshine + Moonlight 局域网串流在电视上玩游戏,最近几个月沉迷DOTA2游廊中的宝石TD,为此研究了一下公网串流,虽然网上有很多公网串流教程,但Sunshine+Moonlight+Lucky的教程不多,而且并不详尽,我也是通过各种教程+AI修正才实现公网串流。注意:本文着重描述路由器防火墙设置,这部分我没有搜到完整详细教程,故写此文以帮助有相同需求的朋友。


软/硬件配置:

软件:

1.Sunshine基地版

https://www.flowus.cn/lecheng/share/d6682978-cdee-47c8-b9b1-3f2a773a1c1d

2.Moonlight威力加强版

https://www.flowus.cn/lecheng/share/cf8b9092-8ac2-4dd9-bb81-701be6e2f196

3.Lucky

https://lucky666.cn/docs/intro

硬件:

1.向运营商申请开通公网ip(一般要去营业厅办理),光猫路由转桥接(运营商工作人员上门修改)

2.能ssh连接路由器,并刷了openWrt的路由器(有些难度)

我使用的路由器是移动rax3000m,512M内存,联发科MT7981,4个千兆口,带存储USB3.0接口,Wifi6,一键mesh组网,价格不到一百元,最惊喜的是它是套壳openWrt,不需要从头刷,若有同款,具体可参考以下两篇文章

移动神器RAX3000M路由器不刷固件变身家庭云之一:开通SSH,安装新软件包

https://iyenn.com/rec/2136387.html

移动神器RAX3000M路由器不刷固件变身家庭云之四:开放LuCI管理界面,网站服务

https://iyenn.com/rec/2136390.html

实现公网串流具体做法

1.电脑安装Sunshine基地版、手机安装Moonlight威力加强版

无难度。参考官方文档,这一步做完,你就已经实现了局域网串流。

若要公网串流,Sunshine设置中打开upnp,ipv4+ipv6

2.通过ssh连接路由器,在路由器安装Lucky、openWrt

有一些难度,需要自己根据自己的路由器搜索做法。通过ssh连接路由器后,安装Lucky以参考

https://mao.fan/article/276

Lucky里使用到的功能主要是动态域名DDNS,SSL证书,网络唤醒,端口转发,web服务。(Lucky真的强大!RESPECT!)

刷openWrt我没有深入研究所以无法给出教程参考。openWrt里在Luci界面涉及到一些路由器防火墙的设置,后文中详细描述。

3.申请公网域名

无难度。申请一个自己的域名,免费的付费的都有很多选项。我使用的dynv6

https://dynv6.com/

4.在Lucky中设置动态域名DDNS和SSL证书

无难度。教程很多,而且Lucky中的设置也是简洁明了,具体可参考Lucky官方文档。Lucky页面要开启外网访问

5.路由器防火墙的设置

这一步就是困扰我很久,且搜索了很多网上资料仍没有找到完整可用方法的部分。首先,用Lucky反向代理来转发串流端口,是绝对不会成功的。反向代理 (Reverse Proxy): 这个功能主要用于HTTP/HTTPS的Web服务。它会处理SSL证书,然后将解密后的HTTP请求转发给后端服务。这个模式完全不适用于Moonlight的游戏串流数据(主要使用UDP协议)。

① 区域设置+开启IP动态伪装

登录OpenWRT的LuCI管理界面。

导航到 网络 (Network) > 防火墙 (Firewall)。

在常规设置 (General Settings) 标签页下,找到 区域 (Zones) 设置部分。

找到名为 wan 的区域(或者任何你的公网出口区域)。它的“输入”应该是“拒绝”,“输出”是“接受”,“转发”是“拒绝”。

最关键的一步:勾选 wan 区域的 “IP动态伪装 (Masquerading)” 复选框。

点击页面底部的 保存并应用 (Save & Apply)。

② 设置端口转发

你应该在Lucky或者OpenWRT原生的防火墙中,使用 端口转发 功能。需要转发的端口列表如下(除非你在Sunshine中修改过):

TCP 47984: 用于连接建立和控制。

TCP 47989: Sunshine的Web管理界面(如果你需要远程访问的话)。

UDP 47998: 音频流。

UDP 47999: 视频流。

UDP 48000: 控制流。

UDP 48002: 发现和连接(可选,但建议加上)。

UDP 48010: 视频流(H.265/HEVC)。

③ 设置通信规则

这个设置通常由创建端口转发规则时自动完成,但值得了解。(若在Lucky中设置端口转发并勾选防火墙自动放行,这一步理论上也不用做)

位置: 网络 (Network) > 防火墙 (Firewall) > 通信规则 (Traffic Rules)

设置: 当你创建一条端口转发规则时,OpenWRT会自动在Traffic Rules里生成一条对应的规则,允许来自wan的流量访问那个端口。你可以在这里检查这些规则是否存在且已启用。

原因: OpenWRT的wan区域默认“输入(Input)”策略是reject(拒绝),这是为了安全。端口转发规则就是为我们需要的服务打开一个个特定的“小窗口”。

如果你在设置端口转发后并不能成功公网串流,可能是openWrt并没有自动进行通信规则和Nat规则的设置,以下为手动设置方法:

在OpenWRT中,“端口转发 (Port Forwarding)”页面实际上是一个简化的“快捷方式”。当你在这里创建一条规则时,系统会自动帮你完成两件事情:

创建一条NAT规则:告诉防火墙将从公网访问路由器某个端口的数据包,其“目标地址”修改为你内网电脑的IP地址 (这在iptables里被称为DNAT)。

创建一条防火墙转发规则:允许这个被修改了目标地址的数据包从 wan 区域通过防火墙,转发到 lan 区域。

如果你只在“通信规则 (Traffic Rules)”里进行设置,你只完成了上述的第2步。数据包会被允许转发,但路由器不知道要把发往它自己公网IP的数据包交给谁,所以这个请求还是会失败。

因此,正确的手动设置需要两步:在LuCI中创建“通信规则”,并手动添加NAT规则。

如何手动设置“通信规则”(高级方法)

如果你仍然希望手动设置,你需要按照以下组合拳来操作。我们以Sunshine的TCP端口 47984 为例。

第一步:在“通信规则 (Traffic Rules)”中创建允许转发的规则

这是你在LuCI界面中操作的部分。

导航到 网络 (Network) > 防火墙 (Firewall) > 通信规则 (Traffic Rules)。

在页面下方点击 添加 (Add) 来创建一条新规则。

填写以下字段:

名称 (Name): Allow-Sunshine-TCP-47984 (起一个有意义的名字)

源区域 (Source zone): wan

目标区域 (Destination zone): lan

协议 (Protocol): TCP

目标地址 (Destination address): 填入你Sunshine主机的内网IP地址 (例如 192.168.1.100)。

目标端口 (Destination port): 47984

动作 (Action): accept

点击 保存 (Save)。

对所有Sunshine需要的端口(TCP和UDP)重复此操作,创建多条规则。

完成后,点击页面右下角的 保存并应用 (Save & Apply)。

第二步:手动添加NAT转发规则 (DNAT)

这一步无法在“通信规则”页面完成,你需要到“自定义规则”页面添加iptables命令。

导航到 网络 (Network) > 防火墙 (Firewall) > 自定义规则 (Custom Rules)。

在这个文本框中,你需要为每个需要转发的端口添加一条DNAT规则。

获取你的WAN接口名称: 你可以通过SSH登录路由器后运行ifconfig查看(通常是eth0.2, pppoe-wan等),或者用一个更通用的方法 $(uci get network.wan.ifname)。

添加以下规则(请根据你的实际情况修改 <内部IP> 和端口):

# 获取WAN接口名,更具通用性

WAN_IF=$(uci get network.wan.ifname)

# Sunshine TCP 端口

iptables -t nat -A PREROUTING -i $WAN_IF -p tcp --dport 47984 -j DNAT --to-destination 192.168.1.100:47984

iptables -t nat -A PREROUTING -i $WAN_IF -p tcp --dport 47989 -j DNAT --to-destination 192.168.1.100:47989

# Sunshine UDP 端口

iptables -t nat -A PREROUTING -i $WAN_IF -p udp --dport 47998 -j DNAT --to-destination 192.168.1.100:47998

iptables -t nat -A PREROUTING -i $WAN_IF -p udp --dport 47999 -j DNAT --to-destination 192.168.1.100:47999

iptables -t nat -A PREROUTING -i $WAN_IF -p udp --dport 48000 -j DNAT --to-destination 192.168.1.100:48000

iptables -t nat -A PREROUTING -i $WAN_IF -p udp --dport 48002 -j DNAT --to-destination 192.168.1.100:48002

iptables -t nat -A PREROUTING -i $WAN_IF -p udp --dport 48010 -j DNAT --to-destination 192.168.1.100:48010

添加完毕后,点击 重启防火墙 (Restart Firewall)。

④ DHCP/DNS设置静态地址

设置静态地址分为ipv4静态地址和ipv6静态地址,分别对应ipv4串流和ipv6串流。

若要设置ipv6静态地址,需要将DHCPv6模式改为有状态 (Stateful) 或者有状态 + 无状态。有状态会分配具体的IPv6地址,有状态 + 无状态: 兼容性最好,既分配地址,也通告其他信息。

请进入 网络 (Network) > DHCP与DNS (DHCP and DNS)。

找到静态地址分配区域:

在这个页面的主设置下方,你应该能找到一个名为 “静态地址分配 (Static Leases)” 的部分。这里会列出所有已经分配的或手动绑定的设备。

添加新的静态租约:

在“静态地址分配”区域的底部,点击 添加 (Add) 按钮。

填写分配信息:

系统会弹出一个窗口让你填写设备的详细信息。这正是我们需要配置的核心所在。

MAC地址 (MAC-Address): 点击下拉菜单,选择你的Sunshine主机。如果下拉菜单中没有,你需要手动填入你电脑网卡的MAC地址。

IPv4地址 (IPv4-Address): (推荐)同时给它分配一个固定的IPv4地址,比如 192.168.1.100。

主机名 (Hostname): 填入一个好记的名字,比如 Sunshine-PC。

DUID: 这个是IPv6用来识别设备的唯一ID。如果你的设备已经连接过,可以尝试在下拉菜单中找到它。如果留空,系统通常会基于MAC地址来处理。

IPv6-Suffix (hostid): 这就是我们需要设置的关键字段! 它可能不叫“IPv6后缀”,而直接就叫 IPv6-Suffix (hostid)。在这个输入框里,填入你想要的后缀。请在这里输入 100。(在地址范围里任意设置,只要和放行ipv6中设置保持一致即可

保存设置:

填写完毕后,点击 保存 (Save)。

应用最终配置:

返回到“DHCP与DNS”主页面,点击右下角的 保存并应用 (Save & Apply)

⑤ 通信规则放行ipv6

回到 网络 (Network) > 防火墙 (Firewall) > 通信规则 (Traffic Rules),创建或修改你的IPv6放行规则,将 目标地址 (Destination address) 设置为 ::100 (与静态ipv6地址后缀保持一致即可)

以上就是关于路由器防火墙的全部设置,做完这些,就可以在Moonlight中输入域名进行串流。

远程开机(WOL)

毫无疑问远程开机是刚需,首先需要电脑主板支持网络唤醒WOL,并且在BIOS设置中打开该功能(另外有冷唤醒/冷启动等类似字眼的功能话也要开启,它会确保主机经历断电又来电后依然可以远程唤醒)

我是通过Lucky的实现远程开机,在路由器上安装的Lucky可以通过设置中输入网卡mac地址即可实现网络唤醒,如果在电脑主机上也安装Lucky并进行主控端被控端设置,可以知道电脑是否已经开机的反馈,以及通过Lucky远程关机。

(若被控主机没有安装Lucky进行设置,图中可以通过唤醒按钮唤醒电脑,但设备会一直显示离线)

备用远程

以防串流遇到问题,我用的是网易的UU远程,目前是免费的,远程效果也不错。

希望对你有帮助