在外地玩到房间里的游戏——一键远程畅玩实践和教程

2022年04月更新,直接看:https://www.bilibili.com/video/BV17S4y1P7w1/

下文失效,请直接看 https://www.bilibili.com/video/BV17S4y1P7w1/

总结:在宽带运营商不提供外网 IP 时,购买云服务器,从而实现远程畅玩,相关文件见 github,链接:https://github.com/LeadroyaL/onekey-openxxx/

背景

春节期间,很多玩家都会离开自己的住所,无法玩到房间里的电脑游戏,作为一个打工人,连续玩游戏的时间少得可怜,于是花一些时间和设计,做到了远程游戏,并且春节体验了 7 天,分享给大家。

概念预设

主机:本文特指,房间里有一台用来玩游戏的电脑,长期开机。
笔记本:本文特指随身携带的设备,我用的是5年前的mbp,理论上 windows、android、ios 都可以。
云服务提供商:例如华为云、阿里云、腾讯云(排名不分先后)
VPS:购买的云服务器。
VPN:技术概念,本文所说的VPN符合法律,并非某些新闻报道里的VPN。

需求分析

根据前一篇文章《将NTR进行到底——在mac上玩epic游戏》的经验,房间里的电脑运行 steamlink,在外的笔记本电脑连到房间里的电脑,能成功的原因是二者在同一个局域网内,可以访问到房间里的电脑。

我房间里的电脑没有公网 IP,从外界访问到它是很困难的,因此问题转化为如何从外界访问到房间里的电脑。

原理

经过一系列考虑,最终决定使用购买云服务提供的服务器,在主机内运行 OpenVPN Server,将房间里的电脑接入该VPN,将笔记本接入该VPN,这三台机器会处于同一个局域网内,即可实现预期功能。

实现细节(小白不关心可以跳过,搜索:“最终方案”)

软件工程师看到这应该知道该怎么办了,自己动动手很快就能搞定,但是独乐乐不如众乐乐,我想打造一个小白也可以实现的方案,下文记录一下整个思考过程。

server配置

与 懒 学弟交流,认为 OpenVPN 是可行的。

按照 https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04 的指引,操作一遍。

但是这对于小白来说,还是太难了,走通之后,就是自动化和可重复性的过程。那便是后话。

机器选择&省钱配置

云服务通常有按量计费和包年包月计费,IP使用费、流量费、带宽费、机器费、硬盘费。各家其实差不多,由于我的人和机器都是浙江省,只有阿里云有杭州的机房。

以下均是阿里云的数据,其他云服务提供商估计差不多

机器配置:这么轻量级的服务,直接选择最最最小的机器即可,是个电脑就行。

按量计费vs包年包月:按量计费是精确到小时的,需要的时候创建实例并计费、不需要的时候销毁停止计费。价格大约是2倍左右,一天打游戏时间不会超过12小时,因此选择按量计费。

IP使用费:创建实例后,会随机给一个公网 IP,销毁后重新创建,会随机另一个 IP,而房间里的机器在连接 OpenVPN 时一定要IP,所以需要购买一个弹性 IP。必要时绑定到创建的实例上,其他时空闲,但空闲时需要付费,0.02元/小时。

其实连接OpenVPN时是可以指定域名的,但是域名刷新需要数分钟的时间,而且 windows 上刷新dns 缓存的时刻很奇怪,OpenVPN一直在使用之前解析好的dns,不会刷新dns,因此无法使用域名来动态更新 IP。

带宽费:固定带宽的价格非常昂贵,玩游戏需要5兆带宽或者10兆带宽(512KB/s~1MB/s),价格超出了绝大部分人的承受范围。不推荐。

流量费:0.8元/G,购买流量包大概0.75元/G。

最终成本(预算)

假设一天玩游戏8小时。

