1. 前言
参考本文能够实现以下几点需要:
- 通过 wireguard 建设隧道以及给 linux 内核增加 FULLCONE 模块,实现一条 NAT1 的 虚伪IPLC。
- 因为 wireguard 自身会减速所有的流量,所以通过
netch
配合 虚伪IPLC
局域网中转折的socks5
代理服务达到在 pc 只减速游戏的成果。 - @#¥%……&*(
本文实现的形式次要是通过打隧道的形式实现一个 虚伪 的iplc
,也就是说,如果您齐全依照我的教程走的话,您须要具备以下的前提:
- 一台提早尚可且具备公网 ip 的落地 vps,毕竟是用于打游戏,提早绝对比拟重要,同时 FULLCONE 须要公网 IP 反对。
- 一台直达的服务器,倡议是局域网内的一台虚拟机或者一个树莓派。我这边是本人组了一台
pve
服务器,而后开了个 lxc。须要留神的是,当服务开启之后,该中转折的所有流量都会走wireguard
。 - 当然还有肯定的 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 搭建和应用折腾小记