异常检测
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 Flood | SYN 包占比 | 大量半开连接耗尽服务器资源 |
| UDP Flood | UDP 包占比 | 大量 UDP 包淹没带宽 |
| ICMP Flood | ICMP 包占比 | 利用 ICMP 协议进行流量攻击 |
| ACK Flood | ACK 包占比 | 发送大量 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_multiplier | IQR 倍数,越高越宽松(替代旧的 sigma_multiplier) | 2.5 |
min_threshold | 最小 PPS 阈值,保护低流量 IP | 100 |
max_age | 基线最大年龄(秒),过期后重建 | 1800 |
block_duration | 基线触发后的封禁时长(秒) | 60 |
从 3σ 迁移到 IQR
v2.0 版本将基线算法从 3σ(标准差) 升级为 IQR(四分位距)。主要改进:
- 抗异常值干扰:IQR 基于中位数和四分位数计算,不受极端流量尖峰影响
- 更稳定的基线:在网络流量波动较大的环境中表现更稳定
- 更低的误报率:相同倍数下 IQR 比 3σ 产生更少的误判
配置变更映射:
sigma_multiplier→iqr_multiplier(默认值 3.0 → 2.5)- 其他参数保持兼容
攻击类型配置说明
| 参数 | 说明 |
|---|---|
enabled | 是否启用此类型检测 |
ratio_threshold | 协议包占比阈值(0.0-1.0) |
min_packets | 触发检测的最小包数 |
block_duration | 封禁时长(秒) |
支持的攻击类型:syn_flood、udp_flood、icmp_flood、ack_flood
工作流程
检测逻辑
协议占比检测
对于每种攻击类型,系统计算该协议包占总包数的比例:
SYN 占比 = SYN 包数 / 总 TCP 包数
UDP 占比 = UDP 包数 / 总包数
ICMP 占比 = ICMP 包数 / 总包数
ACK 占比 = ACK 包数 / 总 TCP 包数当占比超过 ratio_threshold 时触发告警。
IQR 基线检测
系统为每个源 IP 维护流量基线:
- 收集历史流量样本
- 计算 Q1(25% 分位)、Q3(75% 分位)、IQR = Q3 - Q1
- 上限 = Q3 + k × IQR
- 当实时流量超过上限时判定异常
参数调优:
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最佳实践
建议
- 先观察后开启自动封禁:建议先运行检测系统观察基线数据,确认阈值合理后再开启
- 合理设置阈值:根据实际业务流量调整
ratio_threshold,避免误判 - 关注端口配置:仅对业务端口开启检测,减少误报
- 配合 WAF 使用:结合 WAF 联动实现 L3 + L7 双层防护
- 启用 SSH 防爆破:开启 FailGuard 保护 SSH 服务免受暴力破解
- 定期检查封禁记录:关注封禁记录,及时发现异常
调参建议
高流量场景
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}
}
}'