8小时机器费:0.074 * 8 = 0.592
16小时IP使用费:0.02 * 16 = 0.32
每小时流量费(浮动范围较大,姑且按10兆计算):1 * 60 * 60 / 1000 * 0.8 = 2.88
8小时流量费:2.88 * 8 = 23.04 元

总计:24元,且绝大部分都花在了流量上。

尽可能人性化

说出来可能不信,这部分我花了三个晚上,熬夜到凌晨三点去思考和验证各个方案,不断试错和调整。

服务端,要做的其实就是让小白可以简单地完成 OpenVPN Server 的部署,根据前文server配置的描述,这部分是不适合给小白完成的,因为需要ssh、敲命令这种“痛苦”的操作,整个过程是生成配置文件,启动 server。

docker的尝试(失败)

因此,第一个想到的就是使用 docker 来实现,刚好云服务提供商也有这种服务,刚好这种服务似乎会便宜一点,刚好也是比较流行的技术,刚好对我来说是比较新的领域。

与 Melody 学弟交流,初步认为云服务商提供的服务可以满足我的需求,使用 Dockerfile 来避免小白敲命令,使用启动容器的方式来简化用户操作。

经过大量尝试,生成配置文件过程、apt 安装 server 的过程没有任何问题,启动服务时疯狂失败,提醒说 /dev/tun 文件不存在,需要 cap NET_ADMIN才会有这个文件,或者使用特权容器,或者挂载某些设备。此外,也没有 systemd。

云服务商提供的容器显然是没有这种特权的,此时问题渐渐变得复杂了。。。

一边尝试 openvpn without tun,一边找替代品。与 SilverBullet 交流,一致认为openvpn是一款软件,理论上可以不借助 tun 来实现,需要大量的魔改,代价很高,而且没找到更好的替代品,只能用它。

网上有现成的 openvpn-docker,我认为它太重了,经我调研,经 HunterZJU 实践,确认它也需要特权。最后不得不放弃了 docker 方案。

当然,最后让我放弃 docker 方案的是一篇文章,是一位工程师对比了使用 docker 前后公司的服务器开支,给出的结论是,对于几台服务器,做这件事省钱幅度非常低,强烈反对去做。

普通VPS

因此,我决定“委屈”一下小白用户,尽可能减少敲命令的次数。

服务器登录,为避免 ssh,可以使用云服务商提供的网页版 shell,敲一些命令还是够用的。

上传 server 配置文件,为避免 scp,可以放到网上直接下载回来,使用 curl 或 wget。

最后我居然在阿里云的控制台,找到了对小白更友好的功能,可以在网页里上传文件和执行命令。

经过一系列尝试,最终先上传文件、再执行命令,即可完成服务器的配置,对小白来说,完完全全是可行的,我在春节 7 天也一直使用了该方案。

还能更简单吗?

然而腾讯云没有上传文件的功能,华为云没有执行命令和上传文件的功能,无法做到统一。

在我无计可施的时候,想起 Melody 学弟和我说过,创建实例时可以执行一些命令,一番交流后,各个厂商均支持 cloud-init 的标准 API,主动提供一个初始化脚本,在创建 VPS 完成后会立刻执行,也可以方便小白操作。

Melody 的建议成为了我最终的方案,替换了春节期间的方案。

脚本我放在了:https://github.com/LeadroyaL/onekey-openxxx/ 的 cloud-init.txt 文件

1
2
3
4
5
6
7
#!/bin/bash
base64 -d <<< XXX > /root/server.tgz
apt update
apt install openvpn -y
tar zxvf /root/server.tgz -C /etc/openvpn/server
systemctl -f enable openvpn-server@server.service
systemctl restart openvpn-server@server.service

安全性

不考虑安全性的话,小白下载到预先生成好的配置文件,按照流程操作即可完成环境搭建。

实际上,拥有服务端的配置文件,是可以解密全部流量的,从保密性角度考虑,每个人的配置文件都应该是不一样的,而这个生成过程,我自己是敲了一堆命令,随机数需要积攒熵,签名需要二次确认,再cp/mv 文件,我自己搞都很累,小白实现就更是天方夜谭了。

