鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

拯救高ping战士:自建游戏加速器教程

首先必须要承认,我标题党了,ping值是很难救的,物理距离带来的延迟是什么加速器都救不了的(或许我们可以期待一下疯子马斯克能够超越光速的奇思妙想)。不过对于普通家庭宽带,加速器还是可以有很大的优化空间的。

家庭宽带线路一般都比较差,连接海外服务器会有比较高的延迟,除了物理距离,还有线路的差异,从国内到美西最短情况下可以做到130ms的ping延迟,但是家庭宽带和服务器之间的线路很少能够达到。还有就是,由于方校长的存在,海外连接QoS极差,千兆的家宽连一张图片都要加载很久,或者是连接时断时续。这就是加速器的两个目的:一是优化网络链路,降低延迟;二就是保证连接能够有比较高的带宽和稳定性保证。话说玩游戏的应该都知道这些吧,就不过多赘述,下面直接进入正文。

其实之前也写过全局透明代理网关的教程,那篇博客主要解决的是无需配置,让客户端科学上网。使用了redsocks来做协议的转换,解决了从无到有的问题。不过由于redsocks是设计用于转发TCP流量的,很多游戏为了保证延迟,采用了UDP协议,所以那个实现无法加速游戏。

除了游戏加速器之外,本教程还有另外一个目的,就是把代理变成全局透明代理,目前访问互联网的方式主要分成两种,一种是VPN,例如PPTP、L2TP、OpenVPN等等;另一种是代理,例如shadowsocks、v2ray等等。VPN会接管全局流量,应用无感知,但是缺点很明显,就是VPN的目的是为了安全,而不是伪装,所以识别率很高,容易受到干扰。而具有特色的代理则是为了伪装而生,在使用上不及VPN那么方便,需要针对每个应用单独设置,而有的应用不支持设置代理,这篇教程可以解决这种问题。

以下进入正题。

本文会涉及到的技术有Virtual Box(用VPS、个人PC替代都可以)、V2ray、iptables,有一定的技术难度。如果对Linux系统的使用还停留在一键脚本的程度,这篇教程可能写的还是不够详细,花钱比自己折腾要容易许多。

一台独立的机器(中继节点)

虽然可以在本地部署,不过鉴于大多数人都不会使用Linux作为自己的主系统,再加上修改了本地流量,可能还是会有一些影响的,所以推荐使用一台独立的电脑,安装Linux操作系统,硬件要求不高,比路由器强那么一点就行,比如树莓派,比如斐讯N1都可以,或者你有VPS的话就更好了。

如果是游戏加速器目的,建议使用VPS,提供商推荐阿里云上海/北京/深圳,挑一个离你最近的城市,这样路由不会绕路。阿里云的机器路由优化的都还不错,不过流量价钱也很贵,建议切换到按量计费模式,然后带宽开大一点。如果觉得0.8¥/G的流量费太贵的话,也可以使用自己的小主机,但是性能可能会差一点。

这里如果你使用了单独的电脑,或者是VPS,就可以直接跳到下一部分了,毕竟安装操作系统不是本文的内容之一。

如果你身边没有小主机,也不想花价钱买VPS,推荐virtual box,虚拟一个机器出来。至于virtual box的概念、安装、基本使用,这里不过多涉及,只有一个地方需要注意,就是默认情况下网络是NAT模式,需要改成桥接/bridge模式,并且只需要这一个网卡。

988ef8bf2fc2760d7c0bc953be05b801.png

安装VPN(全局流量)

前面我们说了VPN的伪装性很差,那么这里为什么还要使用呢?有一点要指出,那些设备都是部署在出国骨干网上,国内间的流量还是比较宽松的,我们用VPN连接到中继节点上,然后在中继节点上进行流量的转换,再用正常的流量出国。实现了本机全局+流量伪装的目的。

VPN有很多,我们本文使用wireguard,因为对比了几个,wireguard在安装上是最简单的。下面以Debian Buster系统为例,其他系统可以换成类似的命令。不同系统的安装方式可见WireGuard官网

为了方便起见,以下都是使用root用户操作。由普通用户切换成root用户时,推荐使用su -命令,否则可能出现命令不存在的错误。

1
2
3
4
5
6
7
# 添加apt源
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable

# 安装必要软件
apt update
apt install -y resolvconf wireguard vim curl linux-headers-$(uname -r)

如果在最后一步安装提示linux-headers-$(uname -r)不存在,说明你的内核可能有点旧了,需要升级,在尝试的过程中,失败率还是很高的,建议直接安装最新版本。

1
2
3
4
# 开启转发
sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

下面开始配置WireGuard。

1
2
3
# 生成服务端和客户端密钥对
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee client.key | wg pubkey > client.pub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 生成服务端配置文件
# 需要注意一下命令里的eth0,有的操作系统网卡名并不是这个,需要自己确认一下
# 有两处需要修改
echo "
[Interface]
PrivateKey = $(cat server.key)
Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 50814
MTU = 1420

[Peer]
PublicKey = $(cat client.pub)
AllowedIPs = 10.0.0.2/32 " > /etc/wireguard/wg0.conf

