最近和朋友一起玩无主之地3,因为亚洲的服务器对于我们来说延迟太高,导致游戏体验非常差(基本没法玩),刚好我发现游戏支持局域网联机,刚好我有一台闲置的服务器,我就在想有没有可能通过服务器把我们连接到一个虚拟的局域网中呢?首先我想到了 VPN(virtual private network),于是我在我的服务器上搭建了openvpn,问题随之而来了,打开 vpn 后所有的流量都通过 openvpn 转发了,而且游戏延迟也非常大。于是我就开始了我的Google之旅,机缘巧合之下我发现了 zerotier ,最终我认为这才是我的梦中情人。
我是用自托管控制器的方式来使用zerotier,因为我想如果内网穿透不成功的话,通过我的服务器进行流量转发延迟和速度会比用官方提供的服务器快一些。
控制器部署教程
安装
如果你没有在你的服务器上安装zerotier那么你需要先安装它
1 | curl -s https://install.zerotier.com | sudo bash |
TOKEN
然后我们设置一个环境变量来记住你节点的令牌(如果你不知道什么是环境变量,你可以认为后面所有的命令中的类似${TOKEN}
都会替换成我们现在配置的值)
1 | TOKEN=$(sudo cat /var/lib/zerotier-one/authtoken.secret) |
ZeroTier 主目录中的 authtoken.secret 文件是对控制器服务进行 API 调用所必需的,你的 TOKEN 就保存在这里面,如果你想,你可以修改它。
Node ID
接下来我们要找到服务器上 zerotier 的 Node ID, 因为我们要使用它来找到我们的服务器
1 | # (可能需要 sudo) |
在输出的内容中有 “Address” 那一行的内容就是你的 Node ID,复制出来然后我们把它存到环境变量里备用。
1 | NODEID=你的Node ID |
或者如果你觉得上面的太麻烦,你也可以尝试尝试:
1 | NODEID=$(zerotier-cli info | cut -d " " -f 3) |
创建网络
开始创建我们的虚拟局域网,我们先执行下面的命令来创建一个虚拟局域网。
1 | curl -X POST "http://localhost:9993/controller/network/${NODEID}______" -H "X-ZT1-AUTH: ${TOKEN}" -d {} |
执行命令后,在输出的内容中你可以找到 NWID,它的值就是我们要找的。让我们把它写进环境变量备用。
1 | NWID=你的NWID |
邀请小伙伴
🎉成功执行完成上面这些内容,说明你搭建完成你自己的zerotier控制器了,让你的小伙伴打开zerotier的客户端(如果你还没有下载,去https://www.zerotier.com/download/下载),输入你的 Node ID 点击 Join Network
就可以成功的加入到你的网络了,同样你也要加入到这个网络,但是现在你们还不能在局域网中找到对方的电脑,让我们继续下一步,为节点授权。
授权节点
先把伙伴的 ID 存到环境变量中,方便后面使用
1 | MEMID=小伙伴或要授权的ID(就在软件的左上角) |
你可以调用接口查看有哪些节点加入到你的虚拟局域网中,这样你就可以确认是否你的小伙伴真的加入到了你的虚拟局域网中。
1 | curl "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}" |
OK,确认他加入进来了之后,给他的节点授权,
1 | curl -X POST "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}" -d '{"authorized": true}' |
同样我们也需要给自己授权,重新执行上面的3条命令,把MEMID的值换成你自己的ID,给你自己的游戏机(windows)授权。
至此你已经和小伙伴在同一个虚拟局域网中了。
如果在游戏中不能看到对方,试试FAQ中的第一个解决方案。
FAQ
我和小伙伴已经可以相互
ping
通了,但是游戏中的局域网却搜索不到?这是因为 BL3 在扫描 LAN 游戏时没有查看正确的适配器。例如,它查看的是普通的 Internet 适配器,而不是虚拟网络适配器。说人话就是虽然你们在一个虚拟局域网中,但是游戏扫描的是 “真实的局域网”,这个时候我们要让它优先扫描虚拟局域网,在我的zerotier局域网游戏无法搜到游戏房间文章中有解决方案
如何查看服务器下所有的NWID?
查看目录
/var/lib/zerotier-one/controller.d/network
下的文件,会有对应的NWID的文件。