温馨提示×

如何监控nginx日志以发现异常流量

小樊
39
2025-11-23 15:44:06
栏目: 编程语言

监控 Nginx 日志发现异常流量的实用方案

一 监控目标与关键指标

  • 指标与阈值示例
    • 请求速率异常:单位时间(如1分钟)内总请求数或单 IP 请求数突增,阈值可按基线设定(如单 IP 超过300–500 次/分钟触发告警/处置)。
    • 错误率与失败激增:状态码4xx/5xx占比升高,或500错误在短时间内集中出现。
    • 慢响应:上游响应时间(upstream_response_time)超过阈值(如**>1s**)的请求占比升高。
    • 带宽异常:按 IP/URL 聚合的 body_bytes_sent 或响应体积突增。
    • 可疑模式:404 高频扫描、User-Agent 异常、可疑 Referer、路径遍历与注入特征等。
  • 日志字段建议
    • 使用包含 $remote_addr、 $status、 $body_bytes_sent、 $request_time、 $upstream_response_time、 $http_user_agent、 $http_referer、 $http_x_forwarded_for 的格式;若经代理,优先使用 X-Forwarded-For 作为客户端 IP 来源。

二 快速落地方案

  • 轻量即时分析
    • 命令行工具:用 ngxtop 实时查看 Top IP/URL/状态码/请求时间 等指标,快速定位异常来源与热点接口。
    • 单机脚本:按分钟统计日志,超过阈值即告警或处置,例如“1 分钟单 IP > 500 次触发封禁/告警”的 Shell 方案。
  • 可视化与告警
    • 日志采集到 ELK(Elasticsearch + Logstash + Kibana)/Splunk,用可视化面板观察错误率、慢响应、Top N IP/URL 的趋势与突增。
  • 自动化防护
    • Fail2Ban:基于日志正则匹配自动封禁恶意 IP,适合常见暴力扫描与高频错误场景。
    • CrowdSec:面向 Nginx 的开源方案,日志分析检测爬虫、SQL 注入等,结合本地 API 与 Bouncer 可在 Nginx/防火墙 层阻断,并支持社区威胁情报共享。

三 参考配置与脚本

  • 建议的 JSON 日志格式(便于解析与检索)
    log_format json '{"@timestamp":"$time_iso8601",'
                    '"clientip":"$remote_addr",'
                    '"request":"$request",'
                    '"http_user_agent":"$http_user_agent",'
                    '"size":"$body_bytes_sent",'
                    '"responsetime":"$request_time",'
                    '"upstreamtime":"$upstream_response_time",'
                    '"upstreamhost":"$upstream_addr",'
                    '"http_host":"$host",'
                    '"url":"$uri",'
                    '"domain":"$host",'
                    '"referer":"$http_referer",'
                    '"status":"$status"}';
    access_log  /var/log/nginx/access.log  json;
    
  • 一分钟异常 IP 检测与处置脚本(示例阈值:500 次/分钟
    #!/usr/bin/env bash
    set -euo pipefail
    NGINX_LOG="/var/log/nginx/access.log"
    THRESHOLD=500
    TMP_IP="/tmp/abnormal_ips.txt"
    DENY_IP="/tmp/denyip.txt"
    
    # 1 分钟窗口(按日志时间字段匹配)
    ts=$(date -d "1 minute ago" +"%Y-%m-%dT%H:%M")
    awk -F'"' -v ts="$ts" '$2 ~ ts {print $8}' "$NGINX_LOG" \
      | sort | uniq -c | sort -nr > "$TMP_IP"
    
    while read cnt ip; do
      if [ "$cnt" -gt "$THRESHOLD" ]; then
        if ! grep -qFx "$ip" "$DENY_IP"; then
          iptables -I INPUT -s "$ip" -j DROP
          echo "$ip" >> "$DENY_IP"
          echo "$(date) Banned $ip ($cnt req/min)" >> /var/log/nginx/ban.log
        fi
      fi
    done < "$TMP_IP"
    
    • 建议配合 logrotate 管理日志轮转,避免磁盘占满;处置前可先发告警或加入“观察名单”。

四 大规模与自动化架构

  • 架构建议:Nginx 集群 → 日志采集(如 Filebeat/Logstash 或 Lua + Kafka)→ 消息队列(Kafka/Redis)→ 指标计算与告警(如 Logstash/Flink/Heka)→ 存储与可视化(Elasticsearch + Kibana)
  • 关键实践
    • 在采集侧做结构化(JSON)与必要脱敏;计算侧按 IP/URL/状态码/UA/地域 等维度聚合,设置动态阈值与多维告警(速率、错误率、慢响应、带宽)。
    • 告警去重与频率控制,避免“告警风暴”;异常样本落地 ES 便于取证与复盘。

五 异常模式与处置建议

  • 常见可疑模式
    • 高频 404:目录/文件扫描;高频 500:后端异常或攻击触发;异常 User-Agent:脚本/爬虫;异常 Referer:伪造来源或外链盗链;短时突发流量:DDoS/刷量。
  • 处置策略
    • 分级响应:先 告警/限速/验证码,再 临时封禁,最后 持久拉黑 并结合 WAF/防火墙;对误封设置白名单与自动恢复。
    • 取证与复盘:保留异常日志样本与指标快照,完善规则与基线,持续优化阈值与检测场景。

0