某人洁癖发癫,不愿购买矿卡,斥巨资购入了 Xbox Series X 霓虹版,又因大陆老生常谈的网络问题,必须解决加速的需求。这里加速主要还是指加速游戏联机,下载的话其实可以导向国内服务器,速度还可以接受。
路线方案比选
Xbox 主机加速方案有大致上三种选择:
方案 | 商业加速器 | 商业梯子 | 自建隧道 | 自建梯子 |
---|---|---|---|---|
节点延迟 | 优秀 | 较为优秀 | 一分钱 | 一分货 |
节点选择 | 多 | 多 | 一分钱 | 一分货 |
节点运维 | 有 | 有 | 灵车 | 灵车 |
节点稳定 | 好 | 好 | 一分钱 | 一分货 |
政策风险 | 较小 | 较大 | N/A | N/A |
联机 | 好 | 较差 | 较好 | 较差 |
月开销 | UU=¥24 | ¥20+ | 劣质不加钱 | 优质比较贵 |
对 Xbox | 需要修改 IP | 需要透明代理 | 无需透明代理 | 需要透明代理 |
如果优质节点的价格合适,其实倾向于自建,因为同时还能作为其他基础设施,用于其他用途,然而事实稳定且低延迟节点要么水管太小要么太过昂贵,降低了作为基础设施一部分的价值,最终还是放弃自建方案。
商业梯子游走在深灰色地带,提供的游戏节点一般也不如商业加速器提供的优秀,加速 UDP 的效果也相对较差,价格也没有很大优势,再加上 xbox 不支持直接设置代理,需要搞透明代理,综合下来主要考虑效果较差且并不便宜,还是放弃了。
商业加速器例如 UU 加速器等除了需要固定价格外,效果还算好,同时还能保证加速 PC 游戏,最后决定选择此方案。为什么用 UU?因为之前就用 UU,而且背靠网易相对还是稳一点。
一些其他方案的讨论
由于 xbox 不支持直接设置代理,商业加速器的实现方式是路由,即主机设置加速器提供的 IP 和网关,借用原本的二层,由加速器进行路由与 NAT 的方式完成加速,这么做的话其实灵活性并不好:
- 流量首先经过 UU,无法前置对流量进行细分控制;
- 关闭加速器后需再修改 IP,xbox 反复修改 IP 较为繁琐;
- 需要一台一直打开的机器启动 UU 加速器;
- 如果购买专用的加速盒,不但完全丧失细分控制的可能,还又引入了一个危险的无法完全控制的设备。
针对部分问题,有以下的一些解决方案:
- 一直启动的机器可以选择使用官方提供的 openwrt 版 UU,已经有老板打包了 docker 镜像,可以运行在 nas 上面,缺点是需要使用手机控制;
- 因为我的 AP 支持 VLAN 绑定 SSID,给 xbox 新配一个 SSID 绑定 VLAN163,然后直接使用 DHCP 为 Xbox 下发 UU 要求的地址配置,把启动 UU 的机器也连接到同一个 VLAN,这样就能免去直接配置 IP 的问题。但当不希望使用 UU 的时候,就需要切换回正常的 wifi 重新获得新配置,不幸的是,xbox 重新连接 wifi 也很麻烦,虽然也可以通过两个配置联动(一个生效一个失效)来实现,但这样就无法在隔离 UU 的情况下让 xbox 随时都能访问内网资源了
最终方案
最终我选择了一个非常傻逼但是还挺有意思的方案:
总体方案是,RouterOS 在一个独立 VLAN 设置自己的 IP 为 UU 加速器要求的 IP,作为假的 xbox 与 UU 对接,在 RouterOS 上进行流量策略路由后 NAT 通过 UU 再出口。
网络拓扑结构
RouterOS 上配置两个 VLAN 作为两个承载网,VLAN 42 是家庭主要 VLAN,能访问我的所有资源,VLAN163 作为 UU 数据专网,隔离出 UU 加速的数据,防止数据包串味。
UU 配置
在家用服务器上启动了一台 4G 内存的 Windows 10 VM,并配置为了 IP 为 IP_WIN
。启动 UU 加速器的主机加速后,自动生成了主机加速 IP IP_163_XBOX
和 IP_163_UU
,这些 IP 在 Windows 主机 IP 固定的情况是不变的,之后会使用到这些 IP。
xbox 配置
xbox 不需要进行任何特殊配置,继续使用原来在 VLAN42 内网的 IP,网路情况对于 xbox 完全透明,xbox 的 IP 为 IP_XBOX
。
RouterOS 配置
RouterOS 上除了 VLAN 配置以外,还需要做三件事:策略路由,双向 NAT,自动切换,bridge.163
是连接到 VLAN 163 的接口。
策略路由主要包含两个部分,识别流量和路由策略,这里用一组 mangle 表规则实现,匹配来往的连接,并做上标记,再加上额外的路由表对应 mark=xbox 完成。
双向 NAT 的去程是出站的 MASQUERADE,回程匹配入站 IP 后 DNAT,均使用netmap 保证 NAT1。
自动切换使用使用 RouterOS 的 netwatch,这个功能可以在检测 IP 可达性后,执行命令,我们可以使用这个功能在 UU 启动后启用对应的路由,检测到 UU 断线后自动 fallback 到直连,提升使用体验。检测 IP 可以使用 UU 本身提供的假 DNS 6.6.6.6,这个 IP 是不能 ping 的,但是可以建立 tcp 连接检测(毕竟要提供 DNS 服务),注意这里需要修改一下 mangle 表,放通这个 ip,不然会影响检测。
下面只放了 mangle 表和 NAT 表的规则以及检测 IP 的部分,规则还有优化的空间,应该可以进一步增加限制条件,保证流量的安全。
/ip/firewall/mangle
add chain=prerouting action=mark-connection new-connection-mark=xbox passthrough=yes src-address=IP_XBOX dst-address-list=!xbox-bypass
add chain=prerouting action=mark-connection new-connection-mark=xbox passthrough=yes dst-address=IP_163_XBOX in-interface=bridge.163 src-address=!6.6.6.6
add chain=prerouting action=mark-packet new-routing-mark=xbox passthrough=no connection-mark=xbox
/ip/firewall/nat
add chain=srcnat action=netmap to-addresses=IP_163_XBOX src-address=IP_XBOX connection-mark=xbox out-interface=bridge.163
add chain=dstnat action=netmap to-addresses=IP_XBOX dst-address=IP_163_XBOX in-interface=bridge.163
/ip/route
add disabled=no distance=1 dst-address=6.6.6.6/32 gateway=IP_163_UU pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
/tool/netwatch
add disabled=no down-script="/ip/firewall/mangle/disable [find comment=\"routexbox\"]" host=6.6.6.6 http-codes="" interval=10s port=22 test-script="" type=tcp-conn up-script=\
"/ip/firewall/mangle/enable [find comment=\"routexbox\"]"
总结时间
那么一个 xbox 发出的数据包会经由多少机器呢?
数据包从 xbox 发出,经过 VLAN42 到达路由器,路由器发现这是一个需要转发的包,SNAT 为加速 IP 后从 VLAN163 发送到 UU,UU 处理后通过自己的协议和渠道从 VLAN42 正常经路由器正常出站;回来的包通过 UU 从 VLAN163 发回路由器,由路由器 DNAT 到 xbox,整个环路就完成了。
这个方案虽然折腾,但是用着其实还挺稳定,而且对路由的控制权比较大,比如可以自己过滤掉国内 IP,保证内网访问不经过 UU,对部分境外 IP 也走自己的通道等。理论上把这里的 Windows UU 换成 UU 加速盒,链路依然是可以跑通的,但是具体规则等可能要做一定的修改。
网络折腾好了,游戏却没怎么玩,这一切值得吗?