Purpose and Scope

XDP 防火墙是一款兼顾性能与灵活性的无状态防火墙,它依托 eBPF(扩展伯克利数据包过滤器)技术,在 Linux 网络协议栈的最早期阶段对网络数据包进行处理。相较于运行在网络协议栈更上层的 iptables、nftables 等传统防火墙,这种实现方式的延迟显著更低。

该防火墙具备动态过滤、源 IP 封禁、IP 段丢弃、实时数据包计数等功能。在抵御非伪造源 DDoS 攻击、实现高性能数据包过滤方面效果尤为突出,非常适合网络管理员、安全技术人员,以及关注 XDP/eBPF 技术的相关人员使用。

📁 1. 项目目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
XDP-Firewall/
├── src/ # 源代码目录
│ ├── common/ # 公共模块(类型定义、配置)
│ │ ├── all.h # 统一包含头文件
│ │ ├── config.h # 编译期配置(ENABLE_FILTERS 等宏)
│ │ ├── constants.h # 常量定义
│ │ ├── int_types.h # 整数类型定义(u8, u16, u32, u64, u128)
│ │ └── types.h # 核心数据结构(filter_t, stats_t 等)
│ │
│ ├── loader/ # 主程序加载器(xdpfw)
│ │ ├── prog.c # 主入口(main函数)
│ │ └── utils/ # 工具函数
│ │ ├── cli.c/h # 命令行参数解析
│ │ ├── config.c/h # 配置文件解析(libconfig)
│ │ ├── helpers.c/h # 辅助函数(IP解析、工具函数)
│ │ ├── logging.c/h # 日志系统
│ │ ├── stats.c/h # 统计信息处理
│ │ └── xdp.c/h # XDP/BPF 操作封装
│ │
│ ├── xdp/ # XDP BPF程序(内核态)
│ │ ├── prog.c # XDP程序入口(xdp_prog_main)
│ │ └── utils/ # XDP工具函数
│ │ ├── helpers.c/h # XDP辅助函数
│ │ ├── logging.c # XDP日志记录
│ │ ├── maps.h # BPF Map定义
│ │ ├── rl.c/h # 速率限制(Rate Limiting)
│ │ ├── rule.c/h # 过滤规则处理
│ │ └── stats.c/h # 统计数据更新
│ │
│ ├── rule_add/ # CLI工具:添加规则(xdpfw-add)
│ │ ├── prog.c # 入口文件
│ │ └── utils/
│ │ └── cli.c/h # 命令行解析
│ │
│ └── rule_del/ # CLI工具:删除规则(xdpfw-del)
│ ├── prog.c # 入口文件
│ └── utils/
│ └── cli.c/h # 命令行解析

├── modules/ # 外部依赖(子模块)
│ └── xdp-tools/ # XDP Tools(libxdp + libbpf)

├── build/ # 构建输出目录
│ ├── loader/ # xdpfw 二进制
│ ├── xdp/ # xdp_prog.o BPF对象
│ ├── rule_add/ # xdpfw-add 二进制
│ └── rule_del/ # xdpfw-del 二进制

├── scripts/ # 构建脚本
│ ├── build.sh
│ ├── clean.sh
│ ├── install.sh
│ ├── libxdp_build.sh
│ ├── libxdp_clean.sh
│ ├── libxdp_install.sh
│ └── objdump.sh

├── other/ # 其他文件
│ └── xdpfw.service # systemd服务文件

├── .github/workflows/ # CI/CD
│ ├── build.yml # 构建验证
│ └── run.yml # 运行时测试

├── Makefile # 主构建文件
├── install.sh # 安装脚本
├── xdpfw.conf.example # 配置文件示例
└── README.md # 项目文档

🚀 2. 入口文件和核心流程

三个主要入口点:

入口文件 程序 功能
src/loader/prog.c xdpfw 主防火墙程序,加载XDP程序到网卡
src/rule_add/prog.c xdpfw-add 动态添加过滤规则/IP到阻止列表
src/rule_del/prog.c xdpfw-del 动态删除过滤规则/IP从阻止列表

