(动了动发霉的身躯、阴暗的爬行)已经摸鱼两个月了,这两个月虽说没发文章,但是也一直没闲着折腾,去年立的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接入
酱紫
什么站点啊 千人注册不少了啊
是个小圈子的论坛