问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于Zerotier+Sunshine+Moonlight实现赛博约会

创作时间:
作者:
@小白创作中心

基于Zerotier+Sunshine+Moonlight实现赛博约会

引用
1
来源
1.
https://www.jinliuyang.online/archives/cyber-date

你是否曾想过,即使相隔千里,也能与朋友们共享同一台主机的乐趣?无论是共同观赏一部电影,还是畅玩只支持本地联机的游戏,这个愿望现在可以通过Zerotier、Sunshine和Moonlight的组合实现。本文将详细介绍这一赛博约会方案的技术原理和搭建步骤。

技术梗概

Zerotier

ZeroTier使用SDN(软件定义网络)原理,在IP层面上建立虚拟网络。每个参与的设备都有一个全局唯一的标识——ZeroTier ID,这使得无论物理位置如何,都能像在同一局域网内一样通信。

原理

Zerotier在多设备之间通过NAT打洞的方式来建立P2P连接,如:在笔记本电脑、台式机、嵌入式设备、云资源和应用。这些设备只需要通过ZeroTier One(ZeroTier的客户端)在不同设备之间建立直接连接,即使它们位于NAT之后。关于NAT打洞可以查看本博客的另一篇文章:NAT打洞技术

关键词

以下是我们用户在使用Zerotier过程中需要关注的几个关键词:

  • Planet:行星服务器,Zerotier根服务器。官方文档如此描述:There is only one planet. Earth's root servers are operated by ZeroTier, Inc. as a free service. 意思是这是由Zerotier官方运营的一项免费服务,也就是说这个世界上只有一个Planet。
  • Moon:卫星服务器,用户自建的私有根服务器,起到代理加速的作用。因为大家都懂的原因,Planet提供的服务不尽稳定,所以我们可以建立自己的Moon节点来提供代理服务。
  • Leaf:网络客户端,每台连接到网络节点,也就是我们使用的电脑、平板、手机等。

Moonlight

Moonlight(前身为Limelight)是NVIDIA GameStream协议的开源实现,它实现了NVIDIA Shield使用 的协议,并编写了一组第三方客户端。

在Moonlight - Sunshine体系下,它是客户端,接收经过编码的信息并解码。

Sunshine

Sunshine是为Moonlight提供游戏串流服务的,可以自己部署的主机服务端。它提供低延迟的云游戏服务器功能,支持AMD、Intel和Nvidia GPU的硬件编码(软件编码也可用)。Moonlight客户端可以连接到部署了Sunshine的设备。

也就是说,在Moonlight - Sunshine这对兄弟中,Sunshine是一种作为服务端的存在,它将经过编码的信息推送出去。

搭建

Zerotier

服务端

刚才说过,我们的在服务端的工作就是自建一个Moon节点,来代理官方的Planet节点。同时,我们还需要一个带有UI的控制界面ztncui。因为最终的连接是P2P的,很少需要由Moon主动转发数据,所以服务器的要求很低。

前期准备

  • 配置服务器的防火墙策略,开放
    3443/tcp
    端口,
    4000/tcp
    端口用于ztncui的访问,
    9993/tcp
    端口,
    9993/udp
    端口。
  • 服务器安装了docker,git。

docker安装ztucui


docker run --restart=on-failure:3 -d --name ztncui -e \
HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes \
-e ZTNCUI_PASSWD=admin@123 \
-p 4000:4000 keynetworks/ztncui

web的管理页面是4000端口(也就是我们放通的端口),我们可以去看看有没有成功安装:通过浏览器访问ip:4000进入管理页面。

启动起来后,使用默认的账号
admin
登录进去,密码是
admin@123
,登陆后会被要求重置密码。

搭建Moon服务器

截至上一步,已经可以创建网络了,但是那使用的还是Zerotier的官方服务,我们需要搭建自己的Moon服务。


# 创建一个持久化存放文件的目录
mkdir -p /opt/docker/moon
# 获得云服务器的公网ip
public_ip=`curl ip.sb`
# 建立moon服务器
docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /opt/docker/moon:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 $public_ip

到此我们的服务端就搭建好了。查看一下日志,记录一下moon id,后面加入会用到。


docker logs -f zerotier-moon

创建一个网络

创建完成后会得到一串神秘代码,记录下它。

回到上一级,通过easy setup进行设置。

设置好以后,服务端的配置就告一段落了。

客户端

下载

进入Zerotier官网选择对应系统的版本下载,这里我下载的是Windows。

完成安装后,加入网络,输入我们在ztncui网页上创建的网络的那个神秘代码:

授权

回到ztncui,对它进行授权(可能需要等一会儿才会显示出来)

加入Moon

最后在配置一下加入moon服务器,打开cmd。


cd C:\ProgramData\ZeroTier\One
zerotier-cli orbit [moon_id] [moon_id]

将之前记录的moon id填进去后执行。

看看有没有成功加入Moon。


zerotier-cli listpeers

至此已成功加入本机至虚拟网络中,我们可以用同样的步骤让我们的朋友或是自己其他的设备添加进来,记得进行授权喔。

客户端 - 安卓

准备

想要把安卓设备添加到自建的Moon节点中需要用到一个第三方的应用,是由一位大神编写的,我们下载并安装到设备。

项目地址:https://github.com/kaaass/ZerotierFix

还需要从我们自己的服务器下载
两个文件
,如果你是腾讯云,可以使用OrcaTerm中文件传输的功能,当然也可以使用Xftp等:
.moon
路径参考图片:
.planet
路径参考图片:

下载后把这两个文件也传输给安卓设备,传输完成后具体操作如下:

  • 打开安卓设备上安装好的ZerotierFix
  • 右上角设置
  • 启动自定义planet
  • 选择从文件导入
  • 选择刚才的palnet文件,提示导入成功,切换planet成功
  • 再右上角
  • 入轨
  • 右下角加号
  • 从文件导入
  • 选择刚才的moon文件
  • 提示成功,会在入轨界面看到moon服务的id。
  • 回到上一级,右下角加号
  • 输入网络ID加入网络
  • 在ztncui上授权
  • 完成加入

至此,Zerotier组网已经完全完成。

Sunshine

项目地址:https://github.com/LizardByte/Sunshine/releases

直接下载安装就行,打开后显示Web UI,就可以啦!很简单吧。

Moonlight

安卓版本下载地址https://github.com/moonlight-stream/moonlight-android,有需要也可以下载其他平台版本。

  • 安装后,由于此时我们已经在同一个虚拟局域网内,Moonlight会自动搜索到主机。
  • 点击主机,不出意外,在要链接的电脑上会弹出和Sunshine配对的PIN码,输入Moonlight提供的PIN码,配对成功。
  • 点击DESKTOP,成功开始串流

Moonlight还有很多有意思的功能,也有很高的自定义自由度,比如我可以在平板上使用手写笔,或者新建一个虚拟屏幕。让串流画面输出虚拟屏幕内容,以此来把平板当作一块副屏。这些内容都可以进一步探索。

总结

至此,我们完成了串流环境的部署,在平板使用手机热点、笔记本使用校园网的情况下,采用1080P@60 fps的画面,延迟可以稳定在50 ms以内,这个数字足以支撑我和朋友们联机游玩一些本地联机的游戏,或者一起看看番剧电影了。话不多说,赶快和你的朋友们一起愉快的玩耍吧!

参考:

https://blog.csdn.net/gitblog_00029/article/details/137257235

https://www.bilibili.com/video/BV1Vh411F7Mr/

https://zhuanlan.zhihu.com/p/522761845

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号