之前写过用zerotier游玩p2p联机游戏,但是zerotier毕竟是p2p的udp vpn,对于联机各方的网络需求很高,在校园网等极端网络情况下很容易出现高丢包高延迟的情况,而游戏对于高延迟高丢包又特别敏感。
这时,使用openvpn这样的中心化vpn就很有必要,像腾讯云这样大厂的服务器线路一般qos优先级比普通家宽高,因此丢包会比普通家宽的p2p直连更少,尤其是openvpn还可以使用tcp协议进行虚拟组网,可以有效减少丢包情况
本文内容仅供参考,由于网络是个很复杂的东西,每个人的网络环境都不同,因此无法保证每个人都使用openvpn后能流畅联机
服务端搭建
选择服务器
因为是中心化vpn,所以必须要搭个服务端。这里推荐腾讯云的学生机
https://cloud.tencent.com/act/campus

4m宽带对于普通的p2p游戏也够了(这里不得不吐槽一下国内贵上天的宽带,海外服务器都是随随便便几百兆甚至g口的给,国内在2024年还是4m起步)
地区选择请尽量离所有玩家都近(如果不行的话,请尽量离做主机的玩家近),否则延迟会比较高
一定要买中国大陆的服务器,千万别为了大宽带买中国香港的,用不了
购买的时候系统选择debian(选ubuntu也行,但是ubuntu默认ssh连接不能用root账号),千万别选centos那私人系统,软件包已经停止维护,个人之前有几台centos服务器总会有莫名其妙的bug
服务器配置
连接服务器前先放行下防火墙

可以像我一样,创建个应用类型为all的全部允许(意思为允许所有端口进入你的服务器)
之后ssh进入服务器
1 2
| apt update apt install openvpn -y
|
再去https://1drv.ms/u/s!AuZDyG9cXmFJhLwhIIn-OCds7fARXw?e=2GLl9b下载服务端文件
下载完后上传到服务器(可以使用sftp上传)
上传完成后解压到openvpn目录
1 2 3
| unzip -d /etc/openvpn/ openvpn.zip cd /etc/openvpn chmod +x checkpsw.sh
|
此时/etc/openvpn的目录结构应该是这样的

修改pws-file里边的user passwd为你自己的用户名密码(自己随便写就行,这里用作验证,防止别人连接你的服务器)
可以使用vi编辑器(键盘方向键控制方向,按下i进入编辑模式,编辑模式下按下esc退出,退出编辑模式后输入:wq保存并退出)
vi psw-file
这时服务端配置完备了,我们需要启动程序并让他能开机自启,这里我使用supervisor实现
sudo apt install supervisor
然后添加配置文件(vi编辑器用法同上)
vi /etc/supervisor/conf.d/openvpn_tcp.conf
添加如下内容
1 2 3 4 5 6 7
| [program:openvpn_tcp] command=/usr/sbin/openvpn --cd /etc/openvpn/ --config server_tcp.conf autostart=true autorestart=true stderr_logfile=/var/log/supervisor/openvpn_tcp.err.log stdout_logfile=/var/log/supervisor/openvpn_tcp.out.log
|
vi /etc/supervisor/conf.d/openvpn_udp.conf
1 2 3 4 5 6 7
| [program:openvpn_udp] command=/usr/sbin/openvpn --cd /etc/openvpn/ --config server_udp.conf autostart=true autorestart=true stderr_logfile=/var/log/supervisor/openvpn_udp.err.log stdout_logfile=/var/log/supervisor/openvpn_udp.out.log
|
这里我同时创建了tcp和udp两个服务端,如果你觉得你的网络环境不需要udp或者不需要tcp,可以不使用其中一个(如果你啥也不懂,照搬就行了,多开一个服务端占不了多少内存)
这里看到有端口占用就说明启动成功了
1 2
| lsof -i:53075 lsof -i:53074
|

端口启动成功后服务端就搭建完成了,接下来进入客户端配置
如果端口没开起来,可以手动启动一下服务端,然后看看报错是什么
命令如下
1 2
| /usr/sbin/openvpn --cd /etc/openvpn/ --config server_udp.conf /usr/sbin/openvpn --cd /etc/openvpn/ --config server_tcp.conf
|
配置客户端
这里有两个方案,一个是使用openvpn官方客户端,一个是使用dogfight360大佬的openvpn客户端套壳程序
openvpn因为是个面向专业用户的程序,所以官方客户端配置相对复杂
大佬的套壳程序配置比较简单,这里分别介绍,不过小白的话直接用套壳程序其实就够了
dogfight360大佬的套壳程序
进入大佬的博客下载 https://www.dogfight360.com/blog/1590/

