NetXFW 使用多个 BPF Map 存储防火墙规则、连接跟踪和统计数据。合理的容量配置可以在内存占用和性能之间取得平衡。
| Map 名称 | 类型 | 说明 | 自动淘汰 |
|---|---|---|---|
conntrack_map |
LRU_HASH | 连接跟踪 | ✅ LRU |
static_blacklist |
LPM_TRIE | 静态黑名单 (别名: lock_list) | ❌ |
dynamic_blacklist |
LRU_HASH | 动态黑名单 (别名: dyn_lock_list) | ✅ LRU + TTL |
critical_blacklist |
HASH | 危机封锁 | ❌ |
whitelist |
LPM_TRIE | 白名单 | ❌ |
rule_map |
LPM_TRIE | IP+端口规则 (合并 allowed_ports + ip_port_rules) | ❌ |
ratelimit_map |
LRU_HASH | 速率限制 | ✅ LRU |
top_drop_map |
LRU_HASH | 丢弃统计 (别名: drop_reason_stats) | ✅ LRU |
top_pass_map |
LRU_HASH | 通过统计 (别名: pass_reason_stats) | ✅ LRU |
stats_global_map |
PERCPU_ARRAY | 全局统计 | ❌ |
global_config |
ARRAY | 全局配置 | ❌ |
jmp_table |
PROG_ARRAY | 尾调用表 | ❌ |
xsk_map |
XSKMAP | AF_XDP socket | ❌ |
#define CT_MAP_SIZE 100000 // 连接跟踪条目
#define RATELIMIT_MAP_SIZE 100000 // 速率限制条目
#define STATIC_BLACKLIST_SIZE 2000000 // 静态黑名单条目
#define DYNAMIC_BLACKLIST_SIZE 1000000 // 动态黑名单条目
#define CRITICAL_BLACKLIST_SIZE 10000 // 危机封锁条目
#define WHITELIST_SIZE 100000 // 白名单条目
#define RULE_MAP_SIZE 100000 // IP+端口规则条目
#define STATS_GLOBAL_SIZE 64 // 全局统计槽位
#define TOP_STATS_SIZE 1024 // Top 统计条目
#define GLOBAL_CONFIG_SIZE 32 // 全局配置槽位
在 config.yaml 中,通过 capacity 和 conntrack 部分配置:
conntrack:
enabled: true
max_entries: 100000 # conntrack_map 大小
tcp_timeout: "1h"
udp_timeout: "5m"
capacity:
lock_list: 2000000 # static_blacklist 大小
dyn_lock_list: 2000000 # dynamic_blacklist 大小
whitelist: 65536 # whitelist 大小
ip_port_rules: 65536 # rule_map 大小
rate_limits: 1000 # ratelimit_map 大小
drop_reason_stats: 1000000 # top_drop_map 大小
pass_reason_stats: 1000000 # top_pass_map 大小
适用于 16+ 核、32GB+ 内存的服务器:
conntrack:
enabled: true
max_entries: 100000
tcp_timeout: "1h"
udp_timeout: "5m"
capacity:
lock_list: 2000000 # 静态黑名单
dyn_lock_list: 2000000 # 动态黑名单
whitelist: 65536 # 白名单
ip_port_rules: 65536 # IP+端口规则
rate_limits: 1000 # 速率限制
drop_reason_stats: 1000000 # 丢弃统计
pass_reason_stats: 1000000 # 通过统计
内存估算: ~211 MB
conntrack:
enabled: true
max_entries: 50000
tcp_timeout: "30m"
udp_timeout: "2m"
capacity:
lock_list: 500000
dyn_lock_list: 500000
whitelist: 65536
ip_port_rules: 65536
rate_limits: 10000
drop_reason_stats: 100000
pass_reason_stats: 100000
内存估算: ~60 MB
适用于低配服务器、嵌入式设备:
base:
default_deny: true
allow_return_traffic: false
allow_icmp: true
persist_rules: true
cleanup_interval: "30s"
enable_pprof: false
conntrack:
enabled: true
max_entries: 50000
tcp_timeout: "30m"
udp_timeout: "2m"
capacity:
lock_list: 20000 # 静态黑名单
dyn_lock_list: 20000 # 动态黑名单
whitelist: 30 # 白名单
ip_port_rules: 50 # IP+端口规则
rate_limits: 1000 # 速率限制
drop_reason_stats: 5000 # 丢弃统计
pass_reason_stats: 5000 # 通过统计
rate_limit:
enabled: true
auto_block: true
auto_block_expiry: "5m"
metrics:
enabled: false
内存估算: ~8 MB
每个 Map 的内存占用估算:
| Map 类型 | 每条目大小 | 计算公式 |
|---|---|---|
| LPM_TRIE | ~80-120 字节 | 条目数 × 100 字节 |
| LRU_HASH | ~64-96 字节 | 条目数 × 80 字节 |
| HASH | ~64-96 字节 | 条目数 × 80 字节 |
| PERCPU_ARRAY | 按 CPU 核心数倍增 | 槽位数 × 结构体大小 × CPU数 |
conntrack_map: 100,000 × 80B = 8 MB
static_blacklist: 2,000,000 × 100B = 200 MB
dynamic_blacklist: 2,000,000 × 80B = 160 MB
whitelist: 65,536 × 100B = 6.5 MB
rule_map: 65,536 × 100B = 6.5 MB
ratelimit_map: 1,000 × 80B = 80 KB
top_drop_map: 1,000,000 × 64B = 64 MB
top_pass_map: 1,000,000 × 64B = 64 MB
-----------------------------------------
总计约: 509 MB (理论最大值)
注意: LRU Hash Map 采用懒分配,实际内存占用取决于实际使用的条目数。
| 场景 | conntrack | blacklist | whitelist | rule_map |
|---|---|---|---|---|
| Web 服务器 | 50,000 | 100,000 | 100 | 1,000 |
| API 网关 | 100,000 | 500,000 | 50 | 500 |
| DDoS 防护 | 200,000 | 2,000,000 | 200 | 100 |
| 内网防火墙 | 20,000 | 10,000 | 500 | 2,000 |
当修改 capacity 配置后执行 netxfw reload:
# 修改配置后热重载
sudo netxfw reload
# 或使用 system reload 进行无损更新
sudo netxfw system reload -i eth0