CF优选IP Linux版一键脚本:自动测速 + 自动更新最快Cloudflare IP到域名(支持DDNS)

今天带来功能更强大的 Linux 一键脚本!它不仅能自动测试 Cloudflare 全球 IP 的下载速度,还能将最快的 IP 自动解析到你的域名,实现真正的“智能优选 + 动态 DNS 更新”。

特别适合部署在 需要套 Cloudflare 的源站服务器 上(例如自建网站、反代节点、游戏服务器等),让访问者始终通过最优路径连接你的服务。

⚠️ 重要前提:此脚本必须部署在你实际提供服务的那台 Linux 服务器上(即 Cloudflare 所代理的源站),因为测速结果会因地理位置不同而差异巨大。在本地电脑或非目标服务器上运行,结果无效!

🚀 一键实现两大功能

  1. 自动测速:使用 cfst(CloudflareSpeedTest)对数百个 CF IP 进行并发测速;
  2. 自动更新 DNS:将速度最快的 IP 通过 Cloudflare API 写入你的域名 A 记录。

📦 安装与部署步骤

官方项目地址:XIU2/CloudflareSpeedTest

# 如果是第一次使用,则建议创建新文件夹(后续更新时,跳过该步骤)
mkdir cfst

# 进入文件夹(后续更新,只需要从这里重复下面的下载、解压命令即可)
cd cfst

# 下载 CFST 压缩包(自行根据需求替换 URL 中 [版本号] 和 [文件名])
wget -N https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
# 如果你是在国内网络环境中下载,那么请使用下面这几个镜像加速之一:
# wget -N https://ghfast.top/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_arm64.tar.gz
# wget -N https://wget.la/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_arm64.tar.gz
# wget -N https://ghproxy.net/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_arm64.tar.gz
# wget -N https://gh-proxy.com/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_arm64.tar.gz
# wget -N https://hk.gh-proxy.com/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_arm64.tar.gz
# 如果下载失败的话,尝试删除 -N 参数(如果是为了更新,则记得提前删除旧压缩包 rm cfst_linux_amd64.tar.gz )

# 解压(不需要删除旧文件,会直接覆盖,自行根据需求替换 文件名)
tar -zxf cfst_linux_amd64.tar.gz

# 赋予执行权限
chmod +x cfst

# 运行(不带参数)
./cfst

# 运行(带参数示例)
./cfst -tl 200 -dn 20

 

🔑 配置 Cloudflare API 权限

  1. 登录 Cloudflare 控制台
  2. 进入 My Profile → API Tokens
  3. 点击 Create Token → 选择模板 Edit zone DNS
  4. 权限范围:仅勾选你要操作的域名;
  5. 生成后,复制 API Token(不是 Global API Key!);
  6. 同时记下该域名的 Zone ID(在域名 Overview 页面底部)。

📝 创建自动化脚本

↓↓↓↓↓↓↓↓↓↓重点是接下来的部分↓↓↓↓↓↓↓↓↓↓

  1. 在解压的文件里面,新建一个sh文件,名字随便,我这边用run_cf_ddns.sh演示
  2. 填入以下代码
  3. 需要修改的内容都在配置信息里面
API_TOKEN # Cloudflare API Token,必须有 Zone.DNS:Edit 权限
ZONE_ID # Cloudflare Zone ID
RECORD_NAME # 要更新的域名

 

记得给文件添加可执行权限,chmod 777 run_cf_ddns.sh,然后运行看看效果./run_cf_ddns.sh

运行成功的话,效果如下图

图片[1]-CF优选IP Linux版一键脚本:自动测速 + 自动更新最快Cloudflare IP到域名(支持DDNS)-VPS SO

#!/bin/bash

# ================= 配置信息 =================
API_TOKEN=""
ZONE_ID=""
RECORD_NAME=""
SPEED_URL="https://testfileorg.netwet.net/500MB-CZIPtestfile.org.zip"

# cfst 参数优化
CFST_PARAMS="-n 300 -t 4 -dn 10 -dt 15 -tp 443 -url $SPEED_URL -httping -tl 250 -tlr 0.00 -sl 5 -o result.csv"
# ============================================

# 获取脚本所在绝对路径
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
cd "$BASE_DIR" || exit 1
RESULT_FILE="$BASE_DIR/result.csv"

