本文编写于 305 天前,最后修改于 305 天前,其中某些信息可能已经过时。

最近,我的好基友配了一台配置相当好的游戏PC,和他聊起来,我就讲了讲,我是如何把自己的游戏笔记本电脑利用联通给家里路由器分配的公网IP,实现了自己的云游戏服务器,人在外地都可以使用moonlight软件直接串流玩自己家电脑上的游戏,而且延时超低,体验也超好。他很感兴趣,也想在自家的电脑上实现,我就介绍给他说需要公网IP让他去申请。
我给出的条件是:
1、要有单独光猫,不能带路由功能,要不就没法实现自定义的好多功能了;
2、自己家的路由器最好能刷固件,支持一些自定义功能。
对于条件2,基友就和我买了一样的斐讯K2P,刷了同样的padavan固件。但是对于条件1,在安装移动宽带时,发现并没有不带路由功能的光猫可以提供,只能用带路由功能的。正当一筹莫展时,朋友发现可以把带路由的光猫工作模式设置为“桥接模式”,即可实现单光猫功能。
好了硬件方面准备好了,又遇到个麻烦,就是当地移动根本就不给分配公网IP,打客服电话申请了也没有。
没办法,期间尝试frp内网穿透到甲骨文云主机上,问题也较多,速度也慢,无法满足云游戏的低延迟高带宽需要。
幸好,基友家的K2P开启WAN里的IPv6设置后,可以获取到公网IPv6 WAN地址。诡异的是,却无法获取IPv6 LAN地址,路由器下的设备都没有IPv6公网地址。所以只能试试直接用IPv6访问路由器,然后端口转发到他的游戏PC上就可以了。经过调试,最终成功实现,现在就把其中的操作步骤分享如下:

实现此功能需要的几个前提条件

硬件准备:

1.游戏PC应配备支持GameStream的英伟达游戏显卡,并安装最新版本的Geforce Experience,同时开启GameStream开关。
2.游戏PC使用网线连接路由器,以便可以远程Wake on LAN来唤醒开机,同时传输数据更稳定。
3.能刷padavan固件的路由器1台,光猫需要设置桥模式,本人是斐讯K2P,供参考。

软件准备:

1.一个免费的个人顶级域名(去dot.tk上申请)
2.需要支持IPv6域名AAAA记录更新的CloudFlare账号。
3.找到对应路由器版本的socat程序,用于实现公网ipv6地址向本地内网ipv4地址的端口转发。

实现步骤

第一步:完成路由器IPv6相关设置

1.打开路由器padavan固件WAN设置中的IPv6选项。

设置如下图保存。


过个5到10分钟,去网络地图-外部网里状态里查看,IPv6 WAN有240开头的IP后就说明成功获取了公网IPv6地址。
这里可以注意到,并未获取到IPv6 LAN地址,说明当地移动宽带对IPv6的支持可能还不太完备。

2.设置公网IPv6地址的动态域名解析

因为IPv6地址会因为路由器重启,重新拨号等原因不断发生变动,所以有必要设置一个动态域名解析来实现一个网址和我们的路由器公网IPv6地址的对应关系,设置好后,需要访问路由只需要输入设置的域名即可,这里,我使用了cloudflare的域名解析服务和自己的免费.tk域名。
进入cloudflare网站,登录自己的账号,在自己域名的dns记录中添加一条AAAA记录的域名解析,IPv6地址可以随便输一个,比如2400::0,记得点掉 Proxied 按钮,使其变为DNS Only。然后点击保存。


然后回到路由器后台设置界面,进入扩展功能-Cloudflare 域名解析中,输入自己的cloudflare账号和API Key(可以点击上面的帮助链接获取),然后在顶级域名3[IPv6]里输入你的域名。点击保存,这样路由器就会在每600秒检测更新一次你指定域名对应的AAAA记录了,下次访问该域名就看直接访问路由器了。

至此,IPv6的相关设置完成。可以在路由器日志里看到相关更新信息:

第二步:设置游戏PC的固定IP分配

进入路由器内部网络 (LAN) - DHCP 服务器中,开启手动指定IP的DHCP列表的启用手动设置功能开关,然后在下方添加一条游戏PC的MAC地址与IP地址绑定的条目。来固定给游戏主题分配一个内网IP地址。下一步指定端口转发时需要。

