1。前言参考本文实现如下需求:通过wireguard建立隧道,在linux内核中加入FULLCONE模块,实现NAT1的fakeIPLC。因为wireguard本身会对所有流量进行加速,所以通过netch和伪IPLC局域网中转机socks5代理服务来达到只加速pc端游戏的效果。@#¥%……&*(本文的实现方式主要是通过隧道实现一个假的iplc,也就是说,如果你完全按照我的教程来做的话,你需要具备以下前提条件:一个延迟一个登陆vps可以接受,有公网IP毕竟是用来玩游戏的,延迟比较重要,同时FULLCONE需要公网IP支持,中转服务器建议是虚拟机或者树莓派LANPai,我自己搭建了一个pve服务器,然后开了一个lxc,需要注意的是,开启该服务后,中转机的所有流量都会经过wireguard,当然也有一定的linux的知识量,因为这篇教程在一些细节上可能不是很全面,本文会根据不同的需求对主体和DLC进行拆解,完成主体后可以实现本文所描述的功能,但是DLC提供了一些特殊的功能。例如,udp2raw可以帮助wireguard避免运营商时不时的切断打击。2.Ontology2.1安装wireguard本文主要介绍ubuntu的安装方法。其他linux发行版请参考官方教程或google。你需要在登陆机和中转机上都安装wireguard,登陆机作为服务器,中转机作为客户端。su-rootaptupdate#ubuntu18.04及以上aptinstallwireguardresolvconf-y#ubuntu16.04及以下add-apt-repositoryppa:wireguard/wireguardaptupdateaptinstallwireguardresolvconf-y#安装完成后建议重启#reboot2.2配置wireguard,在登陆机上依次输入以下命令:#启用ipv4流量转发echo"net.ipv4.ip_forward=1">>/etc/sysctl.confsysctl-p#创建并进入WireGuard文件夹mkdir-p/etc/wireguard&&chmod0777/etc/wireguardcd/etc/wireguardumask077#生成服务器和客户端密钥对wggenkey|开球server_privatekey|wgpubkey>server_publickeywggenkey|teeclient_privatekey|或ens3。生成服务器配置文件/etc/wireguard/wg0.conf:#重要!如果名字不是eth0,将下面的PostUp和PostDown中的eth0替换成自己服务器显示的名字#ListenPort是端口号,你可以设置你想用的号码#把下面的内容一次性粘贴上去,不要executeecho"[Interface]PrivateKey=$(catserver_privatekey)Address=10.0.0.1/24PostUp=iptables-AFORWARD-iwg0-jACCEPT;iptables-AFORWARD-owg0-jACCEPT;iptables-tnat-APOSTROUTING-oeth0-jMASQUERADEPostDown=iptables-DFORWARD-iwg0-jACCEPT;iptables-DFORWARD-owg0-jACCEPT;iptables-tnat-DPOSTROUTING-oeth0-jMASQUERADEListenPort=52540DNS=8.8.8.8MTU=1200[Peer]PublicKey=$(catclient_publickey)AllowedIPs=10.0.0.2/32">wg0.conf生成客户端配置文件/etc/wireguard/client.conf:#Endpoint是服务器ip和端口服务器配置文件中设置的号码,本地编辑后粘贴到SSH#一次性粘贴执行以下内容,不要单独执行echo"[Interface]PrivateKey=$(catclient_privatekey)Address=10.0.0.2/24DNS=8.8.8.8MTU=1200[Peer]PublicKey=$(catserver_publickey)Endpoint=1.2.3.4:52540AllowedIPs=0.0.0.0/0,::0/0持久keepalive=25">client.conf这时候需要将client.conf的内容复制到中转机的/etc/wireguard/wg0.conf中,然后分别在两台机器上启动wireguard。wireguard的一些命令如下:#StartWireGuardwg-quickupwg0#StopWireGuardwg-quickdownwg0#查看WireGuard的运行状态,此时wg为假IPLC,可以在转接机上执行如下命令进行测试:curlifconfig.me>1.2.3.4#注意这里显示的应该是你的登陆机ipping10.0.0.1#正常应该可以ping通2.3开启FULLCONENAT虽然此时已经开启了IPLC,但是此时的NAT类型timeisnotNAT1,butNAT4:SymmetricNAT.(可以通过pystun验证,非必要步骤)这个原因是因为TLDR:真正的FullConeNAT在Linux内核树上没有实现,Linux的SNAT/MASQUERADE(以iptables的配置为例)是SymmetricNAT,因此,此时我们要从linux内核入手,实现FULLCONE。安装一个完整的内核:aptinstalllinux-image-$(uname-r)安装一些依赖:(一般需要的都安装,不同的发行版可能有不同的要求,安装缺少的)aptinstallgccautoconfautogenlibtoolpkg-configlibgmp3-dev-y下载部分软件的源代码:cd~mkdirfullconecdfullconegitclonegit://git.netfilter.org/libmnlgitclonegit://git.netfilter.org/libnftnl.gitgitgitclonegit://git.netfilter.org/iptables.gitgitclonehttps://github.com/Chion82/netfilter-full-cone-nat.git2.3.1编译libmnlcd~/fullcone/libmblshautogen.sh./configuremakemakeinstall然后:whereislibmnl>libmnl:/usr/local/lib/libmnl.so/usr/local/lib/libmnl.la/usr/include/libmnlldd/usr/local/lib/libmnl.so2.3.2编译libnftnlcd~/fullcone/libnftnlshautogen.sh./configuremakemakeinstall2.3.3编译并临时启用netfilter-full-cone-natcd~/fullcone/netfilter-full-cone-natmakeinsmodxt_FULLCONENAT.ko#如果编译模块报错,请安装kernel-devel,以及加载模块报错Unknownsymbolinmodule,先modprobenf_nat再加载模块。2.3.4编译替换iptablescp~/fullcone/netfilter-full-cone-nat/libipt_FULLCONENAT.c~/fullcone/iptables/extensions/ln-sfv/usr/sbin/xtables-multi/usr/bin/iptables-xml。/autogen.shPKG_CONFIG_PATH=/usr/local/lib/pkgconfigexportPKG_CONFIG_PATH./configuremakemakeinstall#关闭iptablessystemctlstopiptables#进入对应目录覆盖相关文件cd/usr/local/sbincp/usr/local/sbin/iptables/sbin/cp/usr/local/sbin/iptables-restore/sbin/cp/usr/local/sbin/iptables-save/sbin/2.3.5checkfullconeiptables-tnat-APOSTROUTING-oeth0-jFULLCONENAT#没有错误lsmod|grepxt_FULLCONENAT#有结果2.3.6开启自动加载mv~/fullcone/netfilter-full-cone-nat/xt_FULLCONENAT.ko/lib/modules/$(uname-r)/depmod新建编辑/etc/modules-加载。d/fullconenat.conf:xt_FULLCONENAT验证:rebootlsmod|grepxt_FULLCONENATps:如果这里没有结果,内核可能更新了,请再次执行cd~/fullcone/netfilter-full-cone-natmakemv~/fullcone/netfilter-full-cone-n??at/xt_FULLCONENAT.ko/lib/modules/$(uname-r)/depmod然后reboot2.4修改wireguard配置在登陆机修改/etc/wireguard/wg0.conf:setpostup末尾的iptables-tnat-APOSTROUTING-oeth0-jMASQUERADE改为iptables-tnat-APOSTROUTING-oeth0-jFULLCONENAT和iptables-tnat-DPOSTROUTING-oeth0-jMASQUERADEpostdown结尾改为iptables-tnat-DPOSTROUTING-oeth0-jFULLCONENAT重启登陆机的wireguard网卡:wg-quickdownwg0wg-quickupwg0至此我们实现了一个fakeIPLC2.5本文使用的NAT1加速游戏游戏加速软件是netch,netch支持常见的远程代理协议,在其github中提供。至于@#¥%……&……的■■■■■■■■■■■■,本文暂不一一列举,大家随意发挥。我们只需要在局域网的中转机上承载这些服务,然后通过PC端的netch软件进行连接,就可以实现nat1游戏的加速。唯一需要注意的是:构建的服务需要支持完整的udp,否则之前的努力就白费了。当然也可以搭建一个简单的socks5服务(如:dante-server),但是因为遇到了一些奇怪的问题,这里就不发教程了。3.DLC3.1pystunpystun是一个可以检测linux服务器nat类型的工具。安装pystun需要使用python的包管理工具pip。执行以下命令安装pip:curlhttps://bootstrap.pypa.io/get-pip.py-oget-pip.pythonget-pip.py通过pip安装pystun:pipinstallpystun3执行pystun3你应该得到结果如下:NATType:FullConeExternalIP:youripExternalPort:RandomPort其中NATType对应于你机器的NAT类型。具体的NAT类型请自行google。本文最终想要的结果是NAT1,即FULLCONE。3.2udp2raw因为wireguard使用udp传输,我玩的热火朝天的时候电信经常给我断流,所以我需要在wireguard外面套一层udp2raw。具体实现步骤如下:先去下载地址下载udp2raw,然后在登陆机上启动服务器:#记得修改udp2raw的路径和密码nohuppath/to/udp2raw-s-l0.0.0。0:9898-r127.0.0.1:52540--raw-modefaketcp-a-kpassword>/root/app/logs/udp2raw.log2>&1&然后在中转机上打开客户端:#因为端点wireguard的会改成中转机的udp2raw,必须先加上转发规则iprouteadd1.2.3.4via$(iproute|awk'$1=="default"{print$3}')#记得修改udp2rawnohup的路径、ip和密码path/to/udp2raw-c-r1.2.3.4:9898-l127.0.0.1:52540--raw-modefaketcp-kpassword>/root/udp2raw.log2>&1&修改中转机的wireguard设置/etc/wireguard/wg0.conf将Endpoint改为127.0.0.1:52540重启wireguardwg-quickdownwg0wg-quickupwg0已经完成了wg伪装成tcp的过程。对于丢包严重的朋友,也可以使用udp2raw作者开发的udpspeeder。具体使用方法可以参考其github。关于udp2raw的一些具体用法也有介绍。致谢从DNAT到netfilter内核子系统,谈谈LinuxFullConeNATCentos7启用网关时的实现Fullconenat在Debiannetchudp2raw-tunnelWireGuard上从源码安装nftables搭建使用折腾笔记
