【技术】我的云电脑折腾方案

Dymay
Dymay
发布于 2022-11-16 / 538 阅读
0
1

【技术】我的云电脑折腾方案

今年十一回家之后因为疫情家里蹲了一个多月,于是趁此机会DIY了年轻人的第一台PC,配了块千元2K165Hz屏,体验甚好。(至于为什么前脸的三风扇有个颜色不一样,答案是送了三把,单独一个买错了orz)

MVIMG_20221025_221825-1668600726234

然而爽完要回学校了,不想将整机搬回宿舍,又舍不得这新PC的性能,于是有了折腾云电脑的想法,经过一番摸索和尝试,最终效果还是很不错的。

1 效果测试

在我宿舍100M宽带有线连接下基本可以无压力畅玩1080P144Hz,延迟表现见下图。

-30f99f1d227fb24e

还有一条在某知名连锁酒店(锦江之星)的垃圾无线网络环境下的测试视频:

提示

  • 本文的一些操作仅为个人方案,算不上普适方法,参考意义较小。毕竟我用到了我个人的NAS做中转和内网穿透服务器,这部分功能可能需要其他技术进行替代,比如用其他免费的内网穿透方案/租用国内云服务器。
  • 最好还是去整一个公网IP,就不需要像我一样折腾了。
  • zerotier的配置,parsec的下载、账号注册及登录需要科学上网。

2 远程操控部分

2.1 网络拓扑

开局一张图,大概就这么个意思。(我家那块我也没去细究到底怎么走的,也不是很懂通信网络,交换机应该还有上层,反正我的PC被NAT套死了)

QQ截图20221116205839

蓝色虚线为后续WoWLAN(远程无线唤醒)发送唤醒魔包的路径,红色虚线为远控的网络通路。

顺便吐槽一下我家路由是红米AC2100,它官方固件是开了IPv6的防火墙限制的,默认情况下是禁止从外网访问内网的设备,导致就算获取了IPv6地址也没有什么卵用,所以如果不折腾一下路由器没法直接走IPv6的,但由于最后一天时间不够就没有去刷路由了。理论上如果两端所在网络支持IPv6的访问其实也不用像我一样折腾,parsec支持IPv6的互连。
1668329388351
(错误的,落后的)

2.2 远程控制/内网穿透方案

2.2.1 锐评

首先不负责锐评一下我尝试/云过的一些方法:

  • frps+moonlight串流(局域网简单尝试)

理论上可以frp直接穿一系列端口,需要一些设置,但只支持N卡,而且如果出了问题重新建立串流需要在被控电脑上输入pin码,这在异地会很繁琐,同时我NAS所在网络的TP-LINK路由已经转了好多端口了,再加这么些个端口顶到上限了,pass。

  • frps+RDP远程桌面(成功)

win10专业版自带的远程桌面功能,win10家庭版似乎也有办法开启,优点是只要frp穿3389端口并且防火墙放行即可,设置简单,但NV屏蔽了RDF调用OpenGL,虽然也有技术手段去修改吧总之就是没法直接玩游戏,而且延迟稍差,可调设置也少了些,作为办公尚可。

我将RDP作为了parsec不支持ipadOS的简单替代方法,同时由于我NAS只有动态ipv4且实测frp服务器可以用ddns而moon服务器不支持,需要直接输我NAS的动态IP,所以RDP也成为了我未来IP变化后重新配置moon服务器的必要手段。

  • 向日葵远程桌面(云的)

收费我个人直接先pass了,144Hz都需要付费,parsec免费版支持到最高240Hz。

  • 蒲公英组网+parsec(失败)

不知什么原因,没研究为啥不行,总之就是not work,虚拟局域网组不起来,有可能是国内软件和parsec水土不服?

  • zerotier+moons+parsec(成功)

单独使用zerotier+parsec其实已经可以联机,但由于zerotier中转服务器都在国外,所以网络延迟会来到难以忍受的300ms+,所以需要部署国内的moons做中转,体验会得到极大提升,我的最终网络延迟可以在10ms-15ms。

至于为什么不用frps+parsec,答案是我不会,parsec不像RDP或者moonlight有明确需要映射的端口列表和手动添加电脑功能,没有找到相关教程,暂时搞不来。

优点不必说,我设置20Mbps带宽基本能低延迟稳定1080P 144Hz;缺点的话就是moon服务器需要一定的带宽,它决定了你最终parsec支持的画质和流畅程度,我是因为有个人使用支持公网IP的NAS,如果采用国内云服务器的方案,去找个优惠的服务器40-50一年但一般也就2-4Mbps的带宽,也许能支持到720P 30Hz?而且moon服务器不支持ddns,所以我NAS的动态IP变动之后也需要重新配置(如果是云服务器有固定公网IP反而也不用管了)。所以最好的方法还是别按我这折腾,想办法整个公网IP,parsec自己基本能给打通。

我最终采用了两种内网穿透方式:

  1. 基于dokcer在NAS安装frps,在被控电脑端设置frpc,配置端口
  2. 在互联的设备上均安装zerotier进行异地组网,同时在NAS基于docker安装moons中转加速

2.2.2 群辉部署frp服务器

参考教程:https://www.psay.cn/toss/181.html
项目地址:https://github.com/fatedier/frp

可以用ssh连接群辉通过命令行建立容器(一般会自动拉取镜像):

docker run \
   --restart=always \
   --network host -d \
   -v /docker/frp/frps.ini:/etc/frp/frps.ini \
   --name frps \
   snowdreamtech/frps

