要让grafana实时展示nginx拦截安全攻击趋势,需通过结构化日志(log_format+map)、独立日志文件采集、exporter转换为prometheus指标(如nginx_attack_blocked_total),再在grafana中用rate()、topk()等函数构建拦截速率、来源ip、路径分布看板,并可联动waf日志提升精度。

要让 Grafana 实时展示 Nginx 拦截安全攻击的事件趋势,关键不是“加个图表”,而是把拦截行为变成可度量、可采集、可聚合的指标数据——Nginx 本身不主动上报“我刚拦了一个攻击”,必须靠日志解析 + 指标暴露 + 可视化串联。
从 Nginx 日志中提取攻击拦截信号
安全拦截事件(如 WAF 规则命中、限流拒绝、IP 封禁)通常记录在 access.log 或 error.log 中。需先结构化日志,再打上攻击特征标签:
- 用 log_format 定义含拦截标识的字段,例如:
log_format security '$time_iso8601 $remote_addr "$request" $status $bytes_sent "$http_user_agent" "$http_referer" $request_time $upstream_response_time $limit_req_status $limit_conn_status $sent_http_x_blocked';
其中$limit_req_status为 “rejected” 表示被限流拦截,$sent_http_x_blocked可由自定义 header 标记 WAF 拦截 - 用 map 指令 映射高危行为:比如匹配 User-Agent 含 “sqlmap|nuclei|gobuster”,或 URI 含 “.php?cmd=|/etc/passwd”,统一设为
$is_attack 1 - 确保日志写入独立文件(如
/var/log/nginx/attack-blocks.log),便于 Fluentd / Filebeat 单独采集
将拦截事件转为 Prometheus 指标
原始日志不能直接被 Prometheus 抓取,需通过 exporter 转换:
- 推荐使用 nginx-log-exporter 或 prometheus-logstash-exporter:配置其监听攻击日志文件,按正则匹配行并计数,生成类似
nginx_attack_blocked_total{type="rate_limit", code="503"}的指标 - 若已用 Fluentd,可在 pipeline 中添加 filter 插件(如
@type prometheus),对匹配is_attack == "1"的日志自动递增 counter - 验证是否生效:执行
curl http://exporter-ip:9142/metrics | grep attack_blocked,应看到带 label 的计数器
Grafana 中构建实时攻击拦截看板
导入或新建面板,聚焦“发生了什么、多快、在哪发生”三个维度:
-
实时拦截速率:用
rate(nginx_attack_blocked_total[1m])曲线图,时间范围设为“Last 5 minutes”,刷新间隔调至 5s;叠加不同type(如 rate_limit / waf_block / ip_ban)做堆叠面积图 -
拦截来源 Top IP:用
topk(10, sum by (clientip) (rate(nginx_attack_blocked_total[5m])))配柱状图,配合 geoip 地理信息可加世界地图热力层 -
拦截路径分布:用
topk(10, sum by (uri) (rate(nginx_attack_blocked_total{type=~"waf|rate_limit"}[5m])))查看高频被拦接口,辅助识别攻击目标 - 建议搭配一个 告警触发器:当
rate(nginx_attack_blocked_total{type="waf_block"}[1m]) > 50持续 2 分钟,说明可能遭遇扫描或爆破,立即通知
补充:和 WAF 日志联动更准
如果用了商业 WAF(如 Cloudflare、阿里云WAF)或开源 ModSecurity,它们自带拦截日志格式(如 JSON)。可跳过 Nginx 日志解析,直接用:
– ModSecurity 的 SecAuditLog 接入 Logstash → Prometheus Exporter
– Cloudflare 的 Firewall Events Log 通过 API 流式拉取 → 写入 Kafka → Flink 实时统计 → PushGateway 上报
这样能捕获更细粒度的规则 ID、攻击类型(SQLi/XSS/RFI)、匹配 payload 片段,可视化价值更高。











