【WGCF】连接CF WARP为服务器添加IPv4/IPv6网络

发布于 / 信息应用 / 69 条评论

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流量转发

校园网的IPv4收费不少高校都比较贵,而IPv6是不限速不限量的。经过2020年9月10日教育网的路由变动后,CERNET在HKIX与HE以Peer via IX的形式进行了互联。因 ...
https://luotianyi.vc/4500.html

文中第【一】、【二】两节即为此步骤的详细操作,最终目标是获取到如图所示的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是正确安装上的:

安装主程序,Debian需要添加unstable源,Ubuntu则只需要添加库即可:

经过群友的补充,CentOS 7因为内核比较老不能支持,需要安装添加elrepo源并更换kernel-ml内核。个人不推荐使用CentOS进行安装,7得换内核,8还成了弃子,有点麻烦。

DKMS会将WG的内核模块编译并加载上去,出现DKMS: install completed.并且无错误即可。如果出现内核模块未加载成功,可以尝试reinstall一下wireguard-dkms,最终以如下命令检查:

确认模块有返回后,就可以把上文【二】中你需要的配置文件拿出来,配置文件目录放在/etc/wireguard下。比如我选择命名为wgcf.conf,则开启与关闭命令与配置文件对应:

开启后可通过ifconfig看到名称为你配置文件的WARP虚拟网卡,此时便可以通过WARP进行外部访问了。


安装Go版本模块

OpenVZ和LXC因为不具有内核权限,如果确有需要自己装WireGuard-Go作为内核模块的替代,WG主程序在检测不到内核的模块时会fallback到go的模块启动程序;同时这个也可以解决部分人不想给内核加载模块的问题,只是效率略低。

在这之前我们要检查一下你的服务器是否开启了TUN支持,如果未开启的话需要联系你的服务商开启:

既然是go语言写的,自己编译和用现成别人编译好的都可以,自己编译的话需要go语言版本高于1.13才可以。

直接用别人编译好的包也是可以的,loc上的@52mfzy提供了一个预编译64位的项目的地址。

其他的架构我找到一个比较老的20181222版本,如有需要可以按自己需求选择(点击前往),tar.xz包用tar -xf命令解压。注意这里提供的旧版本软件包因为是测试版本,需要添加确认运行的系统变量(新版本就没问题了);你可以在启动隧道前执行一次,也可以添加到/etc/profile永久生效。

go模块安装正确后,请参考前文添加源并安装主程序,Debian仅安装wireguard-tools即可,Ubuntu安装wireguard,CentOS仅安装wireguard-tools,内核模块无需安装。其余的写配置文件和使用也与前文一致。


开机自启

我不建议把WARP设置为开机自启,不过也没什么问题,官方提供的文档是通过systemctl管理的,所以比较老的系统就不用考虑了。


四、结语

本文最初的目的就是因为买了Scaleway的Stardust纯IPv6实例,实测效果是非常不错的。相比于DNS64等方案,CloudFlare提供的网络非常优秀。

腾讯云轻量这边,服务器到CF的Endpoint才0.4ms,添加IPv6后到本地谷歌的CDN节点仅仅3ms,基本可以当作本地具备的IPv6使用了。鹅厂的服务器最近用的也蛮舒服的,别具一格的升配活动连学生机都可以参与,有需要的话也可以考虑一下~

经过实际测试,与WARP建立的隧道在5天的时间中均未出现明显的波动,其连通性及稳定性相较于HE.NET的TunnelBroker好很多;并且作为商业化的应用,其速度得到了很好的保证。

至于前文AllowIPs讲的非常简单,只用了仅保留IPv4/IPv6其一,其实可以不必如此,它是以路由表的形式接管流量,你可以自己通过修改参数自己指定路由表的内容。这里就不展开讲了,附一个从loc大佬那里拿来的IP库(点击下载)。

最后还是那句话,且用且珍惜,不要将公共的资源肆意加以滥用~


*转载请注明原文档出处
*文章部分参考自Linode官方文档

