Cloudflare使用API自动检测网站健康度并切换DNS解析

(动了动发霉的身躯、阴暗的爬行)已经摸鱼两个月了,这两个月虽说没发文章,但是也一直没闲着折腾,去年立的flag今年兑现了,目前新网站已经有千余名注册用户,随着用户量增加各种奇怪的问题也自然而然就多了起来,感觉最近折腾的程度堪比前几年之和(并不),废话不多说,更多内容以后有时间再更新,先讲一讲今天摸鱼写的脚本(搜过其他项目,就这么一个简单的需求大佬们用什么语言实现的都有,属实是看不明白也用不起),萌新写着玩的,如有问题欢迎大佬们指正,感激不尽!

一、脚本功能

1、检测域名是否能正常访问。

2、域名访问异常则切换DNS到备用IP。

3、主IP恢复后切回主IP。

二、应用场景

喜欢(或者不得不)使用A解析的情况下,兼顾安全,防止CC、DDOS攻击。

因为我服务器是用的是GIA线路,为了保证吃满GIA速度上的优势,所以决定裸奔。

但是亲测CC或者DD就会被拉满带宽或者IP进入黑洞,这就很烦,所以写了这么个脚本,可以在受到攻击时临时切换解析到SCDN节点进行防御。

三、需要准备

1、接入到CF的域名。

2、一台服务器两个IP(裸露的IP+SCDN后的IP,当然你多台服务器或者其他原因也行,具体看你自己)。

3、其中一个IP需要接入SCDN进行防御,我这里使用的是酷盾安全。当然你直接使用CF的CDN也没问题,但是代码可能要改改,如果有人需要又不会自己改可以给我留言,有空更新一下。

4、另一台用来执行SH脚本的服务器。

四、操作步骤

1、先将用来执行SH脚本的服务器IP加到主域名服务器和CDN的白名单,避免检查失败。

2、新增一个解析到主服务器,子域名随便起,可以是test.zyq.today这样,A记录解析到主服务器裸露在外的IP,用来检查存活。

如果你用的是宝塔面板直接新建一个站点即可,不需要数据库和php,记得配好证书,自己能正常访问即可,页面内容随意。

3、新建文件,命名为status.sh,记住路径。

4、复制下面内容,保存,接下来我会讲这些参数怎么写。

# 发布:https://zyq.today/

# 主 IP 地址和备用 IP 地址列表
MainIP="主IP"
BackupIPs=("备用IP1" "备用IP2" "增加备用IP以此类推")
MainURL="主域名"
SubDomain="子域名前缀"
CheckURL="解析到主IP的检查用域名"

# Cloudflare API 认证信息
AuthEmail="你的CF账号"
AuthKey="你的CF密钥"
ZoneID="域名ID"
RecordID="DNS的ID"

# 检查网站状态
function check_site_status() {
    local url="$1"
    local status_code=$(curl -o /dev/null -m 5 --connect-timeout 5 -s -w "%{http_code}" "$url")
    local response_time=$(curl -o /dev/null -m 5 --connect-timeout 5 -s -w "%{time_total}" "$url")
    if [[ $status_code -ge 200 && $status_code -lt 308 && $(echo "$response_time < 5" | bc -l) -eq 1 ]]; then
        return 0  # 网站正常
    else
        return 1  # 网站异常
    fi
}

# 切换 IP 地址
function switch_ip() {
    local ip="$1"
    local result=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZoneID/dns_records/$RecordID" \
        -H "X-Auth-Email: $AuthEmail" \
        -H "X-Auth-Key: $AuthKey" \
        -H "Content-Type: application/json" \
        --data "{\"type\":\"A\",\"name\":\"$SubDomain\",\"content\":\"$ip\",\"proxiable\":true,\"proxied\":false,\"ttl\":1}")
    echo "$result"
}

# 主 IP 死亡检查事件
function main_ip_failure_check() {
    local success_count=0
    local consecutive_success=0
    
    while true; do
        if check_site_status "$CheckURL"; then
            ((consecutive_success++))
        else
            consecutive_success=0
        fi
        
        if (( consecutive_success >= 60 )); then  # 连续 60 * 10 秒(10 分钟)正常



         ((success_count++))
            if (( success_count >= 10 )); then  # 连续 10 次检查都正常
                echo "主IP解析的检查域名连续 10 分钟访问正常,主IP可能已经恢复,切换回主 IP。"
                switch_ip "$MainIP"
                echo "恢复正常,重启脚本。"
                exec "$0" "$@"  # 重新启动脚本
            fi
        fi
        
        sleep 10
    done
}

# 备用 IP 切换检查事件
function backup_ip_switch_check() {
    echo "等待一分钟后,检查主站是否恢复正常。"
    sleep 60
    if check_site_status "$MainURL"; then
        echo "主站已恢复正常,保留备用 IP。开始后台检查主IP是否正常,若无异常10分钟将切换回主IP。"
        return 0  # 主站恢复正常,保留备用 IP
    else
        echo "主站仍然异常,切换到下一个备用 IP。"
        return 1  # 切换到下一个备用 IP
    fi
}

