架构概览
本文档详细描述 rho-aias 的系统架构和各组件的协作方式。
整体架构
rho-aias 采用分层架构设计,主要分为三个核心层:
数据流
入站数据流(XDP)
出站数据流(TC eBPF)
SSH 防爆破数据流(eBPF Probes)
核心组件
eBPF XDP 程序(入站 - 内核态)
负责实际的数据包过滤,运行在内核空间:
- 包解析器:解析 Ethernet/IP/TCP/UDP/ICMP 头部
- 规则匹配器:基于 eBPF Map 存储的规则进行精确匹配和 CIDR 匹配
- 白名单:优先检查白名单,确保受信流量不被拦截
- 统计计数器:记录通过和丢弃的数据包数量
- 异常检测采样:按配置的采样率上报包信息
TC TBPF 程序(出口 - 内核态)
负责出口流量限速,基于令牌桶算法:
- 令牌桶引擎:per-flow 维度(按目标 IP)的速率控制
- 丢包上报:被丢弃的数据包信息通过 RingBuf 上报
- 动态配置:支持运行时调整速率和突发容量
FailGuard eBPF Probes(SSH 监控 - 内核态)
负责内核级 SSH 暴力破解检测:
- TCP 连接探针 (
inet_csk_accept):捕获新 SSH 连接 - 进程生命周期探针 (
sched_process_fork/exit):检测短连接行为 - PAM 认证探针 (
pam_authenticate):捕获认证结果
eBPF Manager(用户态)
负责用户态和内核态之间的通信:
- 规则同步器:将用户态的规则变更同步到 eBPF Map
- 状态收集器:从 eBPF Map 读取统计信息和运行状态
- 程序加载器:编译和加载 eBPF 程序到内核
- 事件监听器:接收内核上报的阻断事件和异常检测事件
- TC 管理器:管理出口方向的 TC qdisc 和 TBPF 程序
规则引擎
管理所有防火墙规则的完整生命周期:
- 规则的 CRUD 操作
- 多源规则聚合(手动、威胁情报、WAF、异常检测、SSH 防爆破)
- 规则冲突检测和位掩码管理
- 规则过期清理
认证授权
基于 Casbin RBAC 的细粒度权限控制:
- JWT 认证:用户登录获取 Token
- API Key:服务间调用的简化认证
- 验证码:防暴力破解
- RBAC:基于角色的访问控制
- SSH 防爆破:eBPF probes 实时监控,自动封禁暴力破解 IP
动态配置系统
支持运行时热更新各模块的核心配置:
- 通过 REST API 修改配置
- 配置持久化到数据库,启动时自动恢复
- 支持 failguard、waf、rate_limit、anomaly_detection、geo_blocking、intel、egress_limit 等 8 个模块
eBPF Map 结构
| Map 名称 | 类型 | Key | Value | 用途 |
|---|---|---|---|---|
block_ips | BPF_MAP_TYPE_HASH | IP 地址 | SourceMask + Expiry | 封禁 IP 列表 |
block_cidrs | BPF_MAP_TYPE_LPM_TRIE | CIDR 前缀 | SourceMask | 封禁 CIDR 列表 |
allow_ips | BPF_MAP_TYPE_HASH | IP 地址 | - | 白名单 IP 列表 |
allow_cidrs | BPF_MAP_TYPE_LPM_TRIE | CIDR 前缀 | - | 白名单 CIDR 列表 |
stats | BPF_MAP_TYPE_PERCPU_ARRAY | 索引 | 计数器 | 包计数统计 |
config | BPF_MAP_TYPE_ARRAY | 索引 | 配置值 | 运行时配置(含 GeoBlocking) |
anomaly_config | BPF_MAP_TYPE_ARRAY | 索引 | 配置值 | 异常检测采样配置 |
egress_config | BPF_MAP_TYPE_ARRAY | 索引 | EgressLimitConfig | 出口限速配置(速率/突发) |
egress_drop_event_config | BPF_MAP_TYPE_ARRAY | 索引 | EgressDropEventConfig | 出口丢包事件上报配置 |
egress_token_bucket | BPF_MAP_TYPE_HASH | 目标 IP | TokenBucketState | per-flow 令牌桶状态 |
模块交互
数据持久化
./data/
├── auth.db # 认证数据库(用户、API Key、审计日志)
├── business.db # 业务数据库(封禁记录、情报状态、动态配置)
├── intel/ # 威胁情报缓存
│ ├── ipsum.json
│ └── spamhaus.json
├── geo/ # GeoIP 缓存
│ ├── maxmind.json
│ └── GeoLite2-Country.mmdb
├── manual/ # 手动规则缓存
│ ├── rules.json # 黑名单规则
│ └── whitelist.json # 白名单规则
├── waf_offset.json # WAF 日志偏移量持久化
└── ratelimit_offset.json # Rate Limit 日志偏移量持久化
# 注意:FailGuard 不再需要偏移量文件(eBPF 模式无日志扫描)
./logs/
├── rho-aias.log # 主日志
├── blocklog/ # 阻断日志
│ ├── 2026-03-28_10.jsonl
│ └── 2026-03-28_11.jsonl
└── egresslog/ # Egress 丢包日志
├── 2026-04-17.jsonl
└── 2026-04-18.jsonl数据库分离说明
rho-aias 使用两个 SQLite 数据库:
| 数据库 | 路径 | 存储内容 |
|---|---|---|
| auth.db | ./data/auth.db | 用户账号、API Key、RBAC 策略、认证审计日志 |
| business.db | ./data/business.db | 封禁记录、威胁情报状态、GeoIP 状态、动态配置 |
这种分离设计便于:
- 安全隔离:认证数据和业务数据分开存储
- 备份策略:可针对不同数据库采用不同的备份频率
- 性能优化:高频繁写的 business.db 与低频读写的 auth.db 分离
性能特性
XDP 优势(入站)
| 特性 | 说明 |
|---|---|
| 零拷贝 | 数据包无需从内核拷贝到用户态 |
| 早期过滤 | 在协议栈之前丢弃,节省 CPU |
| 批量处理 | 支持批量数据包处理 |
| 卸载能力 | 部分网卡支持硬件卸载 |
TC eBPF 优势(出站)
| 特性 | 说明 |
|---|---|
| 内核态决策 | 令牌桶计算在内核完成,零上下文切换 |
| Per-Flow 控制 | 按目标 IP 独立计量,精确限速 |
| 低延迟 | 无需经过用户态,亚微秒级决策 |
性能指标
- 处理延迟(入站 XDP):亚微秒级
- 处理延迟(出站 TC):亚微秒级
- 吞吐量(XDP):单核 10M+ PPS
- 内存占用:规则越多,Map 占用越大
- CPU 开销:取决于规则数量和流量
安全考虑
最小权限
yaml
cap_drop:
- ALL
cap_add:
- CAP_BPF # 加载 eBPF 程序(XDP + TC + FailGuard probes)
- CAP_PERFMON # 性能监控
- CAP_NET_ADMIN # 网络管理(TC qdisc / XDP attach)
- CAP_NET_RAW # 原始套接字资源隔离
- WAF 日志只读挂载
- 数据目录独立管理
- 日志自动轮转
认证保护
- JWT Token 有效期限制
- 验证码防暴力破解
- API Key 权限细粒度控制
- 审计日志记录所有操作