参考资料

  1. 自动跳转到HTTPS的详细技术解析
  2. 详细讲解CDN:重写规则
  3. 重写访问URL
  4. GSLB (全局服务器负载均衡) 详解
  5. 如何配置边缘脚本规则
  6. 状态码过期时间
  7. 什么是回源HOST?
  8. CDN客户端缓存策略配置指南

CC无感防护的深度配置指南

以下是针对CC无感防护的深度配置指南,涵盖动态规则、智能阈值、指纹验证等核心技术,以 Nginx + Lua (OpenResty) 方案为例:


一、CC无感防护核心逻辑

graph TD
    A[请求进入] --> B{是否静态文件?}
    B -->|是| C[直接放行]
    B -->|否| D{是否例外URL?}
    D -->|是| C
    D -->|否| E[指纹分析]
    E --> F{是否合法指纹?}
    F -->|是| G[请求计数]
    F -->|否| H[302校验]
    G --> I{超过动态阈值?}
    I -->|是| J[JS质询/拦截]
    I -->|否| K[正常响应]

二、关键配置详解

1. 静态资源放行

# 忽略常见静态文件后缀
map $uri $is_static {
    default 0;
    ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|webp|svg)$ 1;
}

server {
    location / {
        # 静态资源直接跳过防护
        if ($is_static) { 
            access_by_lua_block { ngx.exit(ngx.OK) }
        }
        # 动态请求进入防护流程
        access_by_lua_file lua/cc_protect.lua;
    }
}

2. 例外URL配置

-- lua/cc_whitelist.lua
local WHITE_URLS = {
    ["/api/login"] = true,     -- 登录接口
    ["/healthcheck"] = true,   -- 健康检查
    ["/payment/callback"] = true -- 支付回调
}

if WHITE_URLS[ngx.var.uri] then
    ngx.log(ngx.NOTICE, "Whitelisted URL: ", ngx.var.uri)
    return -- 直接放行
end

3. 高危URL限制

-- lua/cc_restrict.lua
local RESTRICT_URLS = {
    ["/api/batch_query"] = { qps = 5 },  -- 批量查询接口限速5QPS
    ["/search"] = { qps = 20 }           -- 搜索接口限速20QPS
}

local target = RESTRICT_URLS[ngx.var.uri]
if target then
    local key = "CC_RESTRICT:" .. ngx.var.uri .. ":" .. ngx.var.remote_addr
    local current = tonumber(ngx.shared.cc_dict:get(key)) or 0
    
    if current > target.qps then
        ngx.exit(429) -- 返回429 Too Many Requests
    end
    
    ngx.shared.cc_dict:incr(key, 1, 0, 60) -- 60秒计数窗口
end

4. 请求指纹生成

-- 生成客户端唯一指纹 (SHA1哈希)
local function gen_fingerprint()
    local factors = {
        ngx.var.http_user_agent,
        ngx.var.http_accept_language,
        ngx.var.http_accept_encoding,
        ngx.var.http_upgrade_insecure_requests
    }
    local raw = table.concat(factors, "|")
    return ngx.sha1_bin(raw)
end

5. 智能阈值算法

-- 动态QPS阈值计算
local function dynamic_threshold()
    -- 基础阈值 = 历史均值 * 安全系数
    local base = ngx.shared.stats:get("avg_qps") or 50
    local threshold = base * 1.8  -- 1.8倍安全系数
    
    -- 突发流量补偿
    if ngx.shared.stats:get("current_qps") > base * 3 then
        threshold = threshold * 2.5  -- 临时放宽阈值
    end
    
    return math.floor(threshold)
end

6. 302校验流程

-- GET请求302质询
if ngx.req.get_method() == "GET" then
    local cookie = ngx.var.cookie_cc_challenge
    if not cookie or cookie ~= "passed" then
        -- 生成加密Token (有效期30秒)
        local token = ngx.encode_base64(ngx.time() .. "|" .. gen_fingerprint())
        
        -- 设置校验Cookie
        ngx.header["Set-Cookie"] = "cc_challenge=" .. token .. "; Path=/; HttpOnly"
        
        -- 重定向到自身URL (添加校验参数)
        local args = ngx.req.get_uri_args()
        args["_cc_verify"] = "1"
        ngx.redirect(ngx.var.request_uri .. "?" .. ngx.encode_args(args), 302)
    end
end

-- 校验逻辑
if ngx.var.arg__cc_verify == "1" then
    local token = ngx.decode_base64(ngx.var.cookie_cc_challenge)
    local ts, fp = string.match(token, "(%d+)|(.+)")
    
    if ts and fp == gen_fingerprint() and tonumber(ts) > ngx.time() - 30 then
        -- 验证通过,设置永久Cookie
        ngx.header["Set-Cookie"] = "cc_challenge=passed; Path=/; Max-Age=3600; HttpOnly"
    else
        ngx.exit(403) -- 验证失败
    end
end