# 持续运行检查
while true; do
    if check_site_status "$MainURL"; then
        echo "主站正常,等待10秒再检查一次。"
        sleep 10
    else
        echo "主站异常,进入主 IP 失败事件。"
        for backup_ip in "${BackupIPs[@]}"; do
            switch_ip "$backup_ip"
            if backup_ip_switch_check; then
                main_ip_failure_check
                break
            fi
        done
        echo "所有备用 IP 均未使主站恢复正常,结束脚本,请检查备用IP是否可用。"
        exit 1
    fi
done

其中,

MainIP是你要裸露在外面的IP,例子:MainIP=”11.4.51.4″。

BackupIPs是备用IP,例子:BackupIPs=(“11.4.51.1” “11.4.51.2” “11.4.51.3” “以此类推”) 注意空格和中英文符号。

MainURL是要用来检测的主域名,例子:”MainURL=”https://zyq.today”。

SubDomain是子域名前缀”,例子:SubDomain=”blog”,如果你用@作解析的话,那么应将上面代码中 name 参数的值从 $SubDomain 更改为 $MainURL 。

CheckURL是上面提到的解析到主IP的检查用域名,例子:CheckURL=”https://test.zyq.today”。

AuthEmail是你注册CF用的邮箱,例子:AuthEmail=”admin@zyq.today”。
AuthKey是你的CF密钥,在CF控制面板右上角——我的个人主页——API 令牌——API 密钥——Global API Key——查看。
ZoneID是域名ID,CF控制面板点击你的域名进入,右下角就有 :API 区域 ID 。jabvjavnkakvninbvioanavj 单击以复制,没错,复制就行了。
RecordID是你域名DNS的ID,这个ID每次更改解析类型、删除重建等操作都会重置,因此这个脚本不支持备用记录改为CNAME,而只能通过手动解析到SCDN节点完成。

怎么获取?在任意终端运行下面指令即可,记得修改对应的参数。

curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZoneID/dns_records" \
     -H "X-Auth-Email: $AuthEmail" \
     -H "X-Auth-Key: $AuthKey" \
     -H "Content-Type: application/json"

执行后如图,红框里的就是RecordID。

Cloudflare使用API自动检测网站健康度并切换DNS解析插图-zyq.today

5、配置好后,用来SH的服务器终端执行:/bin/bash 你的脚本路径  例子:/bin/bash /root/status.sh

五、实际效果

下图为一次主IP宕机切换后,且前几次备选依然失败,最终恢复后切换到主IP的示例。

Cloudflare使用API自动检测网站健康度并切换DNS解析插图1-zyq.today

这张图是之前截的,为了更好理解后面我又改了一些说明文字,以实际为准。

欢迎大佬斧正,划水~划水~下次更新又不知道啥时候啦!

文末未特别声明时,以下内容有效。
本文标题:Cloudflare使用API自动检测网站健康度并切换DNS解析
本文作者:Zephyrus
本文链接:https://zyq.today/archives/183406
版权声明:本站采用 BY-NC-SA 进行许可。转载请注明出处!

评论

  1. 揽星
    Windows Chrome
    江苏省盐城市 移动
    5 月前
    2024-5-11 11:45:51

    失踪人口回归了?

    • 博主
      揽星
      Android Chrome
      辽宁省沈阳市 移动
      5 月前
      2024-5-11 11:47:32

      最近几个月真的很忙 现在网站运行趋于稳定没那么多事了才有点闲下来

      • Zephyrus
        Windows Chrome
        江苏省盐城市 移动
        5 月前
        2024-5-11 11:53:21

        新网站已经有千余名注册用户。我是错过了什么内容嘛,我记得你之前说搞个网站好像是洛天依的,那这个新网站是啥

        • 博主
          揽星
          Android Chrome
          辽宁省沈阳市 移动
          5 月前
          2024-5-11 11:55:12

          就是一个天依的论坛,不过现在域名已经不在我手里啦,转移到我朋友的cf那里了,我现在是副站长了

  2. Macintosh Chrome
    山东省青岛市 联通
    5 月前
    2024-5-11 9:54:45

    所以也就是 cf 优选了呗?

    • 博主
      obaby
      Android Chrome
      辽宁省沈阳市 移动
      5 月前
      2024-5-11 11:30:11

      不是的哦,cf优选有一个前提就是域名不能在cf,需要域名saas接入

      • Zephyrus
        Macintosh Chrome
        山东省青岛市 联通
        5 月前
        2024-5-11 15:25:00

        酱紫

  3. Windows Edge
    河南省漯河市 联通
    5 月前
    2024-5-11 1:32:04

    什么站点啊 千人注册不少了啊

    • 博主
      网友小宋
      Android Chrome
      辽宁省沈阳市 移动
      5 月前
      2024-5-11 1:43:55

      是个小圈子的论坛

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
😍
😘
😜
😝
😏
😒
🙄
😳
😔
😫
😱
😭
😶
🌚
😣
🤨
😣
🤐
😪
🤤
🥵
🤮
😨
😱
😓
🤬
👴
🤡
🙈
💊
🙏
🤺
💩
👻
🙌
🖕
👍
👫
👌
🙏
👀
🐒
🔪
UID: 503262632
bilibili
颜文字
Emoji
genshin
小恐龙
amashiro.natsuki
上一篇
下一篇