黑帽联盟

 找回密码
 会员注册
查看: 1220|回复: 0
打印 上一主题 下一主题

[安全教程] 根据系统负载自动开关CloudFlare的五秒盾进行 DDoS 攻击防御脚本

[复制链接]

895

主题

38

听众

3329

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    难过
    昨天 22:31
  • 签到天数: 1652 天

    [LV.Master]伴坛终老

    个人极力在推荐大家使用CloudFlare来对站点进行安全防护的,采用的是国内大部分主流DNS多线路解析功能实现的,将境外线路解析到CloudFlare上去,这样一来只要没有暴露服务器真实IP情况下,所有使用境外IP代理的恶意请求、CC攻击、 DDoS 攻击都可以被CloudFlare免费拦截防御,基本上可以阻挡大部分免费的、恶心人的攻击骚扰。

    CloudFlare里防御 DDoS 攻击最有效的就是五秒盾功能了,所谓的五秒盾其实就是指CloudFlare的“Under Attack 模式”而已,登录你的CloudFlare账号进入具体域名,一般在最右边就可以看到开启开关了,如下图所示:

    21.png

    当开启五秒盾(Under Attack 模式)后,所有访问到CloudFlare的IP节点上都会显示如下图所示的警示验证页面:

    22.gif
    意思是需要5秒时间来验证访问者是否真实的请求,而非机器发送的恶意攻击请求。简单就是这个意思,是不是感觉有点儿影响用户体验了,好在可以很好的缓解 DDoS 攻击造成的服务器运行压力和带宽占用,个人实测还是非常有效果的,这就是明月博客至今不怕各种 DDos/CC 攻击挑衅的主要原因之一了。

    今天给大家分享一个开源的sh脚本 Cloudflare-Block ,可以实现在Linux服务器端根据系统负载情况自动开启CloudFlare的五秒盾进行被攻击后的防御。原理其实很简单,就是借助CloudFlare的API直接远程操作CloudFlare账号。


    只需要复制下面的代码,保存为Cloudflare.sh文件再添加到crontab里定时执行脚本即可,相当的简单。

    #!/bin/bash

    # $1 = 1min, $2 = 5min, $3 = 15min,这里选择使用哪个负载值为阈值。
    loadavg=$(awk '{printf "%f", $1}' < /proc/loadavg)

    # Linux系统负载(load average)达到10即开启五秒盾,您可以根据情况来修改这个数值。
    maxload=10

    # 配置 Cloudflare 的API
    # 您 CloudFlare 的Global API Key (https://dash.cloudflare.com/profile)
    api_key=
    # 您 CloudFlare 账号邮箱
    email=
    # 您 CloudFlare 账号的**区域 ID** (https://dash.cloudflare.com/_zone-id_/domain.com)
    zone_id=
    # 没有攻击时CloudFlare的默认安全级别
    default_security_level=high
    # 是否将调试消息写入脚本目录下的 debug.log 文件
    debug=0

    basedir=$(dirname "$0")

    attacked_file=$basedir/attacked

    [ "$debug" -eq 1 ] && exec > "${logfile:-$basedir/debug.log}"


    # 您可以就地放置上述配置值,也可以将其放置在脚本目录中名为“config”的文件中。
    config_file=$basedir/config
    [ -e "$config_file" ] && source "$config_file"

    api_set_mode() {
        local mode
        mode=$1
        curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
            -H "X-Auth-Email: $email" \
            -H "X-Auth-Key: $api_key" \
            -H "Content-Type: application/json" \
            --data "{\"value\":\"$mode\"}" \
        || echo "Error: failed to set security level to $mode"
    }

    # 如果不存在则创建文件“attacked”
    if [ ! -e "$attacked_file" ]; then
        echo 0 > "$attacked_file"
    fi

    was_under_attack=$(cat "$attacked_file")
    under_attack=$(echo "$loadavg > $maxload" | bc)

    if [[ "$1" != [01] ]]; then
        echo "Incorrect usage! Please pass either 0 or 1 as an argument"
        exit 1
    fi

    if [ $debug -eq 1 ]; then
        echo "Mode: $1; was under attack: $was_under_attack; now under attack: $under_attack"
        echo "Load average: $loadavg"
    fi

    if [ "$1" -eq 0 ] && [ "$was_under_attack" -eq 0 ] && [ "$under_attack" -eq 1 ]; then
        # attack just started and we want to enable under-attack mode

        # Activate protection
        [ "$debug" -eq 1 ] && echo "Activating under-attack mode!"
        echo 1 > "$attacked_file"
        api_set_mode under_attack

    elif [ "$1" -eq 1 ] && [ "$was_under_attack" -eq 1 ] && [ "$under_attack" -eq 0 ]; then
        # attack just finished (and up to 20 minutes passed since)
        # and we want to disable under-attack mode

        # Disable Protection
        [ "$debug" -eq 1 ] && echo "Leaving under-attack mode!"
        echo 0 > "$attacked_file"
        api_set_mode "$default_security_level"

    fi

    exit 0



    然后在crontab定时任务里添加这个脚本的执行定时计划即可:

    */1 * * * * /root/DDoS/Cloudflare.sh 0 # 如果未启用五秒盾保护,则每 1 分钟检查一次
    */20 * * * * /root/DDoS/Cloudflare.sh 1 # 每 20 分钟检查一次五秒盾保护是否已启用



    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部