通过KCPTUN 和 Shadowsocks 给 Linux 下的网游加速


来来回回在Win和ArchLinux之间换了好几次,最终还是下定决心回到Linux怀抱,毕竟我目前的日常需求除了游戏几乎也没有什么一定要用到Win的地方,而游戏目前又几乎只在玩FF14。

Linux下跑FF14本不是个难事,很早之前Steam的Proton和Lutris就都能做到这一点了。但我的需求稍微有些特殊:

我人在欧洲,但我的FF14角色在日服。而Linux下几乎没有像Win下那样的游戏专用加速器。

于是在换回ArchLinux并配置好基本的桌面及软件后,便开始想办法寻找Linux下给网游加速降低延迟的方法。经过搜索后决定试试KcptunShadowsocks

kcptun 加速流量的原理根据Github上的介绍,如下图所示:

KCPTUN

需要注意的是,FFXIV的流量是全部走TCP格式传输的,而KCPTUN正好是加速的TCP流量,因此这个方法具有可行性。

而如果是其他游戏如PUBG(吃鸡),只有游戏大厅内的传输流量是TCP,进入游戏开始对战后为UDP流量。而KCPTUN是不对UDP流量进行处理的,因此将不会有加速效果。

所以请在准备使用此方法之前确认所需加速的流量的传输格式,以免做无用功。

  • 一台带宽尚可的Linux系统的VPS(理论上发行版不限,Ubuntu,Cent OS或其他熟悉的x64发行版都可)

远程登入VPS的shell后,在根目录下新建一个文件夹用来放kcptun 服务端,这里文件夹名就以kcptun 为例。

mkdir kcptun
cd kcptun

然后下载Github Release 页面上最新的.tar.gz 压缩包,解压缩并新建一个服务端的配置文件。 这边配置文件以 config.json 命名。

wget https://github.com/xtaci/kcptun/releases/download/v20210922/kcptun-linux-amd64-20210922.tar.gz
tar -zxvf kcptun-linux-amd64-20210922.tar.gz
vim $HOME/kcptun/config.json

这边压缩包的名称里的amd64便是x64 Linux系统用,如果是其他系统作为服务端,请根据系统选择对应的包。 后面的日期会根据作者维护更新有所不同,这里及后文都请注意更改,请勿照搬。

然后在配置文件里写入如下内容:

{
"listen": ":6666",
"target": "127.0.0.1:2345",
"key": "1234",
"crypt": "salsa20",
"mode": "fast3",
"mtu": 1400,
"sndwnd": 2048,
"rcvwnd": 2048,
"datashard": 70,
"parityshard": 30,
"dscp": 46,
"nocomp": false,
"acknodelay": false,
"nodelay": 0,
"interval": 40,
"resend": 0,
"nc": 0,
"sockbuf": 4194304,
"keepalive": 10
}
  • listen是Kcptun监听的端口,也就是Kcptun的服务端口,这里可以自行修改。
  • target是你准备加速的端口,因为我们是要给ss加速,所以这里一定要填写你的ss端口号,这里以2345为例。
  • key是通讯密钥,请修改为你自己的。
  • crypt是加密方式,默认是salsa20,同时还支持aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none。可以自行修改。
  • mode是传输模式,这里建议使用fast3。
  • sndwnd以及rcvwnd是你的本地带宽速度。我的本地宽带是Telekom 200M,这里就填写2048。也请根据自身情况更改。
  • 其他的一些参数可以保持原样,当然也可根据需求更改。

然后查看一下文件夹里目前所有的文件,应当包含 client_linux_amd64server_linux_amd64 这两个。

其中 client_linux_amd64 是客户端用,server_linux_amd64 是服务端用。

运行一下命令尝试启动服务:

./server_linux_amd64 -c $HOME/kcptun/config.json

如果看到反馈刚刚在配置文件里所填写的参数且无报错的话,即说明服务端可正常运行。Ctrl+c中断运行。

因为不能每次要开加速时临时进VPS开,那太麻烦了。所以可以给kcptun写个自动执行脚本并设定成systemd service使其在后台开机自动运行。 同样以kcptun命名:

vim kcptun.sh

#!/bin/bash
cd /root/lala/
./server_linux_amd64 -c $HOME/kcptun/config.json 2>&1 &
echo "KcpTun Started!"

并赋予其可执行权限

chmod +x $HOME/kcptun/kcptun.sh

添加systemd启动服务,注意将 /path/to/yout/kcptun.sh 替换成之前建的脚本的实际路径。

# /etc/systemd/system/kcptun.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/path/to/your/kcptun.sh

[Install]
WantedBy=multi-user.target

然后

sudo systemctl enable kcptun.service
sudo systemctl start kcptun.service

启用即可。

Shadowsocks的搭建就简单很多,很多Linux发行版的包管理器里都有现成打包好的。

按照Github Shadowsocks-libev 的Repo的说明,Ubuntu的话

sudo apt install shadowsocks-libev

安装。

Shadowsocks的配置文件同样用JSON格式,具体如下:

{
    "server":"your_server_ip",
    "server_port":2345,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"chacha20-ietf-poly1305",
    "fast_open": true,
    "workers": 1,
    "prefer_ipv6": false
}

这边Shadowsocks的侦听端口就是前面kcptun配置文件里的目标端口,如例子里便是2345。请根据前面的配置对应填写。

修改完成后保存退出。服务器上的部署部分就完成了。

方法和服务端的部署基本一样,只是配置文件和执行上稍有不同。

{
"listen": ":7426",
"target": "your.vps.public.ip:6666",
"key": "1234",
"crypt": "salsa20",
"mode": "fast2",
"mtu": 1400,
"sndwnd": 2048,
"rcvwnd": 2048,
"datashard": 70,
"parityshard": 30,
"dscp": 46,
"nocomp": false,
"acknodelay": false,
"nodelay": 0,
"interval": 40,
"resend": 0,
"nc": 0,
"sockbuf": 4194304,
"keepalive": 10
}

大致和服务端的配置文件参数一样,需要变动的只有监听端口和目标端口。

监听端口可任意填写,只要不和本地shadowsocks客户端所使用的端口冲突就行。 目标IP和端口填写为你的vps的公网ip和服务端所填写的监听端口,如上即是6666。本地带宽,加密方式等其他参数与服务端保持一致。

配置完成后按服务端同样的方法给客户端在本地也添加到systemd服务中。

脚本内容大致一致,只需相应地把执行文件由 server_linux_amd64 变为 client_linux_amd64即可。

Shadowsocks客户端实现就更多了,随便一个用的顺手的就行。

配置参数如下:

服务器IP:127.0.0.0
服务器端口:7426

其他如密码和加密方式与服务端保持一致即可。

如果不出意外,连上shadowsocks后,流量便是通过kcptun加速过的了。

进游戏里试的时候太激动忘了截图,这里就简单写一下数据对比吧。

由于FF14特殊的服务器计算的底层原理,游戏本身就自带一定“延迟”,所以我测的是实际操作起来的变化。

方法:先让角色自动奔跑,在跑动中选择任意一个传送点传送,然后看传送读条被自动打断时所剩余的时间。

实际断读条时的剩余时间数据如下:

  • 本地直连: 4.1s~3.9s
  • KCPTUN+SS:几乎稳定在4.45s
  • Win下加速器:4.5s左右

可以说至少比直连效果还是很明显的,甚至不比win下需要每个月订阅的加速器效果差多少。如果手上刚好有闲置vps,又有游戏加速需求的话,还是值得一试的。