配置文件里本来有一个DNS设置,我删掉了,因为后续会劫持DNS流量再做分流。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 生成客户端配置
echo "
[Interface]
PrivateKey = $(cat client.key)
Address = 10.0.0.2/24
DNS = 114.114.114.114
MTU = 1420

[Peer]
PublicKey = $(cat server.pub)
Endpoint = 12.34.56.78:50814
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25 "

这里需要修改Endpoint为你的中继节点地址,VPS的话需要设置成公网IP。然后把输出复制粘贴到客户端配置中。

1
2
# 启动WireGuard
wg-quick up wg0

在客户端上点击激活/activate,如果一切顺利的话,打开IPIP就可以发现IP变成了VPS的地址。或者通过观察连接状态里的流量发送和接收数据,如果一直在增长,并且本机可以上网,说明配置正常。使用命令 wg 来检查连接状态。

一般来说VPS的路由比较好的话,就已经可以实现加速器的效果了,可以尝试打开游戏测试一下,如果对结果满意,后面就不需要了,毕竟挺复杂的。

代理安装(流量出国)

本文选取的是V2ray,因为它支持承载UDP协议,ss似乎也可以,但是配置就不太会了。根据相关法律法规,跳过安装步骤。

配置文件太长,以链接的形式给出。

config.transparent.json

需要修改其中的服务器配置,其中域名部分需要修改两次,仔细查找一下serveradd.com

修改了其中暴露服务的监听地址,其中dokodemo-door设置成本地会出错,所以只能监听所有网卡,建议用外部防火墙过滤掉12345端口。

其中的dns国内解析使用了阿里的,如果使用本地DNS,需要修改路由。

流量拦截与转发

添加/usr/local/global.sh文件,内容如下:

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
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 10.0.0.1/8 -p tcp -j RETURN
iptables -t mangle -A V2RAY -d 10.0.0.1/8 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A V2RAY -d 192.168.0.1/16 -p tcp -j RETURN
iptables -t mangle -A V2RAY -d 192.168.0.1/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 255.255.255.255/32 -j RETURN
# 如果在公网搭建,并且客户端IP不固定的话,需要加上以下两条
iptables -t mangle -A V2RAY -d 主网卡的IP段 -j RETURN
iptables -t mangle -A V2RAY -s 主网卡的IP段 -j RETURN
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY

iptables -t mangle -N V2RAY_MASK
iptables -t mangle -A V2RAY_MASK -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 10.0.0.1/8 -p tcp -j RETURN
iptables -t mangle -A V2RAY_MASK -d 10.0.0.1/8 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 192.168.0.1/16 -p tcp -j RETURN
iptables -t mangle -A V2RAY_MASK -d 192.168.0.1/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 255.255.255.255/32 -j RETURN
# 如果在公网搭建,并且客户端IP不固定的话,需要加上以下两条
iptables -t mangle -A V2RAY_MASK -d 主网卡的IP段 -j RETURN
iptables -t mangle -A V2RAY_MASK -s 主网卡的IP段 -j RETURN
iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff
iptables -t mangle -A V2RAY_MASK -p udp -j MARK --set-mark 1
iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j V2RAY_MASK

iptables可以采用持久化的形式,不过因为容易出错,我一般倾向于在脚本里写。

1
2
3
chmod +x /usr/local/global.sh

bash /usr/local/global.sh

不出意外的话,此时访问ipify就会显示代理的地址了。

加速器搭建成功~

开机自动启动

/etc/rc.local 文件中加上以下几行,以后开机就可以自动开启服务了。

1
2
3
4
5
wg-quick up wg0

sleep 5

bash /usr/local/global.sh

这里有一点需要注意,如果你的中继节点ip不是固定的,需要自己在ip变更的情况下修改客户端配置。

结语

以上,就是自建游戏加速器的全部教程。

有看官可能要问了:折腾得这么麻烦,我直接买现成的加速器不好么?没错,有句话叫“世界加钱可及”,能用钱解决的问题,为啥还要花时间自己来折腾呢,况且省不了多少钱。其实我不玩那些FPS游戏,换了macOS之后对游戏也只能望洋兴叹,不过最近发现了GeForce Now这个宝贝,但是本地网络不佳,加上不是每一个应用都能设置代理,Proxifier又太贵了,实在是不觉得那玩意能值这么多钱。除此之外吧,自建加速器如果舍得花钱,可以比商业加速器得到更高的加速效果,而且不会因为使用人数太多带来质量下降;再有就是,不是所有游戏和终端都能用加速器加速,比如说不知名的小游戏,比如说switch。最后么,自建一个加速器还能睁开眼看看外面的世界,多么划算。

折腾了这么多,不由的有两个想法:外国的月亮就是更圆;有钱真好。真希望有一天,这片土地上不会再出现乐乐所说的真是闲的,花那么多钱搞自己人。愿世界和平~

如果有对顶着国内高延迟玩Geforce Now是一种什么样的体验感兴趣的话,可以看一下我在油管贴的视频。文中使用了阿里云进行中转,国外使用了cn2gia线路。

Play The Elder Scrolls On GeForce Now

参考

透明代理

WireGuard

WireGuard 搭建和使用折腾小记

WireGuard 配置和上网流量优化

Debian 10 add rc.local

how-to-disable-ipv6-on-debian