之前一直使用Sunshine + Moonlight 局域网串流在电视上玩游戏,最近几个月沉迷DOTA2游廊中的宝石TD,为此研究了一下公网串流,虽然网上有很多公网串流教程,但Sunshine+Moonlight+Lucky的教程不多,而且并不详尽,我也是通过各种教程+AI修正才实现公网串流。注意:本文着重描述路由器防火墙设置,这部分我没有搜到完整详细教程,故写此文以帮助有相同需求的朋友。
软件:
https://www.flowus.cn/lecheng/share/d6682978-cdee-47c8-b9b1-3f2a773a1c1d
https://www.flowus.cn/lecheng/share/cf8b9092-8ac2-4dd9-bb81-701be6e2f196
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
无难度。参考官方文档,这一步做完,你就已经实现了局域网串流。
若要公网串流,Sunshine设置中打开upnp,ipv4+ipv6
有一些难度,需要自己根据自己的路由器搜索做法。通过ssh连接路由器后,安装Lucky以参考
https://mao.fan/article/276
Lucky里使用到的功能主要是动态域名DDNS,SSL证书,网络唤醒,端口转发,web服务。(Lucky真的强大!RESPECT!)
刷openWrt我没有深入研究所以无法给出教程参考。openWrt里在Luci界面涉及到一些路由器防火墙的设置,后文中详细描述。
无难度。申请一个自己的域名,免费的付费的都有很多选项。我使用的dynv6
https://dynv6.com/
无难度。教程很多,而且Lucky中的设置也是简洁明了,具体可参考Lucky官方文档。Lucky页面要开启外网访问
这一步就是困扰我很久,且搜索了很多网上资料仍没有找到完整可用方法的部分。首先,用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远程,目前是免费的,远程效果也不错。
希望对你有帮助