WARP是CloudFlare提供的一项基于WireGuard的网络流量安全及加速服务,能够让你通过连接到CloudFlare的边缘节点实现隐私保护及链路优化。
其连接入口为双栈(IPv4/IPv6均可),且连接后能够获取到由CF提供基于NAT的IPv4和IPv6地址,因此我们的单栈服务器可以尝试连接到WARP来获取额外的网络连通性支持。这样我们就可以让仅具有IPv6的服务器访问IPv4,也能让仅具有IPv4的服务器获得IPv6的访问能力。
题图来源微博@Ratto,本站仅做引用,如果喜欢请务必关注画师太太啊≧ ﹏ ≦!
零、前言
在这之前我就写过利用WARP为流量计费教育网节省流量开销的文章,后来听有人说可以安装在服务器上来为服务器增加连通性支持。想了一下也确实是这个道理,毕竟双栈任选入口、连接后可提供双栈网络,而且CF本身接驳有主流的上游,不论是从打通v4还是打通v6的角度,其各方面稳定性都是其他方案无法比拟的。
作为测试,这一次为IPv4实例打通IPv6网络选择的是腾讯云香港区域的轻量应用服务器,为IPv6服务器打通IPv4网络则使用的是Scaleway的Stardust
实例。
一、WGCF配置
首先我们需要通过WGCF(点击前往)注册WARP账户并提取为WG配置文件。在这之前我写过一次有关教育网利用其IPv6连接以减少计费流量开销的文章。
【WGCF】提取WARP配置为CERNET提供IPv6流量转发
文中第【一】、【二】两节即为此步骤的详细操作,最终目标是获取到如图所示的wgcf-profile.conf
。最近不知道什么原因经常出现429报错,在wgcf register
执行之后看到目录里生成wgcf-account.toml
即可,然后多次执行wgcf generate
直至正常生成即可。
二、处理配置文件
WG连接后是内核层级的软件,会建立自己的虚拟网卡,且WARP客户端均为内网NAT地址,当双栈流量均被WG接管后我们就无法再从原有的IP连接到服务器了。因此在IPv4与IPv6之间我们必须做一个取舍,以防这样的情况发生。所以这个应用场景也就被限制到了在原有基础上提供另一种协议的连通性支持,后文会以配图以解释。
修改配置文件就两种情况:
①上文图中
11
行Endpoint修改为162.159.192.1:2408
,删除掉第9
行接管本地IPv4路由的配置
②上文图中11
行Endpoint修改为[2606:4700:d0::a29f:c001]:2408
,删除掉第10
行接管本地IPv6路由的配置
为仅IPv4服务器添加IPv6
原理如图,由于AllowedIPs = ::/0
的参数使得IPv6的流量均被WARP网卡接管,实现了让IPv6的流量通过WARP访问外部网络。这样的需求请参考情况①对配置文件进行修改。
为仅IPv6服务器添加IPv4
原理如图,由于AllowedIPs = 0.0.0.0/0
的参数使得IPv4的流量均被WARP网卡接管,实现了让IPv4的流量通过WARP访问外部网络。这样的需求请参考情况②对配置文件进行修改。
双栈服务器置换网络
有时我们的服务器本身就是双栈的,但是由于种种原因我们可能并不想使用其中的某一种网络,这时也可以通过WARP接管其中的一部分网络连接隐藏自己的IP地址。至于这样做的目的,最大的意义是减少一些滥用严重机房出现验证码的概率;同时部分内容提供商将WARP的落地IP视为真实用户的原生IP对待,能够解除一些基于IP识别的封锁。
三、安装客户端
WireGuard是内核级别的工具,来自官方的包需要加载内核模块,所以在安装前请保证你的服务器是KVM/HyperV/XEN HVM这样完全虚拟化的服务器。
OpenVZ和LXC因为不具有内核权限,如果确有需要自己装WireGuard-Go作为内核模块的替代,其提供的文档要求自己配置go环境进行编译,并没有现成的二进制预编译包。当然安装后的配置操作都是相差无几的,在这因为并不推荐就补充在最后面好了。
博主在这些”玩具”机器上使用的均是Debian系统,所以作为一篇记录我就只考虑Ubuntu和Debian系统了~
安装前先确定kernel-header
已安装,并且检查下resolv
是正确安装上的:
1 |
apt-get install sudo net-tools openresolv -y |
安装主程序,Debian需要添加unstable源,Ubuntu则只需要添加库即可:
1 2 3 4 5 6 7 8 9 10 11 12 |
#Debian添加unstable源 echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable #更新源并安装 apt-get update apt-get install wireguard-dkms wireguard-tools #Ubuntu添加库 add-apt-repository ppa:wireguard/wireguard #更新源并安装 apt-get update apt-get install wireguard |
经过群友的补充,CentOS 7因为内核比较老不能支持,需要安装添加elrepo
源并更换kernel-ml
内核。个人不推荐使用CentOS进行安装,7得换内核,8还成了弃子,有点麻烦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#安装elrepo源 rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm #安装额外包组件 yum install -y epel-release elrepo-release yum-plugin-elrepo #安装内核 yum --enablerepo=elrepo-kernel -y install kernel-ml kernel-ml-headers kernel-ml-devel #查看启动顺序 cat /boot/grub2/grub.cfg | grep menuentry #设置启动顺序 grub2-set-default 0 #查看设置成功 grub2-editenv list #更新grub grub2-mkconfig -o /boot/grub2/grub.cfg #重启 reboot #查看已安装内核 rpm -qa | grep kernel #卸载无用的 yum remove 或 rpm -e #安装WireGuard组件 yum install kmod-wireguard wireguard-tools |
DKMS会将WG的内核模块编译并加载上去,出现DKMS: install completed.
并且无错误即可。如果出现内核模块未加载成功,可以尝试reinstall
一下wireguard-dkms
,最终以如下命令检查:
1 2 3 4 |
#加载内核模块 modprobe wireguard #检查WG模块加载是否正常 lsmod | grep wireguard |
确认模块有返回后,就可以把上文【二】中你需要的配置文件拿出来,配置文件目录放在/etc/wireguard
下。比如我选择命名为wgcf.conf
,则开启与关闭命令与配置文件对应:
1 2 3 4 |
#开启隧道 sudo wg-quick up wgcf #关闭隧道 sudo wg-quick down wgcf |
开启后可通过ifconfig
看到名称为你配置文件的WARP虚拟网卡,此时便可以通过WARP进行外部访问了。
安装Go版本模块
OpenVZ和LXC因为不具有内核权限,如果确有需要自己装WireGuard-Go作为内核模块的替代,WG主程序在检测不到内核的模块时会fallback到go的模块启动程序;同时这个也可以解决部分人不想给内核加载模块的问题,只是效率略低。
在这之前我们要检查一下你的服务器是否开启了TUN支持,如果未开启的话需要联系你的服务商开启:
1 2 3 4 |
#尝试加载内核模块 modprobe tun #检查TUN模块加载是否正常 lsmod | grep tun |
既然是go语言写的,自己编译和用现成别人编译好的都可以,自己编译的话需要go语言版本高于1.13
才可以。
1 2 3 4 5 6 7 8 9 10 11 12 |
#下载代码 git clone https://git.zx2c4.com/wireguard-go #进入源码目录 cd wireguard-go #编译 make #将编译好文件移到执行目录 mv ./wireguard-go /usr/bin/wireguard-go #添加执行权限 chmod +x /usr/bin/wireguard-go #检查运行是否有返回 wireguard-go |
直接用别人编译好的包也是可以的,loc上的@52mfzy
提供了一个预编译64位的项目的地址。
1 2 3 4 5 6 |
#下载二进制文件(64位Linux) wget -P /usr/bin https://github.com/bernardkkt/wg-go-builder/releases/latest/download/wireguard-go #添加执行权限 chmod +x /usr/bin/wireguard-go #检查执行是否正常 wireguard-go |
其他的架构我找到一个比较老的20181222
版本,如有需要可以按自己需求选择(点击前往),tar.xz
包用tar -xf
命令解压。注意这里提供的旧版本软件包因为是测试版本,需要添加确认运行的系统变量(新版本就没问题了);你可以在启动隧道前执行一次,也可以添加到/etc/profile
永久生效。
1 2 |
#每次开机后执行 或 添加到/etc/profile export WG_I_PREFER_BUGGY_USERSPACE_TO_POLISHED_KMOD=1 |
go模块安装正确后,请参考前文添加源并安装主程序,Debian仅安装wireguard-tools
即可,Ubuntu安装wireguard
,CentOS仅安装wireguard-tools
,内核模块无需安装。其余的写配置文件和使用也与前文一致。
开机自启
我不建议把WARP设置为开机自启,不过也没什么问题,官方提供的文档是通过systemctl管理的,所以比较老的系统就不用考虑了。
1 2 3 4 5 6 |
#允许配置文件为wg0的开机自启 systemctl enable wg-quick@wg0.service #重载deamon配置 systemctl daemon-reload #启动wg0配置文件的进程 systemctl start wg-quick@wg0 |
四、结语
本文最初的目的就是因为买了Scaleway的Stardust纯IPv6实例,实测效果是非常不错的。相比于DNS64等方案,CloudFlare提供的网络非常优秀。
腾讯云轻量这边,服务器到CF的Endpoint才0.4ms,添加IPv6后到本地谷歌的CDN节点仅仅3ms,基本可以当作本地具备的IPv6使用了。鹅厂的服务器最近用的也蛮舒服的,别具一格的升配活动连学生机都可以参与,有需要的话也可以考虑一下~
经过实际测试,与WARP建立的隧道在5天的时间中均未出现明显的波动,其连通性及稳定性相较于HE.NET的TunnelBroker好很多;并且作为商业化的应用,其速度得到了很好的保证。
至于前文AllowIPs讲的非常简单,只用了仅保留IPv4/IPv6其一,其实可以不必如此,它是以路由表的形式接管流量,你可以自己通过修改参数自己指定路由表的内容。这里就不展开讲了,附一个从loc大佬那里拿来的IP库(点击下载)。
最后还是那句话,且用且珍惜,不要将公共的资源肆意加以滥用~
*转载请注明原文档出处
*文章部分参考自Linode官方文档
我有一台澳大利亚的ipv6 vps,IP是从美国广播过来的。用cloudflare warp加上ipv4后访问谷歌和YouTube都把我定位到美国,请问博主有没有什么办法能把它定为到澳大利亚?
scaleway或许可以这样开
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_base_mss = 1400
要求运营商留的20%容量,可以让将来的调度给其他两家做负载转移。
CM的光猫关v6spi,貌似连接性更好一点。
HK的机子失败了,loc上说只能用官方
我最近尝试了一下使用源地址路由来进行服务器双栈接入的同时不影响服务器本身提供的服务,分享一下测试成功的配置文件,请根据自己的情况进行修改。
测试时开一个screen保证ssh掉线后程序仍然可以运行
然后执行
即是路由修改错误,可以在120s后关闭隧道,2分钟内可以测试是否达到预期的效果
HK本地人,ISP是HKBN沒有IPV6,想用WARP加個IPV6地址,結果通不了。wg profile只刪除了Allow ipv4,僅僅保留ipv6.表現為ping google.com能解析到ipv6,但是沒回應。tcpdump wg有雙向數據傳輸,推測是MTU問題,從1280改到1420也不行。禁止WG自動創建路由表添加Table = off,手動設定ipv6路由表依舊無法ping通以及用warp ipv6通信。單獨ipv4通過warp是可以訪問Google.
(萌新求救)hax的ovz v6only机子,wireguard-go(预编译版)已安装,配置文件已改,可是用不了
返回信息:
[#] ip link add wgcf type wireguard
RTNETLINK answers: Operation not supported
[!] Missing WireGuard kernel module. Falling back to slow userspace implementation.
[#] wireguard-go wgcf
┌──────────────────────────────────────────────────────┐
│ │
│ Running wireguard-go is not required because this │
│ kernel has first class support for WireGuard. For │
│ information on installing the kernel module, │
│ please visit: │
│ https://www.wireguard.com/install/ │
│ │
└──────────────────────────────────────────────────────┘
ERROR: (wgcf) 2021/11/18 14:54:42 Failed to create TUN device: operation not permitted
Unable to access interface: Protocol not supported
[#] ip link delete dev wgcf
Cannot find device “wgcf”
429 无数次….起码有20次 全是429 心态崩了
cernet2这几天应该是精准封锁了warp的IPv6 2408端口,表现在icmp正常响应,所有udp流量都被阻断
老板 ,你的博客在Chrome下打开,正文字体会变白,开不到。
edge就没问题
大佬有个问题想请教下,我在纯ipv4的机器下接入了wgcf为机器添加了ipv6支持,连上之后机器能正常访问ipv6网络,但是并没有像其他linux系统那样有ipv6的网站优先使用ipv6访问。我想原因可能是因为wiregard和eth0不是一块网卡,如果要优先访问ipv6网络那么ipv6和ipv4是不是要在同一块网卡上才行(eth0里面也有一个fe80开头的内网ipv6地址),不知道大佬有什么解决办法吗?