核心执行流程(xdpfw 主程序):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
main() [loader/prog.c:97]
├── parse_cli() # 解析命令行参数
├── load_cfg() # 加载配置文件(libconfig)
├── print_tool_info() # 打印工具信息
├── setrlimit() # 提升内存限制(需要root)
├── load_bpf_obj() # 加载BPF对象文件(libxdp)
├── attach_xdp() # 附加XDP程序到网卡(DRV/SKB/Offload模式)
├── get_map_fd() # 获取BPF Map文件描述符
├── pin_bpf_map() # 固定Map到文件系统(供CLI工具访问)
├── update_filters() # 更新过滤规则到BPF Map
└── 主循环:
├── calc_stats() # 计算并显示统计数据
├── poll_filters_rb() # 轮询过滤器日志环形缓冲区
└── 信号处理(SIGINT/SIGTERM)清理资源

XDP BPF 程序流程(内核态):

1
2
3
4
5
6
7
8
9
10
11
12
xdp_prog_main() [xdp/prog.c:27]
├── 解析以太网头部
├── 检查协议(IPv4/IPv6)
├── 检查IP头部有效性
├── 处理TCP/UDP/ICMP协议
├── 检查阻止列表(map_block/map_block6)
├── 检查IP范围丢弃(map_range_drop)[可选]
├── 遍历过滤规则(map_filters)[可选]
│ ├── 匹配IP、端口、标志等
│ ├── 速率限制检查(map_rl_ip/map_rl_flow)
│ └── 执行动作(DROP/ALLOW)
└── 更新统计数据(map_stats)

🛠️ 3. 技术栈和框架

编程语言

类型 语言 用途
用户态 C 加载器、CLI工具、配置管理
内核态 C (eBPF/BPF) XDP程序、包过滤逻辑

核心内核技术

  • XDP (eXpress Data Path) - Linux内核网络数据包处理框架
  • eBPF (Extended Berkeley Packet Filter) - 内核字节码虚拟机
  • BPF Maps - 内核-用户空间共享数据结构

关键库依赖

用途 来源
libxdp XDP程序加载和管理 xdp-tools子模块
libbpf BPF对象操作 xdp-tools子模块
libconfig 配置文件解析(.conf文件) 系统包管理器
libelf ELF文件操作 系统包管理器

系统依赖

  • clang/LLVM - 编译BPF程序(-target bpf)
  • bpftool - BPF工具(linux-tools包)
  • 内核要求:
    • 内核 5.3+(支持BPF循环)
    • 内核 5.17+(推荐,支持 bpf_loop())

BPF Map 类型(关键数据结构)

1
2
3
4
5
6
7
8
map_stats        # 统计数据(per-CPU array)
map_block # IPv4阻止列表(hash map)
map_block6 # IPv6阻止列表(hash map)
map_filters # 动态过滤规则(array)
map_range_drop # IP范围丢弃(LPM trie)
map_rl_ip # IP速率限制(LRU hash)
map_rl_flow # 流速率限制(LRU hash)
map_filter_log # 过滤器日志(ring buffer)

协议支持

  • 网络层: IPv4, IPv6
  • 传输层: TCP, UDP, ICMP
  • 匹配条件: IP地址/CIDR、端口范围、TTL、TOS、TCP标志等

🏗️ 4. 架构特点

模块化设计

  • loader/ - 用户态控制平面
  • xdp/ - 内核态数据平面
  • common/ - 共享定义
  • rule_add/rule_del/ - 管理工具

配置双模式

  1. 编译期配置 - src/common/config.h(宏定义,ENABLE_FILTERS等)
  2. 运行时配置 - /etc/xdpfw/xdpfw.conf(libconfig格式)

动态规则管理

  • BPF Maps 固定到 /sys/fs/bpf/xdpfw/
  • CLI工具通过 pinned maps 与运行中的防火墙通信
  • 支持运行时添加/删除规则而无需重启