关于 implementing-ddos-mitigation-with-cloudflare
用于配置 Cloudflare DDoS 防护的安全技能,涵盖托管规则集、速率限制、WAF 规则、源站加固、自动化和监控。
主要功能
- 01配置 DDoS 托管规则集
- 02设置速率限制和 WAF 规则
- 03限制对源站的访问
- 04自动启用 Under Attack Mode
- 05监控攻击事件和告警
适用场景
- 01为域名部署 DDoS 防护
- 02加固源站以防直接访问
- 03调整防护并监控攻击事件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-ddos-mitigation-with-cloudflare安装后在 Claude Code 中输入/implementing-ddos-mitigation-with-cloudflare确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
使用 Cloudflare 实施 DDoS 缓解
概述
Cloudflare 通过其由 300 多个数据中心组成的全球网络提供多层 DDoS 防护,容量达 477+ Tbps。该平台可防御 L3/4 容量型攻击(SYN 洪水、UDP 放大、DNS 反射)、协议攻击(Ping of Death、Smurf)以及 L7 应用层攻击(HTTP 洪水、Slowloris、缓存绕过)。Cloudflare 的自主检测系统利用流量画像、机器学习和自适应规则集,可在约 3 秒内识别并缓解攻击。本技能涵盖配置 Cloudflare 的 DDoS 防护栈,包括托管规则集、WAF 规则、速率限制、Bot Management 以及源站服务器加固。
何时使用
- 在您的环境中部署或配置使用 Cloudflare 实施 DDoS 缓解能力时
- 建立符合合规要求的安全控制时
- 为此领域构建或改进安全架构时
- 执行需要此实施的安全评估时
前提条件
- Cloudflare 账户(WAF 最低需 Pro 套餐,高级 DDoS 需 Enterprise 套餐)
- 已将 DNS 委派给 Cloudflare 名称服务器的域名
- 源站服务器 IP 地址
- 了解正常流量模式和峰值流量
- 用于自动化的 Cloudflare API token
核心概念
DDoS 攻击类别
| 层 | 攻击类型 | 示例 | Cloudflare 防护 |
|---|---|---|---|
| L3/4 | 容量型 | SYN 洪水、UDP 洪水、DNS 放大 | 网络层 DDoS 托管规则 |
| L3/4 | 协议 | Ping of Death、Smurf、IP 分片 | Advanced TCP Protection |
| L7 | 应用 | HTTP 洪水、Slowloris、缓存绕过 | HTTP DDoS 托管规则、WAF、速率限制 |
| DNS | DNS 专用 | DNS 查询洪水、NXDOMAIN 攻击 | Advanced DNS Protection |
Cloudflare 防护栈
Internet Traffic
│
▼
┌─────────────────────────┐
│ Cloudflare Edge (PoP) │
│ ┌───────────────────┐ │
│ │ L3/4 DDoS Mgd Rules│ │ ← Volumetric/Protocol mitigation
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ IP Access Rules │ │ ← Country/ASN/IP blocks
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ Bot Management │ │ ← Bot score, JS challenge
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ WAF Managed Rules │ │ ← OWASP, Cloudflare, Custom
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ Rate Limiting │ │ ← Request rate enforcement
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ HTTP DDoS Mgd Rules│ │ ← L7 flood detection
│ └───────────────────┘ │
└─────────────────────────┘
│
▼
Origin Server
工作流
步骤 1:将域名接入 Cloudflare
# Add domain via API
curl -X POST "https://api.cloudflare.com/client/v4/zones" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"name": "example.com",
"type": "full",
"plan": {"id": "enterprise"}
}'
# Update DNS records (proxy enabled for DDoS protection)
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "example.com",
"content": "203.0.113.50",
"proxied": true,
"ttl": 1
}'
步骤 2:配置 DDoS 托管规则集
HTTP DDoS 攻击防护覆盖:
# List HTTP DDoS managed ruleset
curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/ddos_l7/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN"
# Override HTTP DDoS sensitivity and action
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/ddos_l7/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"rules": [{
"action": "execute",
"action_parameters": {
"id": "4d21379b4f9f4bb088e0729962c8b3cf",
"overrides": {
"rules": [{
"id": "fdfdac75430c4c47a422bdc024aab531",
"sensitivity_level": "medium",
"action": "block"
}],
"sensitivity_level": "high"
}
},
"expression": "true"
}]
}'
网络层 DDoS 防护覆盖:
curl -X PUT "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/rulesets/phases/ddos_l4/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"rules": [{
"action": "execute",
"action_parameters": {
"id": "3b64149bfa6e4220bbbc2bd6db7c867e",
"overrides": {
"sensitivity_level": "high"
}
},
"expression": "true"
}]
}'
步骤 3:配置速率限制规则
# Create rate limiting rule for login endpoint
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_ratelimit/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"rules": [
{
"description": "Rate limit login attempts",
"expression": "(http.request.uri.path eq \"/api/login\")",
"action": "block",
"ratelimit": {
"characteristics": ["cf.colo.id", "ip.src"],
"period": 60,
"requests_per_period": 10,
"mitigation_timeout": 600
}
},
{
"description": "Rate limit API endpoints",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "managed_challenge",
"ratelimit": {
"characteristics": ["cf.colo.id", "ip.src"],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 300
}
},
{
"description": "Global rate limit per IP",
"expression": "true",
"action": "managed_challenge",
"ratelimit": {
"characteristics": ["ip.src"],
"period": 10,
"requests_per_period": 50,
"mitigation_timeout": 60
}
}
]
}'
步骤 4:配置 WAF 自定义规则
# Block known attack patterns
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"rules": [
{
"description": "Block requests from known bad ASNs",
"expression": "(ip.geoip.asnum in {12345 67890})",
"action": "block"
},
{
"description": "Challenge requests without User-Agent",
"expression": "(not http.user_agent ne \"\")",
"action": "managed_challenge"
},
{
"description": "Block high-risk countries for admin paths",
"expression": "(http.request.uri.path contains \"/admin\" and not ip.geoip.country in {\"US\" \"CA\" \"GB\"})",
"action": "block"
},
{
"description": "Block oversized request bodies",
"expression": "(http.request.body.size gt 10000000)",
"action": "block"
}
]
}'
步骤 5:配置源站防护
确保源站服务器仅接受来自 Cloudflare 的流量:
# Get Cloudflare IP ranges
curl https://api.cloudflare.com/client/v4/ips
# Configure origin server firewall (iptables)
# Allow only Cloudflare IPs
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
iptables -A INPUT -p tcp --dport 443 -s $ip -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -s $ip -j ACCEPT
done
# Drop all other HTTP/HTTPS traffic
iptables -A INPUT -p tcp --dport 443 -j DROP
iptables -A INPUT -p tcp --dport 80 -j DROP
# Enable Authenticated Origin Pulls (mutual TLS)
# Download Cloudflare origin CA certificate
curl -o /etc/ssl/cloudflare-origin-pull.pem \
https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem
# Nginx configuration for authenticated origin pulls
# ssl_client_certificate /etc/ssl/cloudflare-origin-pull.pem;
# ssl_verify_client on;
步骤 6:启用 Under Attack Mode 自动化
#!/usr/bin/env python3
"""Auto-enable Cloudflare Under Attack Mode based on traffic anomalies."""
import requests
import time
import sys
CF_API_TOKEN = "your-api-token"
ZONE_ID = "your-zone-id"
HEADERS = {
"Authorization": f"Bearer {CF_API_TOKEN}",
"Content-Type": "application/json",
}
BASE_URL = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}"
NORMAL_RPS_THRESHOLD = 5000 # Requests per second threshold
CHECK_INTERVAL = 30 # Seconds between checks
def get_current_security_level():
"""Get current security level setting."""
resp = requests.get(
f"{BASE_URL}/settings/security_level",
headers=HEADERS
)
return resp.json()["result"]["value"]
def set_security_level(level: str):
"""Set security level (off, essentially_off, low, medium, high, under_attack)."""
resp = requests.patch(
f"{BASE_URL}/settings/security_level",
headers=HEADERS,
json={"value": level}
)
result = resp.json()
if result["success"]:
print(f"[+] Security level set to: {level}")
else:
print(f"[-] Failed to set security level: {result['errors']}")
return result["success"]
def get_traffic_analytics():
"""Get recent traffic data from Cloudflare analytics."""
query = """
query {
viewer {
zones(filter: {zoneTag: "%s"}) {
httpRequests1mGroups(limit: 1, orderBy: [datetime_DESC]) {
sum {
requests
threats
}
dimensions {
datetime
}
}
}
}
}
""" % ZONE_ID
resp = requests.post(
"https://api.cloudflare.com/client/v4/graphql",
headers=HEADERS,
json={"query": query}
)
return resp.json()
def monitor_and_respond():
"""Monitor traffic and auto-enable under attack mode."""
current_level = get_current_security_level()
print(f"[*] Current security level: {current_level}")
print(f"[*] Monitoring traffic (threshold: {NORMAL_RPS_THRESHOLD} RPS)...")
attack_mode_active = False
consecutive_normal = 0
while True:
try:
analytics = get_traffic_analytics()
zones = analytics.get("data", {}).get("viewer", {}).get("zones", [])
if zones and zones[0].get("httpRequests1mGroups"):
data = zones[0]["httpRequests1mGroups"][0]["sum"]
rps = data["requests"] / 60
threats = data["threats"]
print(f"[*] Current RPS: {rps:.0f}, Threats: {threats}")
if rps > NORMAL_RPS_THRESHOLD and not attack_mode_active:
print(f"[!] Traffic spike detected: {rps:.0f} RPS")
set_security_level("under_attack")
attack_mode_active = True
consecutive_normal = 0
elif rps <= NORMAL_RPS_THRESHOLD and attack_mode_active:
consecutive_normal += 1
if consecutive_normal >= 5:
print("[+] Traffic normalized, disabling under attack mode")
set_security_level("high")
attack_mode_active = False
consecutive_normal = 0
except Exception as e:
print(f"[-] Error: {e}")
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
monitor_and_respond()
监控与告警
Cloudflare Dashboard 指标
- 防火墙事件 - 查看已阻止请求、质询请求、速率受限请求
- DDoS 分析 - 攻击规模、持续时间、类型及缓解状态
- 流量分析 - 按时间统计的请求量、带宽、错误率
- Bot 分析 - Bot 分数分布、已验证 Bot 与自动化威胁对比
告警配置
# Create notification policy for DDoS attacks
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/alerting/v3/policies" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"name": "DDoS Attack Alert",
"alert_type": "dos_attack_l7",
"enabled": true,
"mechanisms": {
"email": [{"id": "[email protected]"}],
"webhooks": [{"id": "webhook-id"}]
},
"filters": {
"zones": ["'$ZONE_ID'"]
}
}'
最佳实践
- 代理所有 DNS 记录 - 确保所有指向源站的 A/AAAA/CNAME 记录均已代理(橙色云)
- 隐藏源站 IP - 绝不要暴露源站服务器 IP;使用 Cloudflare Tunnel 或仅限 Cloudflare IP 访问
- 从日志模式开始 - 先用“日志”操作测试 DDoS 规则覆盖,再切换到“阻止”
- 分层防御 - 结合托管规则集、速率限制、WAF 规则和 Bot Management
- 调整敏感度 - 根据流量中的误报率调整 DDoS 规则敏感度
- 缓存策略 - 最大化缓存命中率,以降低攻击期间的源站负载
- 等候室 - 在流量激增期间为关键页面配置 Cloudflare Waiting Room
- 源站认证 - 启用 Authenticated Origin Pulls,防止直接针对源站的攻击
参考
评论
支持 Markdown