Cloudflare WARP 给 Linux VPS 云服务器添加原生 IPv4/IPv6 双栈网络

2022-11-14 17:50:22 浏览数 (2)

关闭防火墙

关闭 Linux 服务器的自带防火墙,使用iptables来管理端口转发。 注意如果你的服务器是类似阿里云、腾讯云等服务商提供,还需要登录控制台的防火墙,开放一个UDP端口,本文以45678为例。请再三确认该端口已正常开放,你可以使用nc命令或者其他在线检测工具来测试服务器已正常开放该UDP端口。

代码语言:javascript复制
systemctl stop firewalld
systemctl disable firewalld
# CentOS 7 关闭防火墙命令
# Ubuntu, Debian 请自行搜索关闭命令

安装官方 WireGuard

访问 WireGuard 官网,本文以CentOS 7为例,由于CentOS 7内核太老,官方推荐了三种安装方式,其中第一种需要安装推荐的内核才能支持使用 WireGuard,如果安装内核会影响你其他的服务,可以选择其他两种方式。

代码语言:javascript复制
yum install -y yum-utils epel-release
yum-config-manager --setopt=centosplus.includepkgs=kernel-plus --enablerepo=centosplus --save
sed -e 's/^DEFAULTKERNEL=kernel$/DEFAULTKERNEL=kernel-plus/' -i /etc/sysconfig/kernel
yum install -y kernel-plus wireguard-tools
# 安装 kernel-plus 内核和官方 wireguard-tools
reboot
# 安装完毕需重启

使用 wgcf 生成 WireGuard 配置文件

代码语言:javascript复制
#安装 wgcf
curl -fsSL git.io/wgcf.sh | sudo bash
#注册 WARP 账户 (将生成 wgcf-account.toml 文件保存账户信息)
wgcf register
#生成 Wire­Guard 配置文件 (wgcf-profile.conf)
wgcf generate

生成的两个文件记得备份好,尤其是 wgcf-profile.conf,万一未来工具失效、重装系统后可能还用得着。

编辑 WireGuard 配置文件

将配置文件中的节点域名 engage.cloudflareclient.com 解析成 IP。不过一般都是以下两个结果:

代码语言:javascript复制
162.159.192.1
2606:4700:d0::a29f:c001

这样做是因为后面的操作要根据 VPS 所配备的网络协议的不同去选择要连接 WARP 的节点是 IPv4 或 IPv6 协议。

IPv4 Only 服务器添加 WARP IPv6 网络支持

将配置文件中的 engage.cloudflareclient.com 替换为 162.159.192.1,并删除 AllowedIPs = 0.0.0.0/0。即配置文件中 [Peer] 部分为:

代码语言:javascript复制
[Peer]
PublicKey = bmXOC F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
AllowedIPs = ::/0
Endpoint = 162.159.192.1:2408
  • 原理:AllowedIPs = ::/0参数使得 IPv6 的流量均被 Wire­Guard 接管,让 IPv6 的流量通过 WARP IPv4 节点以 NAT 的方式访问外部 IPv6 网络。

IPv6 Only 服务器添加 WARP IPv4 网络支持

将配置文件中的 engage.cloudflareclient.com 替换为 [2606:4700:d0::a29f:c001],并删除 AllowedIPs = ::/0。即配置文件中 [Peer] 部分为:

代码语言:javascript复制
[Peer]
PublicKey = bmXOC F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
AllowedIPs = 0.0.0.0/0
Endpoint = [2606:4700:d0::a29f:c001]:2408
  • 原理:AllowedIPs = 0.0.0.0/0参数使得 IPv4 的流量均被 Wire­Guard 接管,让 IPv4 的流量通过 WARP IPv6 节点以 NAT 的方式访问外部 IPv4 网络。

双栈 WARP 全局网络置换

双栈 WARP 全局网络是指 IPv4 和 IPv6 都通过 WARP 网络的出口对外进行网络访问,实际上默认生成的 Wire­Guard 配置文件就是这个效果。不过默认的配置文件没有外部对本机 IP 访问的相关路由规则,一旦直接使用 VPS 就会直接失联,所以我们还需要对配置文件进行修改。路由规则需要添加在配置文件的 [Interface] 和 [Peer] 之间的位置,以下是路由规则示例:

代码语言:javascript复制
[Interface]
...
PostUp = ip -4 rule add from <替换IPv4地址> lookup main
PostDown = ip -4 rule delete from <替换IPv4地址> lookup main
PostUp = ip -6 rule add from <替换IPv6地址> lookup main
PostDown = ip -6 rule delete from <替换IPv6地址> lookup main
[Peer]
...
  • TIPS: 包含<>(尖括号)的部分一起替换掉,这只是为了看起来明显。

替换配置中的 IP 地址部分为 VPS 的公网 IP 地址,如果 IDC 提供的是 VPC 内网方案则需要替换为内网 IP 。像 AWS 、Azure 、Google Cloud 、Or­a­cle Cloud 等大厂都是 VPC 内网方案,内网地址一般会在网页面板有提供。如果不确定是哪种网络方案,输入 ip a | grep <公网IP地址> 看是否有显示,没有那么就说明是 VPC 内网方案。

