(动了动发霉的身躯、阴暗的爬行)已经摸鱼两个月了,这两个月虽说没发文章,但是也一直没闲着折腾,去年立的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 &gt;= 60 )); then # 连续 60 * 10 秒(10 分钟)正常
((success_count++))
if (( success_count &gt;= 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
</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"
</pre>
执行后如图,红框里的就是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")
这张图是之前截的,为了更好理解后面我又改了一些说明文字,以实际为准。
欢迎大佬斧正,划水~划水~下次更新又不知道啥时候啦!