littlewolf9527/xdrop
GitHub: littlewolf9527/xdrop
基于 XDP/eBPF 的分布式高性能包过滤系统,通过中央 Controller 统一管理多节点规则,实现驱动层线速丢弃、限速与放行。
Stars: 11 | Forks: 0
XDrop
分布式 XDP/eBPF 防火墙,具备线速包过滤能力和中央管理 Controller。
[](https://go.dev)
[](https://vuejs.org)
[](LICENSE)
[](https://claude.com/product/claude-code)
[中文文档](README.zh.md)
## 什么是 XDrop?
XDrop 是一个基于 Linux XDP (eXpress Data Path) 构建的分布式、高性能包过滤系统。它将 BPF 程序直接挂载到网络接口驱动上——完全绕过内核网络栈——以便在接收路径中尽可能早的阶段对流量进行丢弃、放行或限速处理。
该系统包含两个组件:
- **Node Agent** — 运行在每个过滤主机上,管理 BPF 数据平面,并暴露 REST API
- **Controller** — 中央管理平面,带有 Web UI,将规则存储在 SQLite 中,并将其推送到所有注册的节点

```
┌──────────────────────────────────────────────────────────────────────┐
│ Controller │
│ │
│ ┌──────────────┐ ┌─────────────┐ ┌────────────┐ ┌────────┐ │
│ │ Web UI │ │ REST API │ │ Sync │ │SQLite │ │
│ │ (Vue 3 + │ │ (Gin) │ │ Scheduler │ │ DB │ │
│ │ ECharts) │ │ │ │ │ │ │ │
│ └──────────────┘ └─────────────┘ └────────────┘ └────────┘ │
└─────────────────────────────────┬────────────────────────────────────┘
│ HTTP (rule push / health poll)
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Node 1 │ │ Node 2 │ │ Node N │
│ Agent │ │ Agent │ │ Agent │
│ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │
│ │XDP/BPF │ │ │ │XDP/BPF │ │ │ │XDP/BPF │ │
│ └────────┘ │ │ └────────┘ │ │ └────────┘ │
└────────────┘ └────────────┘ └────────────┘
Wire-speed ↑ Wire-speed ↑ Wire-speed ↑
```
## 核心特性
### BPF 数据平面
- **线速过滤** — XDP 程序在 `sk_buff` 分配之前运行;即使在普通硬件上也能接近线路速率
- **五元组匹配** — 源/目的 IP、源/目的端口、协议
- **IPv4 和 IPv6** — 统一的规则格式;IPv4 在内部存储为 IPv4-mapped IPv6
- **CIDR 规则** — 每个方向使用 LPM trie (源或目的前缀);支持 /0–/128
- **Whitelist** — 在任何黑名单规则之前检查 hash map 绕过
- **动作** — `drop` (丢弃)、`rate_limit` (令牌桶限速,可配置 PPS)、`pass` (放行)
- **包长度过滤** — `pkt_len_min` / `pkt_len_max` (L3 总长度)
- **位图优化** — 64 位位图编码了 34 种字段组合中哪些具有活动规则;BPF 跳过没有规则的组合,保持热路径 O(1)
- **每规则统计** — Agent 聚合每个 CPU 的 `match_count` 和 `drop_count`
### AtomicSync (双缓冲规则发布)
规则更新遵循 RCU 风格的双缓冲协议,以消除写入规则和更新查找位图之间的竞争条件:
1. 将规则写入 BPF hash map
2. 在影子配置 map 中构建更新的配置(位图、计数)
3. 单次原子写入翻转 `active_config` 选择器 — BPF 原子切换
这保证了 BPF 数据路径永远不会看到不一致的位图/规则状态。
### 部署模式
| 模式 | 描述 |
|------|-------------|
| **传统模式** | 单网卡,XDP 内联挂载在一个接口上 |
| **快速转发** | 双网卡网关 — 在入站和出站接口上均挂载 XDP;透明 L2 网桥 |
### 管理平面
- 中央规则存储在 SQLite 中,提供完整的 CRUD 和批量 API
- 可配置的同步间隔,带有强制同步端点 (`POST /api/v1/nodes/:id/sync`)
- 节点健康监控,自动更新在线/离线状态
- Web UI:实时流量仪表盘、节点概览、规则管理、Whitelist 编辑器
- Controller 和 Node 均可选配 API Key 认证
## 仓库布局
```
xdrop/
├── node/
│ ├── bpf/ # XDP program in C (xdrop.c / xdrop.h)
│ └── agent/ # Go agent — BPF loader, API server, AtomicSync engine
├── controller/
│ ├── cmd/ # Binary entry point
│ ├── internal/ # API, service, repository, scheduler, client
│ └── web/ # Vue 3 + Element Plus + ECharts frontend
└── scripts/ # Build and service management scripts
```
- [Node Agent →](node/README.md) — XDP 数据平面、BPF maps、AtomicSync、API
- [Controller →](controller/README.md) — 管理平面、Web UI、同步引擎
## 系统要求
| 组件 | 要求 |
|-----------|-------------|
| Node Agent | Linux kernel ≥ 5.4, clang ≥ 11, Go ≥ 1.21, root / CAP_NET_ADMIN |
| Controller | Go ≥ 1.21, Node.js ≥ 18 (仅构建时需要) — 可运行于任何 OS |
有关分步环境设置指南,请参阅 **[快速入门](GETTING_STARTED.md)**。
## 快速开始
### 1. 构建
```
# Build controller (frontend + Go binary)
./scripts/build-controller.sh
# Build node agent (BPF program + Go binary) — run on a Linux host
./scripts/build-node.sh
```
### 2. 配置
```
# Controller
cp controller/config.example.yaml controller/config.yaml
# Edit: set jwt_secret, external_api_key, and add nodes under the nodes: section
# Node agent
cp node/config.example.yaml node/config.yaml
# Edit: set interface name, node_api_key, sync_key
```
### 3. 启动
```
# Controller (no root required)
./scripts/controller.sh start
# Node agent (requires root — XDP needs CAP_NET_ADMIN)
sudo ./scripts/node.sh start
# Check status
./scripts/controller.sh status
sudo ./scripts/node.sh status
```
Web UI 默认可通过 `http://
:8000` 访问。
## API 概览
Controller 和 Node 均在 `/api/v1/` 暴露版本化的 REST API。
| 资源 | 端点 | 备注 |
|----------|----------|-------|
| Rules | `GET/POST /api/v1/rules` | 分页: `?page=&limit=` |
| Rule | `GET/PUT/DELETE /api/v1/rules/:id` | |
| 批量规则 | `POST/DELETE /api/v1/rules/batch` | |
| Whitelist | `GET/POST/DELETE /api/v1/whitelist` | |
| Stats | `GET /api/v1/stats` | PPS, 丢弃计数, XDP 信息 |
| Nodes | `GET/POST /api/v1/nodes` | 仅 Controller |
| 强制同步 | `POST /api/v1/nodes/:id/sync` | 仅 Controller |
Node API 需要 `X-API-Key` 头。Controller API Key 是可选的(可配置)。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
BPF/C 内核程序 (`node/bpf/`) 按 Linux 内核 BPF 子系统要求采用 GPL-2.0 许可。
完全使用 Claude Code 构建 — 包括 XDP/BPF 内核程序、Go 并发和 Vue 前端。标签:DDoS防御, Docker镜像, EVTX分析, Go语言, Linux内核, MacOS取证, SQLite, TCP SYN 扫描, Vue3, Web UI, XDP, 仪表盘, 分布式系统, 包过滤, 响应大小分析, 开源, 控制器, 日志审计, 流量控制, 程序破解, 线速处理, 绕过内核协议栈, 网络安全, 网络防护, 节点代理, 防火墙, 隐私保护, 集中管理