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 │ │ ├── constants.h │ │ ├── int_types.h │ │ └── types.h │ │ │ ├── loader/ │ │ ├── prog.c │ │ └── utils/ │ │ ├── cli.c/h │ │ ├── config.c/h │ │ ├── helpers.c/h │ │ ├── logging.c/h │ │ ├── stats.c/h │ │ └── xdp.c/h │ │ │ ├── xdp/ │ │ ├── prog.c │ │ └── utils/ │ │ ├── helpers.c/h │ │ ├── logging.c │ │ ├── maps.h │ │ ├── rl.c/h │ │ ├── rule.c/h │ │ └── stats.c/h │ │ │ ├── rule_add/ │ │ ├── prog.c │ │ └── utils/ │ │ └── cli.c/h │ │ │ └── rule_del/ │ ├── prog.c │ └── utils/ │ └── cli.c/h │ ├── modules/ │ └── xdp-tools/ │ ├── build/ │ ├── loader/ │ ├── xdp/ │ ├── rule_add/ │ └── rule_del/ │ ├── scripts/ │ ├── build.sh │ ├── clean.sh │ ├── install.sh │ ├── libxdp_build.sh │ ├── libxdp_clean.sh │ ├── libxdp_install.sh │ └── objdump.sh │ ├── other/ │ └── xdpfw.service │ ├── .github/workflows/ │ ├── 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() ├── print_tool_info() ├── setrlimit() ├── load_bpf_obj() ├── attach_xdp() ├── get_map_fd() ├── pin_bpf_map() ├── update_filters() └── 主循环: ├── 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 map_block map_block6 map_filters map_range_drop map_rl_ip map_rl_flow map_filter_log
|
协议支持
- 网络层: IPv4, IPv6
- 传输层: TCP, UDP, ICMP
- 匹配条件: IP地址/CIDR、端口范围、TTL、TOS、TCP标志等
🏗️ 4. 架构特点
模块化设计
- loader/ - 用户态控制平面
- xdp/ - 内核态数据平面
- common/ - 共享定义
- rule_add/rule_del/ - 管理工具
配置双模式
- 编译期配置 - src/common/config.h(宏定义,ENABLE_FILTERS等)
- 运行时配置 - /etc/xdpfw/xdpfw.conf(libconfig格式)
动态规则管理
- BPF Maps 固定到 /sys/fs/bpf/xdpfw/
- CLI工具通过 pinned maps 与运行中的防火墙通信
- 支持运行时添加/删除规则而无需重启