防火墙(黑白名单)
概述
防火墙模块为 ipmi_mgmt 提供 IPMI 命令访问控制能力,包含两类互补机制:
- 标准 Firmware Firewall(
std_firewall_mgr):基于 IPMI 规范 App 命令(0x06/0x09~0x61),按通道与 SHM 路由表管理命令使能/禁用 - 自定义黑白名单(
bw_list_mgr):基于 OEM 命令(0x30/0x93子命令0x3F~0x4C)及 D-Bus 接口,维护运行时黑白名单策略
运行时拦截由传输层 firewall_filter 完成,位于过滤器链首位。策略语义见 filters.md。
IPMI 命令字段说明见 IPMI 命令介绍。
总体架构
┌──────────────────────────────────────────────────────────────────┐
│ 管理面(配置 / 查询) │
│ IPMI App 0x06/0x09~0x61 │ OEM 0x30/0x93/3F~4C │ D-Bus RPC │
│ std_firewall_mgr │ bw_list_mgr │ firewall_iface│
└───────────────┬──────────────────────────┬─────────────────────────┘
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────────┐
│ shm_bw_list(共享内存 _ipmi_cmd_list) │
│ bw_mode │ default_blacklist │ default_whitelist │
│ │ custom_blacklist │ custom_whitelist │
└───────────────────────────────┬──────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ firewall_filter(传输层) │
│ 默认黑 → 模式关闭放行 → BIOS POST 未完成放行 → 默认白 → 自定义策略 │
└──────────────────────────────────────────────────────────────────┘
| 模块 | 职责 |
|---|---|
std_firewall_mgr |
从 SHM 路由表枚举 NetFn/Cmd,读写命令使能掩码,联动自定义黑白名单 |
bw_list_mgr |
自定义黑白名单增删查、防火墙模式切换、同步 DB 对象 |
shm_bw_list |
共享内存 AVL 树存储与检索 |
firewall_filter |
按条目匹配拦截未授权命令(Completion Code 0xD4) |
防火墙模式
| 值 | 名称 | 说明 |
|---|---|---|
0x00 |
黑名单模式 | 命中自定义黑名单则拦截,其余放行 |
0x01 |
白名单模式 | 命中自定义白名单则放行,其余拦截 |
0xFF |
关闭 | 不启用自定义策略(仍受默认黑白名单约束) |
状态与模式通过 BWListOpenClose / BWListGetState 或 Firewall.Mode 属性维护。关闭时 State=0,开启时 State=1。
黑白名单条目格式
共享内存条目为定长前缀 + 可选 payload:
netfn(1) + cmd(1) + channel_protocol(1) + datas(0~30)
| 字段 | 说明 |
|---|---|
netfn |
IPMI NetFn |
cmd |
IPMI 命令字 |
channel_protocol |
通道协议:0x08(BT-15 带内)、0x01(IPMB-1.0 带外)、0xFF(全部通道) |
datas |
请求 payload 精确匹配数据;空串表示仅匹配 netfn/cmd/协议 |
持久化到 BlackListDb / WhiteListDb 时,条目格式化为十六进制连字符串(如 06-03-08)。
约束:
- 自定义条目最多 255 条;单条
datas最长 30 字节 - 不允许将
BWListAddDel自身(0x30/0x93/0x3F)加入名单 - 白名单模式不对带外生效:
channel_protocol不得为0xFF或0x01
名单类型
| 类型 | 存储 | 来源 |
|---|---|---|
default_blacklist |
SHM | CSR RestrictedIPMICmdList(ShiedFlag=0) |
default_whitelist |
SHM | CSR RestrictedIPMICmdList(ShiedFlag=1) |
custom_blacklist |
SHM | IPMI BWListAddDel、D-Bus add_item、标准防火墙禁用 |
custom_whitelist |
SHM | 同上(白名单方向) |
firewall_filter 检查顺序见 filters.md。标准防火墙 SetCommandEnables 通过向 custom 名单增删条目实现 per-channel 使能。
标准 Firmware Firewall
std_firewall_mgr 面向 NetFn 0x00~0x2F(偶数 NetFn 查询),数据来源于 SHM ipmi_route_table 已注册命令。
通道与协议映射
| 通道类型 | 典型 Channel ID | 协议 ch_pro |
|---|---|---|
| 带内(BT/SMS 等) | ch_sys 等 |
0x08(cp_bt_15) |
| 带外(LAN) | ch_lan1 / ch_lan2 |
0x01(cp_ipmb_10) |
请求中 ChannelNum=0x0E 表示“当前通道”,由 IPMI 上下文 chan_num 解析。
命令使能逻辑(calc_cmd_enable)
- 默认黑名单 → 禁用
- 默认白名单 → 启用
- 防火墙关闭 → 除 1 外均 启用
- 黑名单模式 → 自定义黑名单命中则 禁用
- 白名单模式 → 自定义白名单命中则 启用,否则 禁用
SetCommandEnables 掩码位 1 表示启用(从黑名单移除 / 加入白名单),0 表示禁用。掩码中请求启用路由表不存在的命令返回 0x80。
自定义黑白名单管理
bw_list_mgr
| 能力 | 说明 |
|---|---|
set_firewall_mode |
更新 SHM bw_mode 与 Firewall.Mode |
add_entry / remove_entry |
维护 custom 名单并同步 BlackListDb / WhiteListDb |
clear_list |
清空指定模式 custom 名单 |
get_entry |
按序号查询条目(供 BWListQueryCmd) |
OEM 子命令一览
| 子命令 | 命令名 | 功能 |
|---|---|---|
0x3F |
BWListAddDel |
增删自定义黑/白名单条目 |
0x4A |
BWListOpenClose |
开启/关闭防火墙,可选清空 custom 名单 |
0x4B |
BWListQueryCmd |
按序号查询名单条目 |
0x4C |
BWListGetState |
查询当前状态与模式 |
厂商 ID 固定为 0x0007db。详见 IPMI 命令介绍。
对象设计
Firewall
Class Name: Firewall
Object Path: /bmc/kepler/IpmiService/Firewall
| Property | Type | Description |
|---|---|---|
Mode |
uint8 |
防火墙模式(0x00 黑 / 0x01 白 / 0xFF 关闭) |
Methods(bmc.kepler.Firewall)
| Method | Description |
|---|---|
AddItem / DeleteItem |
增删自定义黑/白名单条目 |
Clear |
清空指定类型名单 |
GetList |
获取名单列表 |
AddWhiteList / RemoveWhiteList |
批量维护标准白名单项 |
GetWhiteList |
按通道/LUN 查询标准白名单 |
BlackListDb / WhiteListDb
| Object | Path | Property | Description |
|---|---|---|---|
BlackListDb |
/bmc/kepler/IpmiService/BlackListDb |
Items |
自定义黑名单持久化 |
WhiteListDb |
/bmc/kepler/IpmiService/WhiteListDb |
Items |
自定义白名单持久化 |
RestrictedIPMICmdList
CSR 下发的系统默认限制命令,on_register 时写入 SHM 默认黑/白名单。属性 ShiedFlag:0 为默认黑名单,1 为默认白名单。
配置导入导出
导入导出(import_export_engine)
{
"Com": {
"FireWallMode": {
"Import": true,
"Value": 0
}
}
}
Value:0黑名单 /1白名单 /255(0xFF)关闭Import=false时跳过
导出时 Com.FireWallMode 为当前模式值。
装备定制化(customize_engine)
| 字段 | 说明 |
|---|---|
BMCSet_FireWallMode |
目标模式 |
BMCSet_FirewallStatus |
0 关闭 / 1 开启;须与 Mode 一致(关闭时 Mode 必须为 0xFF) |
相关文件
| 路径 | 说明 |
|---|---|
src/bw_list/std_firewall_mgr.* |
标准 Firmware Firewall |
src/bw_list/bw_list_mgr.* |
自定义名单与模式管理 |
src/bw_list/shm_bw_list.* |
共享内存名单封装 |
src/bw_list/firewall_obj.* |
Firewall / DB / CSR 对象 |
src/mdb_intf/firewall/firewall_iface.* |
D-Bus RPC 实现 |
src/ipmi_cmd/cmd_handler.cpp |
IPMI 命令 handler |
src/filters/firewall_filter.h |
运行时过滤器 |
src/config_engine/import_export_engine.cpp |
配置导入导出 |
src/config_engine/customize_engine.cpp |
装备定制化 |
tests/test_firewall/ |
开发者测试 |
参见
- filters.md — 过滤器链与
firewall_filter行为 - transport_architecture.md — 传输层路由上下文
- config_engine.md — 导入导出引擎总览