Skip to content

异常检测

rho-aias 内置了基于统计基线的异常流量检测系统,能够自动识别 DDoS 攻击并触发响应措施。

检测原理

rho-aias 使用 IQR(Interquartile Range,四分位距) 统计方法建立流量基线,相比传统的 3σ 方法,IQR 对异常值更加鲁棒,能有效减少极端流量对基线的影响。

IQR 原则说明

  • Q1(第一四分位数):25% 分位点
  • Q3(第三四分位数):75% 分位点
  • IQR = Q3 - Q1:四分位距,衡量数据离散程度
  • 上限 = Q3 + k × IQR:超过此值判定为异常
  • 相比 3σ,IQR 不受极端异常值影响,更适合网络流量这种存在突发尖峰的数据
  • 约 99.3% 的正常数据落在合理范围内(k=2.5 时)

支持的攻击类型

攻击类型检测方式说明
SYN FloodSYN 包占比大量半开连接耗尽服务器资源
UDP FloodUDP 包占比大量 UDP 包淹没带宽
ICMP FloodICMP 包占比利用 ICMP 协议进行流量攻击
ACK FloodACK 包占比发送大量 ACK 包干扰连接

配置

config.yml 中配置异常检测:

yaml
anomaly_detection:
  enabled: true                    # 总开关

  # 采样配置
  sample_rate: 100                 # 采样率(100=1%,1=100%)

  # 检测配置
  check_interval: 1                 # 检测间隔(秒)
  min_packets: 100                  # 全局最小包数门槛(单 IP 每秒 <100 包直接跳过攻击检测)
  cleanup_interval: 300             # 清理过期数据间隔(秒)

  # 封禁配置
  block_duration: 60               # 临时封禁时长(秒)

  # 端口过滤配置(仅对指定端口进行异常检测,同时应用于 TCP/UDP,为空则检测所有端口)
  ports:
    - 80
    - 443
    - 8080
    - 53

  # IQR 基线配置(兜底检测:协议比例正常但流量异常大的场景)
  # 使用 IQR 算法计算上下限,阈值 = Q3 + k × IQR
  baseline:
    min_sample_count: 10            # 最小学习样本数(不足时仅学习不检测)
    iqr_multiplier: 2.5             # IQR 倍数,2.5 覆盖约 99.3%,平衡灵敏度与误报
    min_threshold: 100              # 最小 PPS 阈值,PPS <100 的 IP 豁免基线检测
    max_age: 1800                   # 基线最大有效期(秒),过期自动重置以适应流量变化
    block_duration: 60              # 基线触发的封禁时长(秒)

  # 攻击类型检测
  # 封禁条件 = 全局 min_packets 通过 + 类型 min_packets 通过 + ratio_threshold 通过
  attacks:
    syn_flood:
      enabled: true
      ratio_threshold: 0.5          # SYN/TCP > 50% 才触发(正常流量远低于此值)
      min_packets: 1000             # TCP 包 ≥1000 才检测
      block_duration: 60            # 封禁时长(秒)
    udp_flood:
      enabled: true
      ratio_threshold: 0.8          # UDP/总包 > 80% 才触发
      min_packets: 1000             # UDP 包 ≥1000 才检测
      block_duration: 60
    icmp_flood:
      enabled: true
      ratio_threshold: 0.5          # ICMP/总包 > 50% 才触发
      min_packets: 100              # ICMP 包 ≥100 才检测(特征明显,可适当放宽)
      block_duration: 60
    ack_flood:
      enabled: true
      ratio_threshold: 0.95         # ACK/TCP > 95% 才触发(正常下载通常远低于此值)
      min_packets: 500              # TCP 包 ≥500 才检测(主要误触来源,必须抬高)
      block_duration: 60

参数说明

参数说明默认值
sample_rate采样率,1 表示 100%,100 表示 1%100
check_interval检测间隔(秒)1
min_packets全局最小包数门槛(单 IP 每秒少于此值跳过攻击检测)100
cleanup_interval清理间隔(秒)300
block_duration临时封禁时长(秒)60
ports检测端口列表(空则全部,同时应用于 TCP/UDP)[]

基线配置说明(IQR 算法)

参数说明默认值
min_sample_count建立基线的最小样本数(不足时仅学习不检测)10
iqr_multiplierIQR 倍数,越高越宽松(替代旧的 sigma_multiplier)2.5
min_threshold最小 PPS 阈值,保护低流量 IP100
max_age基线最大年龄(秒),过期后重建1800
block_duration基线触发后的封禁时长(秒)60

从 3σ 迁移到 IQR

v2.0 版本将基线算法从 3σ(标准差) 升级为 IQR(四分位距)。主要改进:

  • 抗异常值干扰:IQR 基于中位数和四分位数计算,不受极端流量尖峰影响
  • 更稳定的基线:在网络流量波动较大的环境中表现更稳定
  • 更低的误报率:相同倍数下 IQR 比 3σ 产生更少的误判