如何让小白也能独立生成属于自己的配置文件,初步有几个想法,使用 github 等仓库服务提供的 CI,在 CI 过程中生成文件,或者使用一些公共的 jenkins 服务,或者一些 docker 构建服务,最后把文件想办法下载回来即可。

github ci

为了方便地生成服务端配置文件和客户端配置文件,调研了三个平台,最终选择了 github。

github:可以触发 CI,可以获得构建产物,但是访问速度极慢
gitee:触发 CI 是收费功能,不考虑
coding:可以触发 CI,可以获得构建产物,适合专业团队,不适合小白

在 HunterZJU 的实践下,共同完成了该功能,详情见github链接(可能访问速度很慢):

https://github.com/LeadroyaL/onekey-openxxx

最终方案1:包年包月+按流量付费(至少7天,操作简单,稍微贵一点)

适合人群:离开家玩7天(阿里云包周)或者 30 天(华为云或腾讯云包月),并且懒得自己维护开关机。

优点:一次部署。

缺点:稍微稍微贵一点,容易造成浪费。

最终方案2:按量付费+按流量付费+弹性IP(按需启动,操作略繁琐,稍微便宜点)

适合人群:离开家的天数小于7,例如周末玩两天,包年包月不划算。

优点:按需分配。

缺点:每次需要手动部署,略繁琐。相比方案1,平均每天省不到1元钱,可以忽略。

详细步骤

我后来录了个视频,如果下面的文本描述得不清楚,可以对着视频操作:https://www.bilibili.com/video/BV19L4y137eq/

第一部分:服务器配置

选择一家云服务提供商(下文以阿里云为例,不代表个人建议),截图使用的是方案二,如果用方案一请按照说明修改。

找到创建ECS的页面。

选择:按量付费。

地域及可用区:根据个人情况选择较近的位置。

实例规格:选择最小的,1cpu、0.5GB、突发性能实例t5、ecs.t5-lc2m1.nano。

镜像:ubuntu,20.04。

存储:选择最便宜的硬盘(高效云盘),最小规格(20G)。

如果您选择方案一,那么请在最上面选择包年包月,并选择一周、一个月等单位

点击下一步,网络和安全组。

网络:首次进入要创建网络,一路默认配置即可。

公网IP:

如果您选择方案一,则勾选 “分配 IP 地址”。

如果您选择方案二,则取消 “分配 IP 地址”。

计费方式:按流量计费,然后拉满。

安全组:首次进入要创建安全组,“入方向”、“出方向”要配两次,点击 “快速添加”——“全部开放”,点击“编辑”——“协议类型:全部”。

安全组:选择这个安全组。

点击下一步

登录凭证:对小白用户,这个功能没用,请选择创建后设置。

点击 “高级选项”,会出现一个大面积输入框,叫“实例自定义数据”,好,就此打住。

请访问下面的链接,下载其中的 All-In-One.zip:

https://github.com/LeadroyaL/onekey-openxxx (可能速度很慢)
https://leadroyal.cn/All-In-One.zip (这是我的服务器,我需要为该文件付钱,钱倒是小事,可能哪天文件就被我删了)

解压 zip 文件,打开里面的 server.tgz.txt,替换掉【请替换我】,将这一大堆全都填写到网页里的框里。

如果懒得复制粘贴,也可以使用 https://github.com/LeadroyaL/onekey-openxxx 里的 cloud-init.txt (前提是能访问到)

1
2
3
4
5
6
7
#!/bin/bash
base64 -d <<< 【请替换我,前后要有空格】 > /root/server.tgz
apt update
apt install openvpn -y
tar zxvf /root/server.tgz -C /etc/openvpn/server
systemctl -f enable openvpn-server@server.service
systemctl restart openvpn-server@server.service