群辉的文件挂载路径还需要根据你的存储空间改为如 volume1/docker/frp/frps.ini 的上级地址。
也可以直接参考上面的配置在群辉的图形界面直接设置,主要需要注意文件装载路径(本地文件根据实际设置):
image

启动完成后,应该可以在对应文件夹找到frps.ini文件,以文本编辑可以看到

[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = xxxxxxx
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 7080
vhost_https_port = 7081

# 身份验证,与后续客户端设置一致
token = xxxxxxx

然后再NAS所在路由上放行要用到的端口即可。我主要转发了7000和7500端口,7000是服务端监听端口,如果要开启http和https则转发对应的端口;7500是服务端控制面板,输入配置的管理员用户和密码,可以后台查看流量总览等:

image-1669192261686

到此frp穿透的服务器已经搭建完成,接着配置客户端(被控PC),根据操作系统从frp项目地址下载对应的release版本解压即可:

image-1669192861997

主要修改frpc.ini文件即可,以文本形式编辑:

[common]
# server_addr为FRPS服务器IP地址
server_addr = www.abc.com
# server_port为服务端监听端口,bind_port
server_port = 7000
# 身份验证,与服务端一致
token = xxxxxx

[desktop]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 2288


# [desktop] 为服务名称,上方设置为,访问frp服务端的2288端口时,等同于通过中转服务器访问127.0.0.1的3389端口(即远程桌面端口)。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP 
# local_port 为目标端口
# remote_port 为远程端口

修改完保存后,点击frpc.exe运行则应该能成功穿透对应端口。更加自动化和美观一点可以在该目录新建txt文件,输入以下代码后保存为bat文件,然后创建一个快捷方式放到开机启动文件夹(Windows+R调出运行程序框键入“shell:Common Startup”,确认后跳转到的即启动文件夹):

if "%1"=="hide" goto CmdBegin
start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit
:CmdBegin
@ echo off
echo "Start to close frpc.exe program"
taskkill /f /im "frpc.exe"
echo "frpc.exe program has been closed"
frpc.exe -c frpc.ini
pause>nul

这样穿透程序就会开机自动启动且隐藏窗口。然后就可以在任何的windows电脑上搜索远程桌面链接,设置好计算机(即群辉的域名+设置的端口2288)和你的微软用户名密码,点击连接就可以远程操控你的电脑了。

image-1669194310237

2.2.3 群辉部署moon服务器

参考教程:
https://muzihuaner.github.io/2021/09/22/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%A5%9E%E5%99%A8ZeroTier%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/
https://ssrvps.org/archives/5531
项目地址:https://github.com/jonnyan404/docker-zerotier-moon

moon服务器是zerotier的中转服务器,这里就不赘述zerotier的设置了,就是通过虚拟局域网将不在同一网络下的设备相互通信,可以参考网络教程,很简单但是实际延迟会比较大,moon服务器就是解决延迟问题的。

同样还是基于doker,可以用ssh连接群辉通过命令行建立容器:

docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v ~/somewhere:/var/lib/zerotier-one seedgou/zerotier-moon -4 1.2.3.4

也可以用群辉的图形化界面,注意需要映射9993端口的udp转发和挂载文件夹,同时运行指令“-4 1.2.3.4”替换为你服务器的公网IP(不支持域名,所以动态IP变动需要重新设置容器),如果支持 IPv6 ,可以使用“-6 ipv6地址”作为启动指令,-4 选项可在纯 IPv6 环境中忽略。

image-1669195099210image-1669195118135

容器成功运行后可以查看moon id(命令行模式键入docker logs zerotier-moon,群辉图形界面查看docker的日志):

image-1669195577639

这时候在你设置的本地路径下应该有对应moon id的moon文件生成:

image-1669195655506

将该文件分别下载到控制端和被控端的电脑上,并放入C:\Program Files (x86)\ZeroTier\moons.d 路径下,然后再命令提示符中键入

zerotier-cli orbit moon_id moon_id #替换为生成的moon id,重复两次

提示成功后可以键入

zerotier-cli listpeers

查看所有的planet和moon服务器,如果看到有刚才设置的服务器那么就大功告成了(别忘了被控端和控制端都需要设置):

image-1669196041933

可以试着ping一下zerotier分配的ip之间的延迟此时应该降低了许多:

image-1669196272398

做完了以上一切就可以打开zerotier,连上你创建的虚拟网络,打开parsec开始远程操控了,方便起见可以将zerotier和parsec都设置成开机自启动。

parsec的具体设置则根据具体的网络情况调整即可,如果支持注意打开硬件解码(NVIDIA),编码模式选择偏好H.265,我nas和PC所在的网络都是30Mbps的上行,宿舍是100M宽带,所以我parsec设置20Mbps的带宽限制,分辨率和刷新率为1080P144Hz,质量为低延迟模式。

时隔快两年因为换到工位了重新配置,更新一些注意事项:

  • 群辉进行moon服务配置时注意端口冲突问题,比如zerotier相关服务得先停掉
  • 到新的网络环境记得去zerotier网站那边给新地址authorize,不然你就可以看到经典6032报错了…

3 远程唤醒部分

本着不再多花半分钱的思想,我直接pass掉了需要额外购置硬件的操作。思考了一番找了一台家里不用的旧手机,通过之前搭建的frp服务器,在手机上安装frpc然后让唤醒魔包经过这台手机在家里的局域网进行广播唤醒我的PC。

首先是bios和防火墙的设置


评论