关于linux:自建-wireguard-加速游戏并实现NAT1fullcone

39次阅读

共计 5909 个字符,预计需要花费 15 分钟才能阅读完成。

1. 前言

参考本文能够实现以下几点需要:

  1. 通过 wireguard 建设隧道以及给 linux 内核增加 FULLCONE 模块,实现一条 NAT1 的 虚伪IPLC。
  2. 因为 wireguard 自身会减速所有的流量,所以通过 netch 配合 虚伪 IPLC 局域网中转折的 socks5 代理服务达到在 pc 只减速游戏的成果。
  3. @#¥%……&*(

本文实现的形式次要是通过打隧道的形式实现一个 虚伪 iplc,也就是说,如果您齐全依照我的教程走的话,您须要具备以下的前提:

  1. 一台提早尚可且具备公网 ip 的落地 vps,毕竟是用于打游戏,提早绝对比拟重要,同时 FULLCONE 须要公网 IP 反对。
  2. 一台直达的服务器,倡议是局域网内的一台虚拟机或者一个树莓派。我这边是本人组了一台 pve 服务器,而后开了个 lxc。须要留神的是,当服务开启之后,该中转折的所有流量都会走wireguard
  3. 当然还有肯定的 linux 常识,因为本教程在一些细节方面可能讲的并不是那么全面。

本文会依据不同的需要拆开老本体以及 DLC 两局部,实现 本体 就能够实现本文所述性能,然而 DLC 则提供了一些非凡的性能。比方 udp2raw 能够帮忙 wireguard 规避运营商给你时不时的一个断流打击。

2. 本体

2.1 装置 wireguard

本文次要介绍 ubuntu 的装置形式,其余 linux 发行版敬请请参考官网教程或者 google。

您须要在落地和直达机器上都装置 wireguard,落地机器作为 server 而直达机器作为client

su - root
apt update
# ubuntu 18.04 及以上版本
apt install wireguard resolvconf -y
# ubuntu 16.04 及以下版本
add-apt-repository ppa:wireguard/wireguard
apt update
apt install wireguard resolvconf -y
# 在装置实现之后倡议重启一下
# reboot

2.2 配置 wireguard

落地机器 顺次输出下列命令:

# 开启 ipv4 流量转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 创立并进入 WireGuard 文件夹
mkdir -p /etc/wireguard && chmod 0777 /etc/wireguard
cd /etc/wireguard
umask 077

# 生成服务器和客户端密钥对
wg genkey | tee server_privatekey | wg pubkey > server_publickey
wg genkey | tee client_privatekey | wg pubkey > client_publickey

通过 ifconfig 查看主网卡名称,个别会为 eth0 或者ens3

生成 server 配置文件/etc/wireguard/wg0.conf

# 重要!如果名字不是 eth0, 以下 PostUp 和 PostDown 处外面的 eth0 替换成本人服务器显示的名字
# ListenPort 为端口号,能够本人设置想应用的数字
# 以下内容一次性粘贴执行,不要分行执行
echo "
[Interface]
  PrivateKey = $(cat server_privatekey)
  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 = 52540
  DNS = 8.8.8.8
  MTU = 1200

[Peer]
  PublicKey = $(cat client_publickey)
  AllowedIPs = 10.0.0.2/32 " > wg0.conf

生成 client 配置文件/etc/wireguard/client.conf:

# Endpoint 是本人服务器 ip 和服务端配置文件中设置的端口号,本人在本地编辑好再粘贴到 SSH 里
# 以下内容一次性粘贴执行,不要分行执行
echo "
[Interface]
  PrivateKey = $(cat client_privatekey)
  Address = 10.0.0.2/24
  DNS = 8.8.8.8
  MTU = 1200

[Peer]
  PublicKey = $(cat server_publickey)
  Endpoint = 1.2.3.4:52540
  AllowedIPs = 0.0.0.0/0, ::0/0
  PersistentKeepalive = 25 " > client.conf

此时须要将 clinet.conf 的内容复制到 直达机器 /etc/wireguard/wg0.conf外面。

而后在两台机器上别离启动 wireguard,wireguard 的局部命令如下:

# 启动 WireGuard
wg-quick up wg0

# 进行 WireGuard
wg-quick down wg0

# 查看 WireGuard 运行状态
wg

到此时,一个 虚伪 IPLC了。

能够在直达机器执行如下命令进行测试:

curl ifconfig.me
> 1.2.3.4 # 留神此处显示的应该是你的落地机器 ip
ping 10.0.0.1
# 失常应该是能够 ping 通的

2.3 开启 FULLCONE NAT

尽管此时 IPLC 曾经买通,然而此时的 NAT 类型并不是 NAT1,而是 NAT4:Symmetric NAT。

(能够通过 pystun 验证,非必须步骤)

这个起因是因为

TLDR: Linux 内核树上未实现真正意义上的 Full Cone NAT,Linux 的 SNAT/MASQUERADE(以 iptables 的配置为例)均是 Symmetric NAT。

所以,此时咱们要从 linux 的内核下手,实现 FULLCONE。

装置残缺的内核:

apt install linux-image-$(uname -r)

装置一些依赖:(个别须要的都装好了,不通的发行版可能需要不一样,缺什么装什么就好了)

apt install gcc autoconf autogen libtool pkg-config libgmp3-dev -y

下载一些软件的源码:

cd ~
mkdir fullcone
cd fullcone
git clone git://git.netfilter.org/libmnl
git clone git://git.netfilter.org/libnftnl.git
git clone  git://git.netfilter.org/iptables.git
git clone https://github.com/Chion82/netfilter-full-cone-nat.git