转载原创文章请注明,转载自: Luminous' Home » 【WGCF】连接CF WARP为服务器添加IPv4/IPv6网络

  1. 老哥 加个友链可好
    https://blog.8086k.cn/ 飞羽小随笔

    1. @Chris 请在留言交流页面按相关格式提交哦~
  2. 最近教育网V6到晚上就炸 延迟100+ms

    1. @Chris 没办法,那2*10G的容量相比于绝大多数高校不限制单终端带宽,只要有数十个流量大户就能让这个出口堵起来……
  3. CF WARP 这样会有流量限制吗?

    1. @听说 目前来讲,还没有限制
  4. https://hiram.wang/cloudflare-wrap-vps/
    这个大佬的方法似乎可以让ipv4和ipv6都走warp
    但是我在韩国甲骨文上面试了一下,成功运行了
    但是ipv4 ping不通,只有ipv6能通。

  5. Euserv的Ubuntu 20.04 LTS (Focal Fossa) – 64Bit – minimal v4系统。存在以下两个问题:

    1.#Ubuntu添加库
    add-apt-repository ppa:wireguard/wireguard
    错误提示:
    The team named ‘~wireguard’ has no PPA named ‘ubuntu/wireguard’
    Please choose from the following available PPAs:

    2.#开启隧道
    sudo wg-quick up wgcf
    则一直卡在:wg setconf wgcf /dev/fd/63

    1. @euserv.com LXC架构本身因为虚拟化程度很低,出现问题也是比较正常的,你可以尝试一下自己编译wg-go模块,之前有过预编译包无法使用的案例与你所说的情况一致;至于Ubuntu的库我个人不太了解,因为我用很少用。
  6. 大佬,可以分享下双栈的路由嘛,谢谢了

    1. @大大白 我也没试过,只是理论上可以……
      1. @Luminous 我成功了,写一条回源路由就可以进站了,但是只能成功第一次,关闭之后再开就不行了
        1. @大大白 请教双栈 ipv4 + ipv6 如何使用,可以请大佬提供下你实现的方法吗?🙂 tg@bt_pig
          1. @Nick table=off,然后写路由表
  7. 你好,问下怎样才能让wgcf的虚拟网卡优先走路由呢?

    1. @loukky 问题已经解决。
  8. 请问,德鸡euserv运行wg-quick up wgcf出现以下错误是怎么回事?

    1. @yh56789 整个log没问题,如果后面运行不了就用别人编译好的预编译包就是了,我之前在EUSERV上面编译的也没法用
  9. 不好使
    json: cannot unmarshal object into Go value of type []openapi.GetBoundDevices200Response
    今天看到GitHub上有人在Issue里说了,等个更新把

  10. cf warp给的边缘节点的ipv4能不能用来ssh到服务器?

    1. @致命吕布 WARP给你的是NAT4,不是给你附加公网
  11. wireguard在5.6版本已经进入内核,安装更简单了。以Debian10为例,开启buster-backports源之后,升级到最新的内核:

    然后安装wirdguard:

    一切都弄好之后,可以将 WireGuard 设置成开机启动:

    重启后可通过命令wg检查启动是否成功。Debian10默认未安装ifconfig软件包。这是因为不建议使用ifconfig,而推荐使用新的ip命令ip addr

    1. @故道白云 感谢补充(*^_^*)
  12. 离谱,自己编译不能用,预编译的就行

  13. 小白请问一下,服务器配置完,本地如何使用呢?

    1. @嘤嘤嘤 这个不在解答范围内,自己搜索哦啊(¬‿¬)
      1. @Luminous 是当正常服务器直接使用么(●ˇ∀ˇ●), 还是用wireguard客户端(这个不太会用┭┮﹏┭┮)
        1. @嘤嘤嘤 这只是让服务器能访问IPv4或者IPv6,比如那种纯IPv6的服务器,连GitHub都访问不了,开了这个就都能了
          1. @Luminous 意思就是直接当作一台IPV4服务器玩就可以了,谢谢大佬
  14. 我直接卡在了注册这一步,换了三台不同地区的机器,都是 429 Too many requests

    1. @wxchello 执行register注册,看.toml文件生成了没,然后直接不停执行generate,几次就成功了
  15. 纯v4机子按教程操作,但是开网卡后v6始终ping不通,mtr也是一片空白

    1. @qiao7 描述的很空啊,看不出是什么问题,ifconfig能不能看到网卡,直接ping6 IPv6地址通不通,配置文件能不能用都检查一下吧
      1. @Luminous ifconfig有网卡但是包都被drop了 配置文件如下
        [Interface]
        PrivateKey = ***
        Address = 172.16.0.2/32
        Address = fd01:5ca1:ab1e:8fef:5987:1e5c:1219:18b2/128
        DNS = 1.1.1.1
        MTU = 1280
        [Peer]
        PublicKey = ***
        AllowedIPs = ::/0
        Endpoint = 162.159.192.1:2408
    2. @qiao7 兄弟解决了吗?我跟你一样的问题,在其他机器上都能一次成功,在某一太机子上就是不行,我运行了wg,显示 endpoint: 162.159.192.1:2408 allowed ips: ::/0 transfer: 0 B received, 592 B sent ,而正常的显示 endpoint: 162.159.192.1:2408 allowed ips: ::/0 latest handshake: 2 seconds ago transfer: 1.06 KiB received, 900 B sent 好像没成功的那一台机子上,都没有握手成功啊,这是被加入黑名单了吗?新开的机子
  16. 想问问大佬有没有什么方法能在纯ipv6的vps上dd系统

    1. @StevenSa 有VNC的话可以进去手动配置网卡,但是目前一键脚本都不支持配置IPv6的网卡参数,有点无解
  17. dalao tql
    这比起Nat64貌似可以直接访问纯ipv4了。
    我这里甚至可以用纯v6+Warp去Ssh Ipv4的机子

    不过我用那个Scaleway Debian貌似会报错。
    用Ubuntu才正常 且打开运行一小会后 就不能用了 必须在/etc/resolv.conf添加个 ipv6的DNS
    否则解析不了域名

    1. @Ce 当然,毕竟是直接连入了WARP的虚拟网络。至于你说的问题,建议结合报错来看,解析不了的问题建议检查下resolvconf装了没,无误的话你可以在wg的配置文件里把DNS改成CF的2606:4700:4700::1111
  18. 经测试Debian5.10.11内核安装wireguard-dkms会报错,只需要apt install wireguard-dkms wireguard-tools -y 就可以了
    具体错误如下:
    Building for 5.10.11
    Building initial module for 5.10.11
    Error! The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which
    does not match this kernel/arch. This indicates that it should not be built.
    Skipped.

    1. @kamisama996 没在自己换的内核上面测试过,不太清楚欸……
  19. 我在euserv上按网上的教程尝试过编译wireguard-go,但是失败了,也不知道是小鸡问题还是别的问题,等大佬出教程

    1. @🐔你太美 原来是go版本低了,这次应该编译成功了,但还是ping不通ipv4
      1. @🐔你太美 刚才试了下是没问题的,执行wg-quick up之后没出现报错之类的。就是resolv.conf需要自己编辑一下DNS,改成Google IPv6的就可以,LXC系统缺少一些权限。
        1. @Luminous 感谢大佬
  20. wgcf 提取配置时 429 Too many requests

    1. @rcdfrd 执行register之后,ls查看account.toml是不是获取到了,然后多执行几次生成配置就能成功了
      1. @Luminous 大佬,我有个疑问,我有个服务开机自动远程数据库,如果warp随机启动就无法连接到数据库,每次重启后都要先关闭warp,等数据库连上之后再开启warp,有什么办法能解决吗?
        1. @Keung.Kwok 我之前是用systemd写的sleep一段时间再启动,不过后来也还是有一些小问题就还是手动启动了,毕竟服务器重启的很少