众所周知,Cloudflare是全球最大的CDN服务提供商之一,被视为互联网基础设施的关键组成部分。其全球性云平台覆盖互联网边缘,旨在通过安全防护、性能优化和可靠性提升,帮助企业保护网络资产并加速内容分发。Cloudflare承担了全球近20%的网络流量。但是其在国内访问的速度有时却并不是很理想。主要原因为Cloudflare使用Anycast且没有在国内部署节点,且默认分配的节点对于大陆的网络并不友好。绕道美国、跑不出速度是常有的事。但是Cloudflare并不限制用户访问的节点IP。这时候,我们就可以优选工具来帮助我们改善访问使用Cloudflare CDN的网站的体验。
这里我们使用一个由Github大佬XIU2开发的项目——CloudflareSpeedTest。
这个项目使用Go语言编写,目前(2025年7月1日)已经在Github上获得了超过22k Stars。该项目支持多平台。我们进入Release页面,选择适合的架构进行下载。
选择合适的架构进行下载,我这里选择linux_amd64架构进行下载。
接下来的操作将会使用Debian12.11(内核版本6.1.0-37-amd64)进行演示。
我们先切换至root环境,方便执行操作。
sudo -i
然后进入/usr/share目录下,创建目录CloudflareSpeedTest并进入该目录。
cd /usr/share
mkdir CloudflareSpeedTest && cd CloudflareSpeedTest
将CloudflareSpeedTest的发行版下载并解压到目录中。
wget https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.0/CloudflareST_linux_amd64.tar.gz
tar -xzvf CloudflareST_linux_amd64.tar.gz
rm CloudflareST_linux_amd64.tar.gz
如果你要加速的网站已经写在了hosts里,那么你只需要直接运行文件夹中的cfst_hosts.sh就可以了。
但是使用Cloudflare CDN的网站千千万,我们总不能把所有的与Cloudflare CDN有关的域名都添加到hosts里面。
这时候就要使用Linux上特有的神器——iptables。
众所周知,iptables可以对本机流量进行ip重定向,我们只需要将需要重定向的IP段告诉iptables就可以了。
接下来,我将写一个bash脚本来实现全自动更新IP。
本脚本灵感来自于https://github.com/XIU2/CloudflareSpeedTest/discussions/71#discussioncomment-10495648
⚠注意:在运行脚本前,请确保你的机器上已安装iptables和ipset。
apt update && apt install -y ipset iptables
在CloudflareSpeedTest目录下创建CloudflareSpeedTest.sh文件
nano CloudflareSpeedTest.sh
以下是脚本的主要内容,将其复制进入CloudflareSpeedTest.sh中
#!/bin/bash
# 定义 CloudflareST 的绝对路径
CLOUDFLAREST_PATH="/usr/share/CloudflareSpeedTest"
# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 脚本开始执行。"
# 读取上一次使用的目的 IP 地址
if [ -f "$CLOUDFLAREST_PATH/last_dst_ip.txt" ]; then
old_dst_ip=$(< "$CLOUDFLAREST_PATH/last_dst_ip.txt")
fi
# 如果存在上一次的 IP 地址,则删除旧的 OUTPUT 规则
if [ -n "$old_dst_ip" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除旧的 OUTPUT 规则,目标 IP 为 $old_dst_ip。"
iptables -t nat -D OUTPUT -m set --match-set cf dst -j DNAT --to-destination "$old_dst_ip" 2>/dev/null
fi
# 运行 CloudflareST 测速,结果会写入 result.csv
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 运行 CloudflareST 进行测速。"
"$CLOUDFLAREST_PATH/CloudflareST" -url https://speed.cloudflare.com/__down?bytes=500000000 -f /usr/share/CloudflareSpeedTest/ip.txt -o /usr/share/CloudflareSpeedTest/result.csv
# 从 result.csv 中提取第二行的 IP 地址
dst_ip=$(sed -n '2p' "$CLOUDFLAREST_PATH/result.csv" | cut -d',' -f1)
# 检查 dst_ip 是否有效
if ! [[ "$dst_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:未能提取到有效的目的 IP 地址。"
exit 1
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 提取到的目的 IP 地址为 $dst_ip。"
# 创建或刷新名为 cf 的 IP 集合
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 创建或刷新 IP 集合 cf。"
ipset -exist create cf hash:net
# 清空集合 cf 中的所有现有条目
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清空 IP 集合 cf。"
ipset flush cf
# 读取 ip.txt 中的 IP 地址或子网,并添加到集合中
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 读取并添加 IP 地址到集合 cf 中。"
for i in $(grep -oE "[0-9\.\/]+" "$CLOUDFLAREST_PATH/ip.txt"); do
ipset add cf "$i"
done
# 插入新的 OUTPUT 规则(仅针对本机出站流量)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 添加新的 OUTPUT 规则,目标 IP 为 $dst_ip。"
iptables -t nat -I OUTPUT -m set --match-set cf dst -j DNAT --to-destination "$dst_ip"
# 保存当前的目的 IP 地址以备下次使用
echo "$dst_ip" > "$CLOUDFLAREST_PATH/last_dst_ip.txt"
# 记录结束时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 脚本执行完成。"
粘贴完成后按下Ctrl+X→Y→Enter退出。
为脚本赋予可执行权限。
chmod +x CloudflareSpeedTest.sh
添加 MASQUERADE(确保转发流量使用本机 IP 作为源地址),记得将命令中的enp1s0替换为实际网卡名称。
iptables -t nat -I POSTROUTING -o enp1s0 -j MASQUERADE
运行脚本进行测试。
bash ./CloudflareSpeedTest.sh
运行结束后进行检验。
iptables -t nat -L -n
若成功应输出类似结果。
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DNAT 0 -- 0.0.0.0/0 0.0.0.0/0 match-set cf dst to:172.64.159.120
接下来为了使脚本定时运行,我们先创建一个systemd服务。
nano /etc/systemd/system/cloudflare.service
在其中粘贴以下内容。
[Unit]
Description=Cloudflare
After=network.target
[Service]
WorkingDirectory=/usr/share/CloudflareSpeedTest
ExecStart=/usr/share/CloudflareSpeedTest/CloudflareSpeedTest.sh
User=root
Type=simple
Restart=no
[Install]
WantedBy=multi-user.target
粘贴完成后按下Ctrl+X→Y→Enter退出。
如果要使脚本开机时运行,输入如下命令。
systemctl enable cloudflare
如果要重新运行脚本。
systemctl restart cloudflare
如果需要定时运行该脚本,我们需要创建一个定时任务。
crontab -e
首次运行可能需要选择编辑器,按照喜好任选1、2、3即可。
进入后在文件最末尾写入定时任务命令。
比如我需要服务器时间每天19:30运行该脚本。
30 19 * * * /usr/bin/systemctl restart cloudflare
写入后保存退出即可。
以上就是教程的全部内容了,有疑问可以在评论区评论,感谢您的阅读。