启用 WireGuard 网络接口

代码语言:javascript复制
#将 Wire­Guard 配置文件复制到 /etc/wireguard/ 并命名为 wgcf.conf。
sudo cp wgcf-profile.conf /etc/wireguard/wgcf.conf
#开启网络接口(命令中的 wgcf 对应的是配置文件 wgcf.conf 的文件名前缀)。
sudo wg-quick up wgcf

  • 执行执行ip a命令,此时能看到名为wgcf的网络接口,类似于下面这张图:

  • 执行以下命令检查是否连通。同时也能看到正在使用的是 Cloud­flare 的网络。
代码语言:javascript复制
# IPv4 Only VPS
curl -6 ip.p3terx.com
# IPv6 Only VPS
curl -4 ip.p3terx.com

  • 测试完成后关闭相关接口,因为这样配置只是临时性的。
代码语言:javascript复制
sudo wg-quick down wgcf

正式启用 Wire­Guard 网络接口

代码语言:javascript复制
# 启用守护进程
sudo systemctl start wg-quick@wgcf
# 设置开机启动
sudo systemctl enable wg-quick@wgcf

IPv4 与 IPv6 网络优先级设置

TIPS: 仅限使用操作系统 DNS 优先级策略的应用。某科学的上网工具的的优先级取决于其内置的 DNS 策略和路由分流功能。详细信息参见《优先级设置在特殊场景中的局限性》和《某科学的上网工具 IPv4/​IPv6 分流方法》章节。

当访问的网站是双栈且服务器也是双栈,默认情况下 IPv6 优先级高于 IPv4,应用程序优先使用 IPv6 地址。

理论上应该是如下情况:

  • IPv4 Only 服务器优先通过新增的 WARP IPv6 网络去访问外部网络。
  • IPv6 Only 服务器优先通过原来的 IPv6 网络去访问外部网络。

然而 WARP 的情况有点特殊,可能与 Wire­Guard 的路由规则有关,所以现实的情况可能是:

  • IPv4 Only 服务器优先通过原来的 IPv4 网络去访问外部网络。
  • IPv6 Only 服务器优先通过原来的 IPv6 网络去访问外部网络。

如果你对于这个设定不满意,可以根据实际的需求手动去设置 IPv4 与 IPv6 的优先级。

IPv4 优先

编辑 /etc/gai.conf 文件,在末尾添加下面这行配置:

代码语言:javascript复制
precedence ::ffff:0:0/96  100

一键添加命令如下:

代码语言:javascript复制
# IPv4 优先
grep -qE '^[ ]*precedence[ ]*::ffff:0:0/96[ ]*100' /etc/gai.conf || echo 'precedence ::ffff:0:0/96  100' | sudo tee -a /etc/gai.conf

IPv6 优先

编辑 /etc/gai.conf 文件,在末尾添加下面这行配置:

代码语言:javascript复制
label 2002::/16   2

一键添加命令如下:

代码语言:javascript复制
# IPv6 优先
grep -qE '^[ ]*label[ ]*2002::/16[ ]*2' /etc/gai.conf || echo 'label 2002::/16   2' | sudo tee -a /etc/gai.conf

验证优先级

执行 curl ip.p3terx.com 命令,显示 IPv4 地址则代表 IPv4 优先,否则为 IPv6 优先。

优先级设置在特殊场景中的局限性

在 VPS 上使用某科学的上网工具时出站的 IPv4/​IPv6 优先级还取决于科学工具的 DNS 策略和分流路由策略。

比如某些路由器上的某科学的上网工具客户端不会发送域名给服务端做 DNS 解析,而是在本地直接将域名解析为 IP 并通过服务端直接向已解析的 IP 发起连接,那么可能因为路由器 DNS 屏蔽了 AAAA 记录就只会去访问 IPv4 网络。这个问题解决方法是开启某科学的上网工具服务端的流量探测 (sniff­ing) 功能,并添加相关路由规则进行分流处理,服务端会从请求数据中嗅探出域名并进行二次 DNS 解析后对网络流量进行重定向,就比如可以将本身发往网站 IPv4 服务器的流量重定向到 IPv6 服务器(前提是这个网站使用了 IPv6 地址)。

某科学的上网工具 IPv4/IPv6 分流方法

有关某科学的上网工具的 DNS 和路由分流设置有很多资料,小伙伴们可自行咕鸽搜索。每个人的需求不一样,不可能以偏概全,最好是看相关工具的文档,所以博主在这里就不多赘述了。这里推荐一篇教程:《某科学的上网工具白话文手册 - 指定出站 IP》,结合相关文档食用效果更佳。

Cloudflare WARP 网速测试

使用 speedtest.net 提供的 CLI 工具测试通过 WARP 访问外部网络的极限网速。

安装 Ookla Speedtest CLI

代码语言:javascript复制
curl -fsSL git.io/speedtest-cli.sh | sudo bash
  • 执行speedtest命令测速。

0 人点赞