Skip to content

阻断日志

rho-aias 内置阻断日志系统,实时记录 XDP 层拦截的数据包信息,支持持久化存储和统计分析。

概述

配置

yaml
blocklog:
  buffer_size: 1000             # 异步写入缓冲区
  flush_interval: 5             # 刷盘间隔(秒)
  geo_enrich:                   # IP 归属地自动补全
    enabled: true
    batch_size: 500             # 每批处理数

参数说明

参数说明默认值
buffer_size异步写入缓冲区大小1000
flush_interval缓冲区刷盘间隔(秒)5

IP 归属地补全配置 (geo_enrich)

当启用 GeoEnrich 后,阻断日志会自动查询目标 IP 的地理位置信息并补全到日志记录中。

参数说明默认值
enabled是否启用 IP 归属地自动补全-
batch_size每批处理的记录数500

GeoEnrich 工作原理

  • 阻断事件先写入缓冲队列
  • 按 batch_size 批量进行 GeoIP 查询补全
  • 补全后的记录写入内存缓存和文件
  • 减少逐条查询的开销,提高整体吞吐量

日志格式

日志文件按小时分割,命名格式:YYYY-MM-DD_HH.jsonl

记录字段

json
{
  "src_ip": "192.168.1.100",
  "dst_ip": "10.0.0.1",
  "match_type": "ip",
  "rule_source": "manual",
  "country_code": "US",
  "packet_size": 64,
  "timestamp": "2026-03-28T10:30:45.123Z"
}
字段类型说明
src_ipstring源 IP 地址
dst_ipstring目标 IP 地址
match_typestring匹配类型:ipcidr
rule_sourcestring规则来源(见下表)
country_codestring源 IP 所属国家代码(需启用 GeoEnrich)
packet_sizeint数据包大小(字节)
timestampstring时间戳(RFC3339)

规则来源

rule_source说明位掩码
manual手动添加的规则0x01
intel威胁情报(IPSum/Spamhaus)0x02
geo地域封禁0x04
wafWAF 联动自动封禁0x08
ratelimitRate Limit 封禁0x20
anomaly异常检测自动封禁0x40
failguardFailGuard SSH 防爆破封禁0x100

API 接口

查询阻断记录

bash
GET /api/blocklog/records

查询参数:

参数类型说明
startstring开始时间(RFC3339)
endstring结束时间(RFC3339)
src_ipstring按源 IP 过滤
limitint返回条数限制(默认 100)

示例:

bash
curl -H "Authorization: Bearer <token>" \
  "http://localhost:8081/api/blocklog/records?start=2026-03-28T00:00:00Z&limit=50"

响应:

json
{
  "records": [
    {
      "src_ip": "192.168.1.100",
      "dst_ip": "10.0.0.1",
      "match_type": "ip",
      "rule_source": "manual",
      "country_code": "US",
      "packet_size": 64,
      "timestamp": "2026-03-28T10:30:45.123Z"
    }
  ],
  "total": 150
}

获取阻断统计

bash
GET /api/blocklog/stats

响应:

json
{
  "total_blocked": 100000,
  "by_source": {
    "manual": 500,
    "intel": 50000,
    "geo": 30000,
    "waf": 15000,
    "ratelimit": 2000,
    "anomaly": 4500,
    "failguard": 800
  },
  "by_country": {
    "US": 35000,
    "CN": 5000,
    "RU": 25000,
    "Unknown": 10000
  },
  "top_blocked_ips": [
    {"ip": "192.168.1.100", "count": 5000},
    {"ip": "10.0.0.50", "count": 3000}
  ]
}

获取被阻断的 IP 列表

bash
GET /api/blocklog/blocked-ips

查询参数:

参数类型说明
limitint返回条数限制

响应:

json
{
  "ips": [
    {"ip": "192.168.1.100", "count": 5000, "last_seen": "2026-03-28T10:00:00Z"},
    {"ip": "10.0.0.50", "count": 3000, "last_seen": "2026-03-28T09:55:00Z"}
  ],
  "total": 500
}

获取被阻断的国家列表

bash
GET /api/blocklog/blocked-countries

响应:

json
{
  "countries": [
    {"country_code": "US", "count": 35000},
    {"country_code": "RU", "count": 25000},
    {"country_code": "CN", "count": 5000}
  ],
  "total": 3
}

清除阻断记录

bash
DELETE /api/blocklog/records

注意

此操作需要 blocklog:clear 权限,会清除内存缓存中的记录(不影响已持久化的文件)。


性能优化

内存缓存

  • 阻断记录首先写入内存环形缓存
  • 支持快速实时查询,无需读取文件
  • 缓存满后自动覆盖旧记录

异步写入

  • 使用缓冲区批量写入,减少磁盘 I/O
  • 可配置刷盘间隔,平衡性能和数据安全
  • 服务关闭时自动刷盘,避免数据丢失

IP 归属地补全(GeoEnrich)

  • 批量处理减少 GeoIP 查询次数
  • 可配置每批大小平衡延迟和吞吐量
  • 对无 GeoIP 信息的 IP 跳过补全

文件分割

  • 按小时分割日志文件,便于管理
  • 过期日志可通过 log.max_age_days 自动清理

最佳实践

1. 监控阻断趋势

定期查看统计数据,识别攻击模式:

bash
# 每小时查看阻断统计
curl -H "Authorization: Bearer <token>" \
  http://localhost:8081/api/blocklog/stats

2. 结合威胁情报

观察 by_source 分布,评估各数据源效果:

  • 威胁情报命中多 → 情报源有效
  • WAF 命中多 → 应用层攻击频繁
  • Rate Limit 命中多 → 存在高频请求
  • 异常检测命中多 → DDoS 攻击
  • FailGuard 命中多 → SSH 暴力破解

3. 分析攻击来源

查看 by_countrytop_blocked_ips

  • 特定国家攻击多 → 考虑地域封禁
  • 单一 IP 攻击多 → 手动封禁或调整阈值

4. 日志归档

生产环境建议:

bash
# 定期归档旧日志
find ./logs/blocklog -name "*.jsonl" -mtime +30 -exec gzip {} \;

# 或使用日志收集系统(ELK、Loki)统一管理

日志文件示例

./logs/blocklog/2026-03-28_10.jsonl:

json
{"src_ip":"192.168.1.100","dst_ip":"10.0.0.1","match_type":"ip","rule_source":"manual","country_code":"US","packet_size":64,"timestamp":"2026-03-28T10:00:01.123Z"}
{"src_ip":"10.50.0.25","dst_ip":"10.0.0.1","match_type":"cidr","rule_source":"intel","country_code":"RU","packet_size":128,"timestamp":"2026-03-28T10:00:01.456Z"}
{"src_ip":"172.16.0.5","dst_ip":"10.0.0.1","match_type":"ip","rule_source":"geo","country_code":"KP","packet_size":64,"timestamp":"2026-03-28T10:00:02.789Z"}
{"src_ip":"203.0.113.10","dst_ip":"10.0.0.1","match_type":"ip","rule_source":"failguard","country_code":"Unknown","packet_size":64,"timestamp":"2026-03-28T10:05:30.000Z"}
{"src_ip":"198.51.100.20","dst_ip":"10.0.0.1","match_type":"ip","rule_source":"ratelimit","country_code":"US","packet_size":1400,"timestamp":"2026-03-28T10:10:15.500Z"}