点击下一步,弹出总览,理论上,只有 “地区和可用区” 我们可能存在差异。

点击创建实例,付款即可。

对于方案一的用户,到这里就结束了。对于方案二的用户,还需要进行绑定弹性 IP。

创建弹性 IP,按照我图片里的来,注意地区和可用区,选择相同的地区。(例如我都是杭州)

对于方案二的用户,在结束游戏时,不玩的时候请及时销毁机器,假期结束时请销毁弹性 IP,这两个东西开着时候就会收费的。

安全性声明

使用 公开的 All-In-One.zip 时,任何人(包括我) 都能借助 All-In-One.zip 解密您的流量,如果在意的话请自行生成配置。理论可以解密流量罢了,实际上别太把自己当回事,没人关注你在玩什么

如果不信任我或者在意保密性,请阅读 https://github.com/LeadroyaL/onekey-openxxx 里的内容自行生成。


恭喜你,到这时候,服务器配置已经完成了

第二部分:客户端配置

接着上文的 All-In-One.zip,这里面还有两个文件分,分别叫 client1.ovpn 和 client2.ovpn,它们不能直接使用,需要将第一行的文本编辑掉,用记事本打开编辑就行。

从 remote YOUR_IP_ADDR 1194
改为 remote 【你刚刚创建的机器的IP】 1194

例如改为 remote 47.98.179.136 1194

如何查询自己服务器的 IP,参考下面这张图片。

然后,在房间里的主机里,安装 OpenVPN 的软件,加载其中一个 ovpn 文件,长期保持开机状态,因为将来我们要 steamlink 连过来玩游戏;笔记本电脑,加载另一个 ovpn 文件,需要的时候连接即可。

方案二里,服务器是会关机的,OpenVPN 会自动重连,问题不大。

此时,steamlink 就可以正常使用了,不行的话就配对后再用,自己研究 steamlink 如何使用,本文不涉及如何使用 steamlink。

有两个关键设置,一个是“流式传输”——“视频”——“高速/均衡/绚丽”,选高速,绚丽会卡,很可能是因为显卡算力不够;另一个是分辨率,直接关系到价格,选择合适的分辨率。

其他厂商

阿里云叫 ECS,腾讯云叫 CVM,华为云叫 ECS,基本没有区别,价格也差不多,都支持在创建时复制粘贴那一大串“乱码”,只是位置比较难找罢了。反正,选最最最小、最最最便宜那个就行。

特别的,腾讯云的机器老是售罄,被迫得加钱,但最多也就0.1元每小时,华为云有静态BGP流量费打八折,不知道体验好不好。


费用核算

项目 花费
弹性容器实例 ECI 5.6元
IP和流量费 93.5元

累积,玩了7天,大概花了 100 元,还是很贵的,可以看出基本都是流量费。

前几天 2880*1800 分辨率下,带宽12兆左右,每小时大概4GB、3.2元;

后几天 1280*720 分辨率下,带宽6兆左右,每小时大概2.4GB、1.9元;

效果

糖豆人:给侄女打游戏,steamlink 视频渲染设置为“高速”,一点都不卡
死亡细胞:我自己玩的,略有延迟,导致极限闪避、盾牌格挡会失误,动作类游戏不大适合。
古墓丽影9:我自己玩的,动画 CG 会猛卡几秒,游戏过程很流畅,玩起来无压力。
双人成行:和侄女一起玩的,非常流畅,体验极好。

感谢

懒:交流 steamlink 的实践。
SilverBullet:讨论服务端的部署形式和替代方案。
Melody:大量云服务器使用技巧。
HunterZJU:我太忙了,将 github ci 委托给了Hunter。

总结

这份作品我花了将近一个月的闲暇来完成它,技术含量不算高,但我认为它依然是一个优秀的作品,技术永远是为人类服务的,如何将技术转化为对大众、对行业有用的东西,同样是每个搞技术的人应该思考的。

有什么问题欢迎留言。。。。