Switch的NAT Type是一个很迷惑的东西,因为似乎没有人能够解释清楚NAT Type的每个类别对应什么意思,又会有什么影响,但是这玩意似乎又能决定一些游戏能否成功联机,比如喷喷。网络上什么说法都有,不过经过我一段时间的摸索,终于理解一丝丝Switch联机的秘密,并找到了不依靠商用加速器提升NAT Type的方法。
声明
这篇文章适合对计算机网络有一定了解的(至少得知道NAT,TCP,UDP这些词),乐于请教搜索引擎,也有兴趣和能力部署爬墙工具的玩家,因为大家都知道的原因,本文将不会包含手把手部署爬墙工具的内容。实施这个方案也需要时间,耐心和勇气,有可能在部署过程中就把家里网弄塌了,而且大概还是要花点钱,折腾完了发现还是商用加速器香。
NAT Type
一般来说,NAT Type可以分为很多种,最经典的分类是RFC 3489里的,其中最受限的是对称形(Symmetric),最开放的是完全锥形(Full Cone)(注:无NAT的公网也可以被认为是完全锥形网络),简单来说就是联机双方网络受限程度越重,双方能够直接通信的可能性越小,也就是UDP打洞的成功率越低,因此NAT类型会对某些游戏的联机产生影响。这里还是得喷任天堂,明明只要像CF一样弄个公共服务器辅助双方的通信就没这么多破事了,就算双方都是对称形都没关系。
根据我的观察和网上的资料,Switch的NAT Type A差不多等同于RFC 3489中定义的完全锥形(Full Cone)。不过很遗憾,出于安全考虑,以及封杀P2P的需要,大部分国内网络别说各种受限的锥形了,基本上都是对称形,大多数玩家裸连都能喜提一个Type C或者D。还好,拯救对称形网络是完全可行的。
加速的思路
通常网上常见的思路有两种,DMZ法,HTTP代理法,和透明代理法。这篇文章是基于透明代理的思路实现Switch联机加速。
DMZ法
这种方法通常没什么luan用,能通过DMZ提升NAT Type,仅适用于以下情况:
- 运营商(ISP)给你家整了公网IP地址
- 你给你家整了路由器
- 同时路由器的防火墙设置比较严格
考虑到绝大部分的人拿不到公网IP地址,这方法几乎不适用于绝大部分人群。就算有你家有公网IP地址,考虑到一般情况下你的数据包都会走稀烂的国际出口,你的Switch也不能稳定连接到其他玩家的设备。
HTTP代理法
这个方法有一点luan用,确实能加速下载游戏(因为下载是TCP通信),但不能提升NAT Type,原因非常简单,HTTP代理不能处理UDP包,也就是对于一些游戏来说,开和没开代理没有任何区别,因为那部分游戏的联机依赖UDP通信。
透明代理法
这个基本上就是最后的大招了。参考下图,电脑手机游戏机的数据包其实是先发送给网关(Gateway)来处理(一般路由器充当了网关Gateway,交换机Switch,和猫Modem),也就是说网关会拿到所有的数据,包括TCP包和UDP包。
已知所有问题都是因为NAT,缺少公网IP造成的,那么如果我们刚好有一个有公网IP地址的VPS,能不能让Switch借用我们的VPS服务器的公网IP地址当作自己的IP地址完成通信?「借用身份」这个思想,其实就是「代理」这个词的含义,最初用于保护隐私,只不过我们通常用代理去干了一些别的事情。
因此,这篇文章的主要就是让你折腾一个透明代理,所谓透明代理,在这篇文章里就是路由器拿着Switch的数据包,先传送到VPS上,以VPS的公网IP地址完成收发,而不是直接用路由器的IP地址收发。
题外话,我还购买了腾讯加速器的服务,它要求修改Switch上的网关地址,本质上也是一种透明代理,而且也能提升到Type A,不过感觉只有SVIP才能保证喷喷不掉线。
部署透明代理
可能你会说,说了大半天,不就是要上透明代理嘛,这种教程到处都是。确实,不过这篇文章不会过多的深入配置的细节。
软件的选择
一般的透明代理常用以下几种软件:
- Shadowsocks系:包括SS,SSR,SSRR等等
- V2Ray系:包括V2Ray,V2Fly,和Xray
- Trojan
我个人倾向于使用V2Ray系,可玩性非常高,支持的协议非常的全面,同时一些分支(如Xray)迭代的速度非常快,大量引入新特性。此外,据Xray作者所述,V2Ray原版UDP代理的实现一言难尽。所以本文将会使用Xray这个实现,而不是原版V2Ray。
Shadowsocks系和Trojan当然没啥问题,只不过本文不会介绍它罢了。
服务端配置
略,可参考V2Ray的配置教程,毕竟这里老司机任意发挥各显神通的地方,我就不插嘴了,注意服务端和客户端一定都要用Xray,否则最后配置成的网络不是Full Cone的NAT,也会有UDP断流的问题(参见issue:玩彩6或者开Origin时,断流严重),推荐使用Docker部署。
路由器配置
最好使用官方原版OpenWRT,基于某个Snapshot构建的同时打包了一堆插件的OpenWRT可能会产生兼容问题,当然刚好集成了文章中提及的插件的包可以试着用用。
替换路由器V2Ray版本
由于原版V2Ray在处理UDP包的流程上有严重缺陷,所以必须要替换路由器上的V2Ray版本。首先在https://github.com/XTLS/Xray-core/releases上下载Xray,注意区分路由器CPU指令集,如armv7a
或者x64
什么的。在电脑上下载再用scp
上传,或者直接在路由器上wget
都可以。将压缩包解压后,用解压出来的xray
文件替换路由器上的/usr/bin/v2ray
文件,再在OpenWRT网页端重载V2Ray服务即可,看到网页上显示V2Ray版本为Xray即可。
验证配置
当然用Switch直接做测试就可以了,不出意外的话能看到NAT Type A了,如果不是,可以检查VPS的防火墙配置。
Windows下测试推荐使用NatTypeTester,注意关闭Windows防火墙以免其影响测试结果。
结论
不是吃饱了撑着或是有特殊需求,如用Switch看YouTube,建议还是上个加速器吧,VPS也是要钱的啊,而且人家付费加速器的线路大概率会比你随手买的VPS更好。