2.3.1 编译 libmnl

cd ~/fullcone/libmbl
sh autogen.sh
./configure
make
make install

而后:

whereis libmnl

> libmnl: /usr/local/lib/libmnl.so /usr/local/lib/libmnl.la /usr/include/libmnl

ldd /usr/local/lib/libmnl.so

2.3.2 编译 libnftnl

cd ~/fullcone/libnftnl
sh autogen.sh
./configure
make
make install

2.3.3 编译和长期启用 netfilter-full-cone-nat

cd ~/fullcone/netfilter-full-cone-nat
make
insmod xt_FULLCONENAT.ko
#如果编译模块报错,请装置 kernel-devel, 载入模块报错 Unknown symbol in module,先 modprobe nf_nat 再载入模块。

2.3.4 编译和替换 iptables

cp ~/fullcone/netfilter-full-cone-nat/libipt_FULLCONENAT.c ~/fullcone/iptables/extensions/
ln -sfv /usr/sbin/xtables-multi /usr/bin/iptables-xml
./autogen.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
./configure
make
make install

#先敞开 iptables
systemctl  stop iptables
#进入相应目录,并笼罩相干文件
cd /usr/local/sbin
cp /usr/local/sbin/iptables /sbin/   
cp /usr/local/sbin/iptables-restore /sbin/
cp /usr/local/sbin/iptables-save /sbin/

2.3.5 测验 fullcone

iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT # 没有谬误
lsmod | grep xt_FULLCONENAT # 有后果

2.3.6 开启主动加载

mv ~/fullcone/netfilter-full-cone-nat/xt_FULLCONENAT.ko  /lib/modules/$(uname -r)/
depmod

新建编辑/etc/modules-load.d/fullconenat.conf:

xt_FULLCONENAT

验证:

reboot
lsmod | grep xt_FULLCONENAT

ps:

此处如果没有后果,可能是内核更新了,请从新执行

cd ~/fullcone/netfilter-full-cone-nat
make
mv ~/fullcone/netfilter-full-cone-nat/xt_FULLCONENAT.ko  /lib/modules/$(uname -r)/
depmod

而后重启即可

2.4 批改 wireguard 配置

在落地机器批改/etc/wireguard/wg0.conf:

postup 尾部的iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 批改为iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT

postdown 尾部的 iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE 批改为iptables -t nat -D POSTROUTING -o eth0 -j FULLCONENAT

重启落地机器的 wireguard 网卡:

wg-quick down wg0
wg-quick up wg0

此时咱们曾经实现了一个具备 NAT1 的 虚伪 IPLC

2.5 减速游戏

本文用到的游戏减速软件为 netch,netch 反对常见的的近程代理协定,具体在其 github 有提供。

至于那些 @#¥%……&……的■■■的■■■■,本文暂且不表,各位自由发挥。

咱们只须要将这些服务搭载在局域网的直达机器上,而后通过 PC 的 netch 软件连贯,就能够实现 nat1 的游戏减速了。

惟一须要留神的一点是:搭建的这个服务须要反对残缺的 udp,否则之前的所有致力都徒劳了。

当然搭建单纯的 socks5 服务 (比方:dante-server) 也是能够的,然而因为自己遇到一些奇怪的问题,所以此处也就不贴教程了。

3. DLC

3.1 pystun

pystun 是一个能够检测 linux 服务器 nat 类型的工具。

要装置 pystun 须要借助于 python 的包管理工具pip

执行上面命令装置pip:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

通过 pip 装置 pystun:

pip install pystun3

执行 pystun3 应该会失去如下后果:

NAT Type: Full Cone
External IP: your ip
External Port: Random Port

其中 NAT Type 对应了你的机器 NAT 类型。具体 NAT 类型的别离敬请 google。在本文中想要的到最终后果为 NAT1,即 FULLCONE。

3.2 udp2raw

因为 wireguard 应用 udp 传输,电信常常在我玩的热气腾腾的时候给我断流,所以我须要在 wireguard 里面套上一层 udp2raw。

具体实现步骤如下:

首先返回下载地址下载 udp2raw,而后在落地机器开启 server:

# 记得更改 udp2raw 的门路以及 password
nohup path/to/udp2raw -s -l0.0.0.0:9898 -r 127.0.0.1:52540 --raw-mode faketcp -a -k password >/root/app/logs/udp2raw.log 2>&1 &

而后在直达机器开启 client:

# 因为后续要更改 wireguard 的 endpoint 到直达机器的 udp2raw, 所以要先增加转发规定
ip route add 1.2.3.4 via $(ip route | awk '$1=="default"{print $3}')
# 记得批改 udp2raw 的门路、ip 和 password
nohup path/to/udp2raw -c -r 1.2.3.4:9898 -l 127.0.0.1:52540 --raw-mode faketcp -k password >/root/udp2raw.log 2>&1 &

批改直达机器的 wireguard 设置/etc/wireguard/wg0.conf

Endpoint 批改为127.0.0.1:52540

重启 wireguard

wg-quick down wg0
wg-quick up wg0

至此实现了将 wg 假装为 tcp 的过程,对于丢包重大的敌人,还能够应用 udp2raw 作者开发的 udpspeeder,具体应用办法请参考其 github,对于 udp2raw 的一些具体用法也有介绍。

鸣谢

从 DNAT 到 netfilter 内核子系统,浅谈 Linux 的 Full Cone NAT 实现

Centos 7 当网关启用 Fullcone nat

Installing nftables from sources on Debian

netch

udp2raw-tunnel

WireGuard 搭建和应用折腾小记

正文完
 0