安装图上写的虚拟网卡
编辑目录下的customize.ini(以下仅供参考,根据你自己的来改)
1 2 3 4 5 6 7 8 9 10 11
| [usbeam] Server_List=自定义节点A Disable_rules=1 Broadcast_fix=1
[自定义节点A] IP=你的服务器ip TCP_Port=53075 UDP_Port=53074 USER=你设置的用户名 PASS=你设置的密码
|

选择自定义节点A,然后点击连接即可(udp和tcp按需选择,校园网这种udp丢包严重的网络环境可以使用tcp)

如上图,就是连接成功了
由于大佬的套壳程序在2020年就停更了,不一定适用于新版服务端,如果你发现怎么也连不上,可能是客户端版本过老,建议使用openvpn官方客户端
openvpn官方客户端
去官网下载客户端 https://openvpn.net/community-downloads/

记得下载v2版本,v3版本删除了对tap模式的支持
然后我们写个配置文件,配置文件内容参考如下(文件名没有要求,以.ovpn后缀结尾就行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| client dev tap-tcp proto tcp remote 服务器ip 53075 nobind
auth-user-pass remote-cert-tls server
cipher none auth none
route 10.251.0.0 255.255.0.0 dhcp-option DNS 119.29.29.29 dhcp-option DNS 180.76.76.76
verb 3
<ca> -----BEGIN CERTIFICATE----- MIIDBzCCAe+gAwIBAgIBATANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZVc2JF QW0wHhcNMjAwNDE0MDcxMjM4WhcNMzAwNDEyMDcxMjM4WjARMQ8wDQYDVQQDDAZV c2JFQW0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKI9j4QgqcRKj0 5WQPh3inLHA34GSTPGdoHZUKhCl5V63shSAjE+Yk7xQr6BH++UEXdaIOJRJ4mBlH 6tMpJAGMsbhJxXlzTWc/6jps63bqy9noa1+0TD8S7pQ6XhkPqCcQzMxoacj8gy6p 7ytqMxhrrtdfTHkwAPUPoXJG7UYyrhcpSbMz1qdUTOUbSH5ppmsc3IUary7q2aaf KYXvXICRElq9YGr6AKaZwtg+3kTcytZnQYGd/0u2MyG0QuF3UZe1TWuur4Om03tG DQpvxRhHAwqTZHrl7JKl03QEt++8TuMIoD8nYJ8lt8Li2Jiryy/GD46a4PraYRzw XNNOK0RTAgMBAAGjajBoMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFG5nPeDCx+Up IHCwg9DUtq0jJD9DMDkGA1UdIwQyMDCAFG5nPeDCx+UpIHCwg9DUtq0jJD9DoRWk EzARMQ8wDQYDVQQDDAZVc2JFQW2CAQEwDQYJKoZIhvcNAQELBQADggEBAG9QVmFi 4lD5IIIfPMnRxgpd9HraW2Nha4KsSm+mNmKCs8JttWAkD2Ih4ciFI3dxcGkv9HEZ qnw45cgp6jEMzk4rGTNf6UWZeQSex+d3usZkLP8V8H79UYCiIazecCjQH1BFnoe+ NZ4VuaVeNXPUmJMRNsoqMWHQwHnF2ewtVKwy5ZqnOz9VqTWgavDpxorrTZpstMYR jw6lvXs30syGn/QW3hmetoDlZbaZiO0xNcaC60M5u2giDRWP+KDIZeYJoHgVEhIh pdXIQmg1k/h6Po2mafetaj2ZC+UQ5IjZOQcfvWT+ACCshVv7BD3uT1vsO3IbaVHK LwJDGbC9NMqIcrc= -----END CERTIFICATE----- </ca>
|
以上为tcp的配置文件,udp的直接改tcp为udp即可(端口也要改,将tcp的53075改成53074)
之后在openvpn客户端里导入配置文件即可连接

常见问题
- Q:所有玩家都需要使用相同的协议吗
A:理论上不需要,因为上述配置文件中tcp和udp的双网关之间可以互访,网络环境比较差的玩家选择tcp即可 - Q:所有玩家都需要使用相同的客户端吗
A:理论上也不需要,连接相同的服务端就行了,客户端方面其实没有什么特别要求