Cloudflare是全球排名前三的CDN服务商,还拥有自己的DNS解析公共服务器,1.1.1.1,以及1.0.01。

如果将域名放在Cloudflare上做解析,可以免费享受CF在全球的CDN(内容分发)服务。当然,总量限制。

对梯子来说,CDN会成为自建VPS和国内使用者之间的桥梁。翻墙时,流量从国内先到CDN服务器,然后再到VPS。国内运营商无法侦知VPSIP,也不可能将类似CF这样的CDN厂商的服务器IP全部封禁。于是,套CDN成为救活封禁IP的方法之一。

仅仅救活还不行,CDN的好处是离访问者更近。通过CDN转发梯子流量,能够有效提高翻墙速度。缺点当然也有,免费CDN在高峰期的延时会急剧升高。

不过,在我的测试中,可以找到高峰期延迟在100ms以下的优选IP。

通过指定CF的优选IP,访问梯子,要比CF自动分配的IP,效果好很多。

这里需要用到github上的一个开源项目:Cloudflare Speed Test。项目更新度不错,命令行也很简单。https://github.com/XIU2/CloudflareSpeedTest

具体使用方式,github上有说明。

我实践的结果,选择了一些自定义参数,并通过脚本实现自动更新IP,全程无人值守。

首先是IP段。

Cloudflare Speed Test项目自带CF ip段。5000多个ip地址,不可能全部排查。Cloudflare Speed Test的原理是每个段随机选一个IP出来做测试。

运行一遍之后,大概就会筛选出几个比较快的IP地址段。将这些IP段放入新建的文本文件中。比如我这里,172、162开头的IP段,延迟比较低。

172.64.0.0/17
172.64.128.0/18
172.64.192.0/19
172.64.224.0/22
172.64.229.0/24
172.64.230.0/23
172.64.232.0/21
172.64.240.0/21
172.64.248.0/21
172.65.0.0/16
172.66.0.0/16
172.67.0.0/16
162.158.0.0/15

ip地址段文件写成这样即可。

然后测速。

./CloudflareST -f 162172ip.txt -url https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/alpha/install73.iso -t 20 -o 162172results.csv

这条命令中:
-f 代表输入文件
-t 代表次数
-url 后面是测速网址。我使用了openbsd在CF的免费测速网址,无需自己再行搭建
-o 测速结果文件

将适合自己的IP段逐渐缩小范围后,还可以加上另一个参数:-allip

-allip 顾名思义,会测试IP段中的每一个IP。

这样测速后,收获一批和本地运营商匹配的CDN IP。

给梯子套CDN的逻辑不复杂。访问CDN IP,在梯子的客户端配置中,标明sni参数。sni代表请求访问的目标域名。设置好之后,CDN服务器收到请求,自然知道将流量转发到哪里去。

由于IP地址经常变动,自动更新客户端配置,显然不现实。所以,更简单全自动的方法,是通过域名来实现。

假设自有域名abc.xyz,准备使用4个CDN IP来轮换。可以在CF中添加4个DNS记录:1.abc.xyz,2.abc.xyz,3.abc.xyz,4.abc.xyz。然后使用脚本远程更新DNS记录。

梯子客户端的配置文件,复制4份,依次修改每份服务器名为上面4个。全自动设置优选IP即可实现。

脚本需要调用CF的API,取得DNS zone的id,每个dns记录的ID。

zone id就在dashboard页面的右下方。
WX20240318-155435@2x

点击“Get your API token”
获取API auth key。

有了这两个东西,即可在命令行中查询具体的dns记录对应的ID。

curl -X GET "https://api.cloudflare.com/client/v4/zones/你的zoneid/dns_records" \
     -H "X-Auth-Email:你的邮件地址" \
     -H "X-Auth-Key:你的auth key"

命令结果是一大堆记录,每个域名后面有dns record对应的hash 值。这样远程更新的时候,才不会错。

脚本示例:
以1、2、3、4个域名为例

#!/bin/bash
c1="1的服务器记录"
c2="2的服务器记录"
c3="3的服务器记录"
c4="4的服务器记录"
rundir="cloudflarespeedtest安装目录"

"$rundir"CloudflareST -f "$rundir"IP地址段.txt -t 20 -allip -url https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/alpha/install73.iso -o "$rundir"ip地址段.csv

for n in {1..4}
do
        ip=$(cat "$rundir"ip地址段.csv | sed -n "${n}p" | awk -F, '{print $1}')
        r=$(eval echo '$'"c$n")
#       echo $ip+$r
        curl -X PUT "https://api.cloudflare.com/client/v4/zones/你的zoneid/dns_records/$r" \
                -H "X-Auth-Email:你的邮件地址" \
                -H "X-Auth-Key:你的auth key" \
                -H "Content-Type: application/json" \
                --data "{\"type\":\"A\",\"name\":\"c$n.nbhd.cloud\",\"content\":\"$ip\",\"ttl\":1,\"proxied\":false}"
done

定时运行这个任务,即可自动更新优选IP。