echo "--- 任务开始: $(date '+%Y-%m-%d %H:%M:%S') ---"

# 1. 环境清理
[ -f "$RESULT_FILE" ] && rm -f "$RESULT_FILE"

# 2. 执行测速 (同步阻塞)
if [ -f "./cfst" ]; then
    echo "[步骤1/4] 正在运行 cfst 测速..."
    chmod +x ./cfst
    ./cfst $CFST_PARAMS
else
    echo "错误: 目录下未找到 cfst 执行文件"
    exit 1
fi

# 3. 结果校验与提取
sleep 1
if [ ! -s "$RESULT_FILE" ]; then
    echo "错误: 测速失败,未生成有效的 result.csv"
    exit 1
fi

# 提取最优 IP 和 速度 (假设 IP 在第 1 列,速度在第 6 列)
# 使用 awk 直接读出这两个值
READ_DATA=$(awk -F, 'NR==2 {print $1,$6}' "$RESULT_FILE")
read -r IP SPEED <<< "$READ_DATA"

# --- 核心判断:速度校验 ---
# 如果速度为空或小于等于 0.01 MB/s 则跳过更新
CHECK_RESULT=$(echo "$SPEED" | awk '{if($1 <= 0.01) print "stop"; else print "go"}')

if [ "$CHECK_RESULT" == "stop" ] || [ -z "$IP" ]; then
    echo "------------------------------------------------"
    echo "停止更新: 本次最优 IP 的下载速度仅为 $SPEED MB/s。"
    echo "原因: 速度接近 0 或测速无效,保持原 DNS 解析不变。"
    echo "------------------------------------------------"
    exit 0
fi

echo "[步骤2/4] 测速通过!最优 IP: $IP, 速度: $SPEED MB/s"

# 4. 更新 Cloudflare (修正了导致错误的语法结构)
echo "[步骤3/4] 正在获取 Record ID..."

# 使用反斜杠 \ 确保 curl 命令的长行换行被正确识别
RECORD_INFO=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \
     -H "Authorization: Bearer $API_TOKEN" \
     -H "Content-Type: application/json")

# 提取 ID
RECORD_ID=$(echo "$RECORD_INFO" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' | head -n 1)

if [ -z "$RECORD_ID" ] || [ ${#RECORD_ID} -lt 10 ]; then
    echo "错误: 无法获取 Record ID。"
    echo "API 返回内容: $RECORD_INFO"
    exit 1
fi

echo "[步骤4/4] 正在同步 DNS 记录..."
UPDATE_RES=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
     -H "Authorization: Bearer $API_TOKEN" \
     -H "Content-Type: application/json" \
     --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$IP\",\"ttl\":60,\"proxied\":false}")

if [[ "$UPDATE_RES" == *"\"success\":true"* ]]; then
    echo "=========================================="
    echo "  更新成功!"
    echo "  域名: $RECORD_NAME"
    echo "  地址: $IP ($SPEED MB/s)"
    echo "=========================================="
else
    echo "更新失败!API 原始返回:"
    echo "$UPDATE_RES"
    exit 1
fi

🔁 定时自动运行(推荐)

你可以通过 cron 每小时自动执行一次优选:

# 编辑定时任务
crontab -e

# 添加一行(每2小时运行一次,路径请替换为你的实际路径)
0 */2 * * * /root/cfst/run_cf_ddns.sh >> /root/cfst/cf_ddns.log 2>&1

💡 注意事项

  • 脚本默认使用 https://testfileorg.netwet.net/500MB-CZIPtestfile.org.zip 作为测速文件,你也可以替换为其他稳定的大文件;
  • 若测速结果普遍低于 0.01 MB/s,脚本会自动跳过更新,避免误切到劣质 IP;
  • 确保服务器能正常访问 Cloudflare API(api.cloudflare.com);
  • 首次运行前务必检查 API_TOKENZONE_IDRECORD_NAME 是否正确。

🎉 结语

有了这个脚本,再也不用担心 Cloudflare 分配的 IP 质量差了!无论是搭建网站、反代服务还是上网中转,都能获得更稳定的网络体验。

如果你觉得有用,欢迎点赞、收藏、转发!也欢迎在评论区分享你的优化建议或适配的商家列表~

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享