第三步:设置公网IPv6到内网IPv4地址的端口转发

1.首先需要准备找到适合自己路由器的socat程序,我找了一天才从一位大佬制作的K2P固件里提取出了可用的socat程序文件(用7z解压后固件后可在/usr/bin目录下找到)。
2.使用SCP工具将socat文件上传到路由器/etc/storage/bin/目录下。这里我在手机上使用AndFTP工具上传的,过程不在赘述。
3.使用终端软件连接路由器的ssh命令行,我使用的是connectbot软件,输入以下命令使得socat可用

chmod 755 /etc/storage/bin/socat

4.回到路由器后台设置页面,进入高级设置-自定义设置-脚本,展开“在路由器启动后执行:”
在尾部输入如下内容:

nohup /etc/storage/bin/socat UDP6-LISTEN:9,reuseaddr,fork UDP4:192.168.123.204:9 &
nohup /etc/storage/bin/socat UDP6-LISTEN:47998,reuseaddr,fork UDP4:192.168.123.204:47998 &
nohup /etc/storage/bin/socat UDP6-LISTEN:47999,reuseaddr,fork UDP4:192.168.123.204:47999 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48000,reuseaddr,fork UDP4:192.168.123.204:48000 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48002,reuseaddr,fork UDP4:192.168.123.204:48002 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48010,reuseaddr,fork UDP4:192.168.123.204:48010 &
nohup /etc/storage/bin/socat TCP6-LISTEN:48010,reuseaddr,fork TCP4:192.168.123.204:48010 &
nohup /etc/storage/bin/socat TCP6-LISTEN:47984,reuseaddr,fork TCP4:192.168.123.204:47984 &
nohup /etc/storage/bin/socat TCP6-LISTEN:47989,reuseaddr,fork TCP4:192.168.123.204:47989 &

如图:

然后点击保存。
注意,这里的TCP4:192.168.123.204地址是刚才我们绑定的内网地址,这里要根据大家电脑的实际IP修改。
9号端口用于远程开机唤醒,剩下几个端口均为串流游戏使用。

5.然后进入高级设置 - 系统管理 - 恢复/导出/上传设置,点击“保存 /etc/storage/ 内容”的提交按钮,将变动保存到闪存。随后点击页面上方电源按钮,将路由器重启。


至此,公网IPv6到内网IPv4地址的端口转发就设置成功了,不过路由器重启后,会有几分钟才能获取到IPv6地址,所以需要耐心等待一下。

第四步:设置游戏PC的远程开机和GameStream选项

1.进入电脑的BIOS中,找到WAKE ON LAN的相关选项,打开它,此步不再赘述。(我的笔记本电脑没有此选项,但是实际支持LAN唤醒)
2.打开电脑,进入系统后,打开Geforce Experience软件,登录账号后,点击右上方齿轮图标,点击左侧SHIELD,然后打开GAMESTREAM开关即可。


这里建议添加远程桌面客户端到游戏和应用里,这样就可以以远程桌面的方式运行任意程序和游戏了。而且根据moonlight软件开发者说,添加了mstsc程序其实只是一个占位符,告诉GFE要运行远程桌面罢了,并不会实际运行它。
添加方式:点击下方添加按钮,选择C:\windows\system32\mstsc.exe程序即可,然后点击编辑按钮,修改名字和图标吧。

至此就完成了自己的公网云游戏服务器搭建哦。要想连接自己服务器,只需要在支持ipv6网络里打开moonlight软件,添加主机地址就输入前面在cloudflare设置的域名就可以咯。

本人实际测试了下,离基友400公里,还跨了移动联通运营商。在强制H265编码下游戏传输延迟加解码延迟才仅有十毫秒左右,根本感觉不出来。游戏体验相当好。

附相关项目地址:

本人使用的K2P固件:https://opt.cn2qq.com/padavan/
免费个人域名申请:https://www.freenom.com/zh/index.html?lang=zh
CloudFlare注册:https://dash.cloudflare.com/sign-up
提取socat使用的固件发布地址:https://github.com/hanwckf/rt-n56u/releases
Moonlight:https://moonlight-stream.org/
Geforce Experience:https://www.geforce.cn/geforce-experience/download