前言
WARP 是 Cloudflare 提供的一项基于 WireGuard 的网络流量安全及加速服务,能够让你通过连接到 Cloudflare 的边缘节点实现隐私保护及链路优化。之前有很多小伙伴拿来当做某科学的上网工具来使用,应该很熟悉了。不过由于 WireGuard 数据传输使用的 UDP 协议,中国大陆运营商会对其进行 QoS ,加上多数 IP 被封锁,现在可以说几乎处于不可用的状态了。而对于自由网络的地区来说没有这些限制,加上有国外开发者制作的工具可以生成通用的 WireGuard 配置文件,这使得我们可以在海外 VPS 上部署并获得如下效果加成:
- WARP 网络出入口均为双栈 (IPv4/IPv6),因此单栈服务器可以连接到 WARP 来获取额外的网络连通性支持:
- IPv6 Only VPS 可获得 IPv4 网络的访问能,不再局限于 DNS64 的束缚,能自定义任意 DNS 解析服务器。对使用某科学的上网工具有奇效。
- IPv4 Only VPS 可获得 IPv6 网络的访问能力,可作为 IPv6 Only VPS 的 SSH 跳板。此外 WARP 的 IPv6 网络的质量比 HE IPv6 Tunnel Broker 甚至自带的都要好,很少绕路。
- WARP 对外访问网络的 IP 被很多网站视为真实用户,即所谓的 “原生” IP,可以解除某些网站基于 IP 的封锁限制:
- 解锁 Netflix 非自制剧
- 跳过 Google 验证码
- 解除 Google 学术访问限制
- 解除 YouTube Premium 定位漂移和地区限制
TIPS: 需要注意的是 WARP 并不提供公网 IP 地址,它是以 NAT 的方式去访问外部网络,即只能用于对外网络访问,不能用于对 VPS 本机访问。如果你的需求是要一个可供访问 VPS 的公网 IPv6 地址,那么可以使用 HE IPv6 Tunnel Broker 。
使用 wgcf 生成 WireGuard 配置文件
wgcf 是 Cloudflare WARP 的非官方 CLI 工具,它可以模拟 WARP 客户端注册账号,并生成通用的 WireGuard 配置文件。
- 安装 wgcf
curl -fsSL git.io/wgcf.sh | sudo bash
- 注册 WARP 账户 (将生成
wgcf-account.toml
文件保存账户信息)wgcf register
- 生成 WireGuard 配置文件 (
wgcf-profile.conf
)wgcf generate
生成的两个文件记得备份好,尤其是 wgcf-profile.conf
,万一未来工具失效、重装系统后可能还用得着。
编辑 WireGuard 配置文件
将配置文件中的节点域名 engage.cloudflareclient.com
解析成 IP。不过一般都是以下两个结果:
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]
部分为:
[Peer]
PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
AllowedIPs = ::/0
Endpoint = 162.159.192.1:2408
原理:
AllowedIPs = ::/0
参数使得 IPv6 的流量均被 WireGuard 接管,让 IPv6 的流量通过 WARP IPv4 节点以 NAT 的方式访问外部 IPv6 网络。
此外配置文件中默认的 DNS 是 1.1.1.1
,博主实测其延迟虽然很低,但解析结果并不理想。由于它将替换掉系统中的 DNS 设置 (/etc/resolv.conf
),建议小伙伴们请根据实际情况来进行替换,或者直接删除 DNS 这行。以下配置供参考:
DNS = 8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844
IPv6 Only 服务器添加 WARP IPv4 网络支持
将配置文件中的 engage.cloudflareclient.com
替换为 [2606:4700:d0::a29f:c001]
,并删除 AllowedIPs = ::/0
。即配置文件中 [Peer]
部分为:
[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 的流量均被 WireGuard 接管,让 IPv4 的流量通过 WARP IPv6 节点以 NAT 的方式访问外部 IPv4 网络。
此外配置文件中默认的 DNS 是 1.1.1.1
,由于是 IPv4 地址,故查询请求会经由 WARP 节点发出。由于它将替换掉系统中的 DNS 设置 (/etc/resolv.conf
),为了防止当节点发生故障时 DNS 请求无法发出,建议替换为 IPv6 地址的 DNS 优先,或者直接删除 DNS 这行。以下配置供参考:
DNS = 2001:4860:4860::8888,2001:4860:4860::8844,8.8.8.8,8.8.4.4
双栈 WARP 全局网络置换
双栈 WARP 全局网络是指 IPv4 和 IPv6 都通过 WARP 网络对外进行网络访问,实际上默认生成的 WireGuard 配置文件就是这个效果。由于默认的配置文件没有外部对 VPS 本机 IP 网络访问的相关路由规则,一旦直接使用 VPS 就会直接失联,所以我们还需要对配置文件进行修改。路由规则需要添加在配置文件的 [Interface]
和 [Peer]
之间的位置,以下是路由规则示例:
[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 。很多大厂都是 VPC 内网方案,比如 GCP 、AWS 等,内网地址一般会在网页面板有提供。如果不确定是哪种网络方案,输入 ip a | grep <公网IP地址>
看是否有显示,没有那么就说明是 VPC 内网方案。
启用 WireGuard 网络接口
- 将 WireGuard 配置文件复制到
/etc/wireguard/
并命名为wgcf.conf
。sudo cp wgcf-profile.conf /etc/wireguard/wgcf.conf
- 开启网络接口(命令中的
wgcf
对应的是配置文件wgcf.conf
的文件名前缀)。sudo wg-quick up wgcf
执行执行ip a
命令,此时能看到名为wgcf
的网络接口:
执行以下命令检查是否连通。同时也能看到正在使用的是 Cloudflare 的网络。
# IPv4 Only VPS
curl -6 www.cloudflare.com
# IPv6 Only VPS
curl -4 www.cloudflare.com
- 测试完成后关闭相关接口,因为这样配置只是临时性的。
sudo wg-quick down wgcf
- 正式启用 WireGuard 网络接口
# 启用守护进程 sudo systemctl start wg-quick@wgcf # 设置开机启动 sudo systemctl enable wg-quick@wgcf
IPv4 与 IPv6 网络优先级设置
TIPS: 优先级不是一定要设置的,这仅限于 VPS 本身对外发起的网络请求。使用某科学的上网工具不一定有效,建议使用工具内置的路由分流功能。
当访问的网站是双栈且服务器也是双栈,默认情况下 IPv6 优先级高于 IPv4,应用程序优先使用 IPv6 地址。
理论上应该是如下情况:
- IPv4 Only 服务器优先通过新增的 WARP IPv6 网络去访问外部网络。
- IPv6 Only 服务器优先通过原来的 IPv6 网络去访问外部网络。
然而 WARP 的情况有点特殊,现实的情况有可能是:
- IPv4 Only 服务器优先通过原来的 IPv4 网络去访问外部网络。
- IPv6 Only 服务器优先通过原来的 IPv6 网络去访问外部网络。
所以根据实际的需求就要手动去设置优先级。
IPv4 优先
编辑 /etc/gai.conf
文件,在末尾添加下面这行配置:
precedence ::ffff:0:0/96 100
一键添加命令如下:
# 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
文件,在末尾添加下面这行配置:
label 2002::/16 2
一键添加命令如下:
# 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 上使用某科学的上网工具,则还取决于科学工具的 DNS 策略和分流路由策略。
最需要注意的是某些路由器上的某科学的上网工具客户端不会发送域名给服务端,而是在本地直接将域名解析为 IP 并通过服务端直接向 IP 发起连接,那么可能因为屏蔽了 AAAA 记录,就只会去访问 IPv4 网络。这个问题解决方法是开启某科学的上网工具服务端的流量探测 (sniffing) 功能,并添加相关路由进行 IP 分流处理,它会从数据中嗅探出域名并进行二次 DNS 解析后对网络流量进行重定向,就比如可以将本身发往网站 IPv4 服务器的流量重定向到 IPv6 服务器。
尾巴
Cloudflare 一直以来为广大人民群众免费提供优秀的网络服务,希望大家善待它,不要肆意滥用。