CC无感防护的深度配置指南
2025-08-12
16
参考资料
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" } }
五、关键优化策略
动态基线学习
# 每5分钟计算平均QPS (伪代码) new_avg = (current_qps * 0.3) + (old_avg * 0.7) ngx.shared.stats:set("avg_qps", new_avg)
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
人机验证升级
# 持续攻击者转交验证码 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
六、验证方法
压测工具检测
# 模拟CC攻击 (50并发) hey -n 5000 -c 50 http://yoursite.com/api/search # 观察拦截日志 tail -f /var/log/nginx/cc_block.log
调试头信息
add_header X-CC-Status $cc_status; # 显示防护状态 add_header X-CC-Threshold $cc_threshold; # 显示当前阈值
实时监控指标
# 查看共享内存状态 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
七、注意事项
误伤处理机制
提供实时拦截豁免接口
POST /cc_unblock?ip=1.2.3.4&token=SECRET_KEY
自动释放误封IP(2小时无攻击自动解除)
性能优化
# 启用Lua代码缓存 lua_code_cache on; # 限制指纹计算频率 map $cookie_cc_challenge $skip_fingerprint { "passed" 1; default 0; }
防御绕过防护
-- 验证User-Agent一致性 if ngx.var.http_user_agent ~= previous_agents[ip] then ngx.shared.cc_dict:delete(key) -- 重置计数器 end
该方案通过 动态基线学习+行为指纹分析+渐进式质询 实现真正的“无感”防护,在保障业务流畅的同时精准打击CC攻击,尤其适用于电商、金融等高敏感场景。