配置变更映射:

  • sigma_multiplieriqr_multiplier(默认值 3.0 → 2.5)
  • 其他参数保持兼容

攻击类型配置说明

参数说明
enabled是否启用此类型检测
ratio_threshold协议包占比阈值(0.0-1.0)
min_packets触发检测的最小包数
block_duration封禁时长(秒)

支持的攻击类型:syn_floodudp_floodicmp_floodack_flood

工作流程

检测逻辑

协议占比检测

对于每种攻击类型,系统计算该协议包占总包数的比例:

SYN 占比 = SYN 包数 / 总 TCP 包数
UDP 占比 = UDP 包数 / 总包数
ICMP 占比 = ICMP 包数 / 总包数
ACK 占比 = ACK 包数 / 总 TCP 包数

当占比超过 ratio_threshold 时触发告警。

IQR 基线检测

系统为每个源 IP 维护流量基线:

  1. 收集历史流量样本
  2. 计算 Q1(25% 分位)、Q3(75% 分位)、IQR = Q3 - Q1
  3. 上限 = Q3 + k × IQR
  4. 当实时流量超过上限时判定异常

参数调优:

  • iqr_multiplier = 2.5:约覆盖 99.3% 正常流量
  • 增大可减少误报,但可能漏报
  • 减小可提高检测灵敏度,但增加误报

封禁管理

查看封禁记录

bash
curl -H "Authorization: Bearer <token>" \
  "http://localhost:8081/api/ban-records?source=anomaly"

响应示例:

json
{
  "records": [
    {
      "id": 1,
      "ip": "192.168.1.100",
      "source": "anomaly",
      "reason": "SYN flood detected (ratio: 0.85, threshold: 0.5)",
      "duration": 60,
      "expired": false,
      "created_at": "2026-03-28T10:00:00Z",
      "expires_at": "2026-03-28T10:01:00Z"
    }
  ],
  "total": 5
}

查看封禁统计

bash
curl -H "Authorization: Bearer <token>" \
  http://localhost:8081/api/ban-records/stats

最佳实践

建议

  1. 先观察后开启自动封禁:建议先运行检测系统观察基线数据,确认阈值合理后再开启
  2. 合理设置阈值:根据实际业务流量调整 ratio_threshold,避免误判
  3. 关注端口配置:仅对业务端口开启检测,减少误报
  4. 配合 WAF 使用:结合 WAF 联动实现 L3 + L7 双层防护
  5. 启用 SSH 防爆破:开启 FailGuard 保护 SSH 服务免受暴力破解
  6. 定期检查封禁记录:关注封禁记录,及时发现异常

调参建议

高流量场景

yaml
anomaly_detection:
  min_packets: 500
  baseline:
    min_threshold: 1000
    iqr_multiplier: 3.0

低流量场景

yaml
anomaly_detection:
  min_packets: 20
  baseline:
    min_threshold: 50
    iqr_multiplier: 2.0

严格模式

yaml
anomaly_detection:
  attacks:
    syn_flood:
      ratio_threshold: 0.3
      block_duration: 300

宽松模式

yaml
anomaly_detection:
  attacks:
    syn_flood:
      ratio_threshold: 0.7
      block_duration: 30

动态配置支持

异常检测模块支持运行时动态配置,可通过 API 热更新以下参数:

  • enabled - 总开关
  • min_packets - 全局最小包数
  • ports - 检测端口列表
  • baseline.iqr_multiplier - IQR 倍数
  • baseline.min_sample_count - 最小样本数
  • baseline.min_threshold - 最小 PPS 阈值
  • attacks.*.enabled - 各攻击类型开关
  • attacks.*.ratio_threshold - 各攻击类型阈值
  • attacks.*.block_duration - 各攻击类型封禁时长
bash
# 示例:动态调整异常检测参数
curl -X POST "http://localhost:8081/api/dynamic-config/anomaly_detection" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "min_packets": 200,
    "ports": [80, 443],
    "baseline": {
      "min_sample_count": 60,
      "iqr_multiplier": 2.5,
      "min_threshold": 1000,
      "max_age": 3600,
      "block_duration": 60
    },
    "attacks": {
      "syn_flood": {"enabled": true, "ratio_threshold": 0.5, "block_duration": 60, "min_packets": 200},
      "udp_flood": {"enabled": true, "ratio_threshold": 0.8, "block_duration": 60, "min_packets": 200},
      "icmp_flood": {"enabled": true, "ratio_threshold": 0.5, "block_duration": 60, "min_packets": 50},
      "ack_flood": {"enabled": true, "ratio_threshold": 0.95, "block_duration": 60, "min_packets": 500}
    }
  }'