51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

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

一、脚本功能 {#h-一-脚本功能}

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

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


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


二、应用场景 {#h-二-应用场景}

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

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

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

三、需要准备 {#h-三-需要准备}

1、接入到CF的域名。

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

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

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

四、操作步骤 {#h-四-操作步骤}

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 &amp;gt;= 60 )); then  # 连续 60 * 10 秒(10 分钟)正常

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

sleep 10

done } 备用 IP 切换检查事件 function backup_ip_switch_check() { echo &quot;等待一分钟后,检查主站是否恢复正常。&quot; sleep 60 if check_site_status &quot;$MainURL&quot;; then echo &quot;主站已恢复正常,保留备用 IP。开始后台检查主IP是否正常,若无异常10分钟将切换回主IP。&quot; return 0 # 主站恢复正常,保留备用 IP else echo &quot;主站仍然异常,切换到下一个备用 IP。&quot; return 1 # 切换到下一个备用 IP fi } 持续运行检查 while true; do if check_site_status &quot;$MainURL&quot;; then echo &quot;主站正常,等待10秒再检查一次。&quot; sleep 10 else echo &quot;主站异常,进入主 IP 失败事件。&quot; for backup_ip in &quot;${BackupIPs[@]}&quot;; do switch_ip &quot;$backup_ip&quot; if backup_ip_switch_check; then main_ip_failure_check break fi done echo &quot;所有备用 IP 均未使主站恢复正常,结束脚本,请检查备用IP是否可用。&quot; exit 1 fi done </pre> ` 其中, 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"

          &lt;/pre&gt;

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

![Cloudflare使用API自动检测网站健康度并切换DNS解析插图-zyq.today](http://static.51tbox.com/static/2024-12-21/col/b9be1997db20a41a32dedf290b2b60da/0fbeb41c15064ae08ed62c59056792a5.jpg "Cloudflare使用API自动检测网站健康度并切换DNS解析插图-zyq.today")

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

<br />

五、实际效果 {#h-五-实际效果}

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

![Cloudflare使用API自动检测网站健康度并切换DNS解析插图1-zyq.today](http://static.51tbox.com/static/2024-12-21/col/b9be1997db20a41a32dedf290b2b60da/44ceaf3423c748adaa2e46678a22bb02.jpg "Cloudflare使用API自动检测网站健康度并切换DNS解析插图1-zyq.today")

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

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

赞(1)
未经允许不得转载:工具盒子 » Cloudflare使用API自动检测网站健康度并切换DNS解析