三、完整配置示例

1. Nginx 主配置 (nginx.conf)

http {
    lua_shared_dict cc_dict 100m;   # 共享内存区
    lua_shared_dict stats   10m;    # 统计存储
    
    init_by_lua_block {
        -- 初始化统计模块
        require "resty.core"
        local stats = ngx.shared.stats
        stats:set("avg_qps", 50)    -- 初始平均QPS
    }
    
    server {
        listen 80;
        
        # 静态资源目录
        location ~* \.(js|css|jpg|png)$ {
            root /var/www/static;
            access_log off;
        }
        
        # 动态请求防护
        location / {
            access_by_lua_file /etc/nginx/lua/cc_main.lua;
            proxy_pass http://backend;
        }
    }
}

2. Lua 防护主逻辑 (cc_main.lua)

-- 加载子模块
local whitelist = require "cc_whitelist"
local restrict  = require "cc_restrict"
local fingerprint = require "cc_fingerprint"

-- 阶段1:白名单检查
if whitelist.check() then return end

-- 阶段2:高危URL限制
restrict.apply()

-- 阶段3:指纹分析
local fp = fingerprint.gen()
local ip = ngx.var.remote_addr

-- 阶段4:动态阈值计算
local threshold = dynamic_threshold()
local key = "CC_MAIN:" .. ip .. ":" .. fp
local count = tonumber(ngx.shared.cc_dict:get(key)) or 0

-- 超限处理
if count > threshold then
    -- 首次超限:302质询
    if count == threshold + 1 then
        require "cc_challenge".start()
    end
    
    -- 持续超限:拦截
    ngx.log(ngx.WARN, "CC attack detected: ", ip)
    ngx.exit(503)
end

-- 计数更新 (滑动窗口60秒)
ngx.shared.cc_dict:incr(key, 1, 0, 60)

四、自定义拦截策略模板

-- lua/custom_rules.lua
return {
    -- 规则1:API接口特殊防护
    {
        url = "^/api/",             -- URL匹配规则
        condition = function(ctx)
            -- 条件:工作日9-18点且QPS>100
            local hour = tonumber(os.date("%H"))
            local is_workday = os.date("%w") < 6
            return is_workday and hour > 9 and hour < 18 and ctx.qps > 100
        end,
        action = "block"            -- 动作:block/challenge/log
    },
    
    -- 规则2:搜索引擎放行
    {
        condition = function(ctx)
            local ua = ctx.user_agent or ""
            return ua:match("Googlebot") or ua:match("Baiduspider")
        end,
        action = "bypass"
    }
}

五、关键优化策略

  1. 动态基线学习

    # 每5分钟计算平均QPS (伪代码)
    new_avg = (current_qps * 0.3) + (old_avg * 0.7)
    ngx.shared.stats:set("avg_qps", new_avg)
  2. IP信誉库集成

    -- 查询IP威胁情报
    local function check_ip_reputation(ip)
        local resp = ngx.location.capture("/ip_reputation?ip="..ip)
        return resp.status == 200 and resp.body == "clean"
    end
  3. 人机验证升级

    # 持续攻击者转交验证码
    if attack_level > 3 then
        content_by_lua_block {
            ngx.say('<script src="https://www.google.com/recaptcha/api.js"></script>')
            ngx.say('<form action="/verify" method="POST">...')
        }
    end

六、验证方法

  1. 压测工具检测

    # 模拟CC攻击 (50并发)
    hey -n 5000 -c 50 http://yoursite.com/api/search
    
    # 观察拦截日志
    tail -f /var/log/nginx/cc_block.log
  2. 调试头信息

    add_header X-CC-Status $cc_status;  # 显示防护状态
    add_header X-CC-Threshold $cc_threshold; # 显示当前阈值
  3. 实时监控指标

    # 查看共享内存状态
    nginx -c /etc/nginx/nginx.conf -T | grep lua_shared_dict
    
    # 提取当前拦截计数
    echo "ngx.shared.cc_dict:get('CC_MAIN:8.8.8.8')" | resty -e

七、注意事项

  1. 误伤处理机制

    • 提供实时拦截豁免接口
      POST /cc_unblock?ip=1.2.3.4&token=SECRET_KEY

    • 自动释放误封IP(2小时无攻击自动解除)

  2. 性能优化

    # 启用Lua代码缓存
    lua_code_cache on;
    
    # 限制指纹计算频率
    map $cookie_cc_challenge $skip_fingerprint {
        "passed" 1;
        default  0;
    }
  3. 防御绕过防护

    -- 验证User-Agent一致性
    if ngx.var.http_user_agent ~= previous_agents[ip] then
        ngx.shared.cc_dict:delete(key)  -- 重置计数器
    end

该方案通过 动态基线学习+行为指纹分析+渐进式质询 实现真正的“无感”防护,在保障业务流畅的同时精准打击CC攻击,尤其适用于电商、金融等高敏感场景。