(动了动发霉的身躯、阴暗的爬行)已经摸鱼两个月了,这两个月虽说没发文章,但是也一直没闲着折腾,去年立的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。

5、配置好后,用来SH的服务器终端执行:/bin/bash 你的脚本路径 例子:/bin/bash /root/status.sh
五、实际效果
下图为一次主IP宕机切换后,且前几次备选依然失败,最终恢复后切换到主IP的示例。

这张图是之前截的,为了更好理解后面我又改了一些说明文字,以实际为准。
欢迎大佬斧正,划水~划水~下次更新又不知道啥时候啦!









失踪人口回归了?
最近几个月真的很忙
现在网站运行趋于稳定没那么多事了才有点闲下来
新网站已经有千余名注册用户。我是错过了什么内容嘛,我记得你之前说搞个网站好像是洛天依的,那这个新网站是啥
就是一个天依的论坛,不过现在域名已经不在我手里啦,转移到我朋友的cf那里了,我现在是副站长了
所以也就是 cf 优选了呗?
不是的哦,cf优选有一个前提就是域名不能在cf,需要域名saas接入
酱紫
什么站点啊 千人注册不少了啊
是个小圈子的论坛