English | 中文
eShield 是基于 eBPF/XDP 的主机级 L3-L4 网络防护系统,用于在 Linux 内核网络协议栈之前拦截 SYN Flood、UDP Flood、ICMP Flood、扫描探测与连接耗尽类流量。项目由 Rust 实现,包含 eBPF 数据面、用户态控制面、分布式策略 Hub、Web 控制台、CLI 与 TUI。
- 1. 项目概述
- 2. 能力范围
- 3. 系统架构
- 4. 环境要求
- 5. 构建与安装
- 6. 快速开始
- 7. 配置参考
- 8. 运行时操作
- 9. 分布式 Hub
- 10. 可观测性
- 11. 性能特征
- 12. 测试
- 13. 项目结构
- 14. 安全边界与限制
- 15. 文档索引
- 16. 许可证
eShield 将过滤逻辑部署在网卡驱动层的 XDP 钩子上。数据包在进入内核协议栈之前完成解析、规则匹配与丢弃决策,避免恶意流量消耗协议栈、连接表和应用进程资源。
系统定位为主机级第一道防线,适用于单机、边缘节点、源站、游戏服务器与内部服务等场景。系统不替代云清洗、CDN 或运营商级 DDoS 清洗设备,无法突破物理链路带宽上限。
主要组成部分:
| 组件 | 说明 |
|---|---|
eshield-ebpf |
XDP/eBPF 数据面,负责每包解析、规则匹配、丢弃、TCP RST 与 SYN Cookie 回包。 |
eshield |
用户态控制面,负责配置、API、Web 控制台、TUI、持久化、审计、告警与 Hub 同步。 |
eshield-common |
数据面与控制面共享的结构体、常量与纯函数。 |
eshield-hub |
分布式策略聚合服务,负责多节点策略共享、节点注册与每节点 Token 管理。 |
xtask |
构建任务封装,固定 eBPF 工具链与目标平台。 |
| 能力 | 说明 |
|---|---|
| eBPF/XDP 早期过滤 | 在网卡驱动层完成丢弃决策,不经过内核协议栈。 |
| CIDR 白名单 | 基于 LPM Trie,支持 IPv4/IPv6,白名单命中后尽早放行。 |
| 动态黑名单 | 基于 LRU Hash,支持永久与限时封禁,到期自动解封。 |
| Per-IP 速率限制 | 指数衰减滑动窗口,用于识别突发连接与请求。 |
| 按目的端口限速 | 按协议与目的端口维度限速,降低换源 IP 绕过 per-IP 限速的风险。 |
| UDP/ICMP Flood 防护 | 对无连接流量执行 per-IP 与按端口速率抑制。 |
| 端口/协议 ACL | 支持 tcp、udp、icmp、icmpv6、any,支持端口、端口范围与通配。 |
| SYN Cookie 代理 | IPv4 TCP SYN Flood 场景下返回 SYN-ACK Cookie,验证合法 ACK 后放行。 |
| TCP RST 回包 | 对被丢弃的 TCP 连接回复 RST,减少客户端重传堆积。 |
| GeoIP/ASN 过滤 | 基于 CSV CIDR 列表按国家或 ASN 放行/封禁,支持 default_action。 |
| 威胁情报联动 | 定时同步外部 feed,批量写入黑名单或白名单。 |
| L7 指纹扫描 | 检查 TCP 首包特征,用于识别扫描与探测行为。 |
| 连接跟踪/CC 防御 | 可选模块,对单源半连接计数,仅 SYN/ACK/RST 访问 map,超阈值丢弃。 |
| 防护项目 | 按目标 IPv4、端口、协议组合策略,支持 PASS、DROP 与 DEFEND。 |
| 自适应阈值 | 按时间窗口聚合事件,对重复触发规则的源提升封禁时长。 |
| Trust Score | IP 双向信誉评分,PASS 加分、DROP 减分,动态调制速率阈值。 |
| Danger Signal | 根据系统负载与攻击强度调整全局危险等级与阈值。 |
| 数据包采样日志 | 按采样率上报 DROP 包,用于溯源与取证。 |
| 能力 | 说明 |
|---|---|
| Web 控制台 | Vue 3 + TypeScript 单文件 SPA(console/),跟随系统亮/暗色,文本导航、命令面板与高密度表格。 |
| CLI 与 TUI | eshield start/status/block/unblock/reload/check/tui/reset-token。 |
| 配置热加载 | 通过 SIGHUP 或 systemctl reload 重新加载配置。 |
| 认证 | 可选 Bearer Token;本机回环请求跳过 Token 校验。 |
| 持久化 | 动态规则与时序指标写入 redb,进程重启后恢复。 |
| 审计 | 内存或 JSON Lines 审计后端,支持 SSE 实时流与 CSV 导出。 |
| 指标 | Prometheus /metrics 与 JSON /api/stats。 |
| 告警 | 支持 Webhook 告警与阈值、冷却时间配置。 |
| 分布式策略 | Hub 聚合多节点策略;支持 master token 与每节点 Token。 |
| 内核兼容 | 固定 nightly-2026-07-31 与 bpf-linker 0.10.4;支持 ESHIELD_XDP_MODE=skb 规避虚拟网卡原生 XDP 问题。 |
┌──────────────────────────────────────────────────────────────┐
│ 管理面 │
│ Web 控制台(axum) │ CLI(clap) │ TUI(ratatui) │
└──────────────────────────────┬───────────────────────────────┘
│ REST API / SSE / 配置监听
┌──────────────────────────────▼───────────────────────────────┐
│ 控制面(Rust 用户态) │
│ 配置管理 │ 事件消费 │ 自适应引擎 │ 持久化 │ 指标 │ 审计 │ Hub │
└──────────────────────────────┬───────────────────────────────┘
│ BPF Maps / Ring Buffer
┌──────────────────────────────▼───────────────────────────────┐
│ 数据面(eBPF/XDP) │
│ 包解析 → 白名单 → 端口 ACL → 黑名单 → 防护项目 → GeoIP │
│ → 连接跟踪 → TCP(SYN Cookie/SYN Flood)→ UDP/ICMP Flood │
│ → L7 指纹 → 速率限制 → Trust/统计 → 决策 │
└──────────────────────────────────────────────────────────────┘
数据包旅程、BPF Map 布局与状态机细节见 docs/architecture.md。
-
Linux 内核 5.10 或更高版本,并启用 BTF:
ls /sys/kernel/btf/vmlinux
-
root 权限或以下 capabilities:
CAP_BPF、CAP_NET_ADMIN、CAP_NET_RAW、CAP_PERFMON、CAP_IPC_LOCK。 -
支持 XDP 的网卡;虚拟网卡环境建议使用 SKB 通用模式。
- stable Rust 工具链(构建用户态与 Hub)。
- nightly 工具链固定为
nightly-2026-07-31,用于 eBPF 构建,需要rust-src与clippy组件。 bpf-linker 0.10.4。- clang/LLVM、libelf、musl 工具链。
x86_64-unknown-linux-muslRust target。
构建工具链可通过以下环境变量覆盖:
| 变量 | 作用 |
|---|---|
ESHIELD_EBPF_TOOLCHAIN |
覆盖 eBPF 构建使用的 nightly 工具链。 |
ESHIELD_XDP_MODE |
设为 skb 或 generic 时强制 SKB 通用模式挂载。 |
ESHIELD_INTERFACE |
覆盖配置中的监听网卡。 |
Windows 主机无法直接构建或运行本项目。构建与测试应在 WSL2、Linux 虚拟机或 Linux 云主机中进行。
sudo bash scripts/install.sh --build安装脚本执行以下操作:
- 使用固定 nightly 工具链构建 eBPF 程序。
- 使用 musl target 静态构建用户态二进制。
- 安装
eshield到/usr/local/bin。 - 创建默认配置
/etc/eshield/config.toml。 - 安装并启用 systemd 服务。
export ESHIELD_EBPF_TOOLCHAIN=nightly-2026-07-31
cargo xtask build-ebpf
cargo build --package eshield --target x86_64-unknown-linux-musl --release
cargo build --package eshield-hub --release构建产物:
target/x86_64-unknown-linux-musl/release/eshield
target/release/eshield-hub
target/bpfel-unknown-none/release/eshield
eBPF 目标文件由 include_bytes_aligned! 嵌入用户态二进制,部署时仅需分发用户态可执行文件。
interface = "eth0"
web_bind = "0.0.0.0:8720"
api_token = "replace-with-a-random-token"
whitelist = ["10.0.0.0/8"]
blacklist = []
[rate_limit]
enabled = true
threshold = 200
tick_ms = 100
decay_num = 7
decay_den = 8
block_duration_s = 300
[syn_proxy]
enabled = true
[conn_track]
enabled = false
threshold = 20
window_ms = 10000完整配置示例见 packaging/config.example.toml。
sudo eshield start --config /etc/eshield/config.toml控制台默认监听 http://<host>:8720/。未设置 api_token 时,系统生成随机 Token 并在日志中输出前缀;可通过 eshield reset-token 重置。
sudo systemctl start eshield
sudo systemctl status eshield
sudo systemctl stop eshield
sudo systemctl reload eshield
sudo journalctl -u eshield -freload 触发 SIGHUP,重新加载配置文件,不中断 XDP 挂载。
在 veth、bridge 等虚拟网卡上,原生 XDP_TX 可能触发内核异常。测试环境建议:
ESHIELD_XDP_MODE=skb sudo eshield start --config /etc/eshield/config.toml集成测试脚本通过 ESHIELD_TEST_XDP_MODE=skb 统一使用 SKB 模式。
默认配置路径为 /etc/eshield/config.toml。
| 配置段 / 字段 | 作用 |
|---|---|
interface |
XDP 挂载网卡。 |
web_bind |
Web/API 监听地址,默认 0.0.0.0:8720。 |
api_token |
Bearer Token;未设置时生成随机 Token。 |
whitelist / blacklist |
启动时加载的静态 CIDR 白名单与永久黑名单。 |
[rate_limit] |
per-IP 指数衰减速率限制与触发封禁时长。 |
[port_rate_limit] |
按协议与目的端口的固定窗口限速。 |
[syn_proxy] |
IPv4 SYN Cookie 代理开关。 |
[udp_flood] / [icmp_flood] |
无连接 Flood 防护开关。 |
[l7_scan] |
TCP 首包指纹匹配。 |
[adaptive] |
重复触发规则的自动封禁窗口与阈值。 |
[geoip] |
基于国家/地区或 ASN 的 CSV CIDR 放行/封禁。 |
[threat_intel] |
外部威胁情报 feed 同步。 |
[trust_score] |
IP 双向信誉评分与除数配置。 |
[danger_signal] |
系统危险等级监测与阈值调整。 |
[conn_track] |
可选连接跟踪/半连接 CC 防御。 |
[port_acl] |
端口/协议 allow/drop 规则。 |
[protection_projects] |
按目标 IPv4、端口、协议组合的防护项目。 |
[packet_log] |
DROP 包采样日志。 |
[hub] |
分布式 Hub 同步配置。 |
timeseries_retention_days |
时序指标保留天数。 |
[audit] |
审计后端与文件轮转配置。 |
[alert] |
Webhook 告警地址、类型、阈值与冷却时间。 |
配置约束:
protection_projects.target_ips不能为空,且至少包含一个 IPv4 目标;数据面仅支持 IPv4 精确匹配,CIDR 由控制面展开,下限为/24,项目策略上限 8192 条。port_acl最多 32 条,l7_scan.patterns最多 8 条。该上限用于满足内核 7.0 verifier 的 100 万指令处理限制。conn_track.threshold与conn_track.window_ms必须大于 0。
# 启动守护进程
sudo eshield start --config /etc/eshield/config.toml
# 查看本机状态
eshield status
# 封禁 IP;duration 为 0 表示永久
eshield block 192.0.2.1 --duration 300
# 解封 IP
eshield unblock 192.0.2.1
# 重新加载配置
eshield reload
# 校验配置
eshield check --config /etc/eshield/config.toml
# 启动 TUI
eshield tui
# 远程 API
eshield status --endpoint http://eshield-host:8720
eshield block 192.0.2.1 --endpoint http://eshield-host:8720
# 重置控制台 Token
eshield reset-token- 设置
api_token后,Dashboard、/api/*与/metrics需要Authorization: Bearer <token>。 - 本机 CLI 通过回环地址访问时自动跳过 Token 校验。
- Web 控制台支持通过
/login页面设置 Cookie,用于浏览器访问。
sudo systemctl reload eshield
sudo kill -HUP $(pidof eshield)eshield-hub 用于多节点策略聚合与共享。
eshield-hub --bind 0.0.0.0:9930 --token "master-token"生产环境应在 Hub 前部署 TLS 终止层,例如 nginx 或 Caddy。
eshield-hub --bind 0.0.0.0:9930 \
--token "master-token" \
--node-tokens-file /etc/eshield-hub/node-tokensnode-tokens 文件每行格式为 node_name:token,支持 # 注释与空行。节点专属 Token 认证成功后,Hub 使用认证节点名记录策略与限流,避免请求体伪造 node_name。master token 保持兼容。
[hub]
enabled = true
urls = ["https://hub.example.com:9930"]
node_name = "web-tier-01"
token = "node-token"
sync_pull_interval_s = 10
sync_push_interval_s = 5
sync_rules_enabled = true节点在 Hub 不可用时保持本地策略自治,并自动重试同步。
控制台默认地址为 http://<host>:8720/,前端为 console/ 下的 Vue 3 + TypeScript 单文件 SPA,
由 include_str!("../web/app.html") 嵌入二进制;跟随系统亮/暗色,导航与操作以文本为主。
页面组成:
| 页面 | 内容 |
|---|---|
| 总览 | KPI 卡片、流量与拦截趋势、拦截原因分布、TOP 攻击源、防护模块状态与最近事件。 |
| 攻击事件 | 事件列表、协议/动作筛选、批量封禁、IP 详情抽屉。 |
| 包日志 | RingBuf 采样包、TCP 标志与载荷预览、数据包详情抽屉。 |
| 审计日志 | 控制面写操作、来源筛选、SSE 实时流。 |
| 防护模块 | 全部模块的开关与阈值,改动运行时生效。 |
| 访问控制 | 黑名单、白名单、端口 ACL 的增删改查。 |
| L7 指纹 | 特征串 / 掩码编辑与本地匹配预演。 |
| 防护项目 | 目标 + 端口 + 模块位图编排,PASS / DROP / DEFEND。 |
| GeoIP 与情报 | 国家 / ASN 策略与威胁情报源。 |
| 规则与 Hub | 节点列表、规则包结构与同步状态。 |
| 系统设置 | 运行参数、告警、Token 管理与危险信号。 |
控制台支持:
Ctrl/Cmd+K:命令面板,支持页面跳转、刷新、切换主题、快捷封禁/加白。/:打开搜索/命令面板;R:手动刷新统计。- 主题跟随操作系统
prefers-color-scheme,并可在顶栏手动切换。
前端工程、构建方式与示例截图见 console/README.md。
http://<host>:8720/metrics
主要指标包括:
eshield_dropped_totaleshield_passed_totaleshield_blacklist_blocked_totaleshield_rate_limited_totaleshield_syn_flood_blocked_totaleshield_udp_flood_blocked_totaleshield_icmp_flood_blocked_totaleshield_geoip_blocked_totaleshield_conn_track_blocked_totaleshield_dropped_by_protocol_total
curl -H "Authorization: Bearer <token>" http://<host>:8720/api/stats | jq完整 API 说明见 docs/api.md。
GET /api/audit:查询审计事件,支持limit、ip、action、from、to。GET /api/audit/stream:SSE 实时推送。- 审计后端支持内存与 JSON Lines 文件;文件后端支持大小轮转。
eshield tui- 正常流量仅增加少量 eBPF map 查询与分支判断。
- 可选模块默认关闭;未启用模块在数据面快速跳过。
- 攻击期高频写路径采用采样与批量策略,降低 map 写放大。
- 控制面同步任务不位于每包路径。
测试环境:Linux 内核 7.0,8 vCPU,netns + veth,iperf3 -c <server> -t 5 -P 4 大包 TCP。
| 场景 | 吞吐 | 说明 |
|---|---|---|
| Baseline(无 XDP) | 274.44 Gbps | veth 本机内存拷贝上限 |
| 最小 XDP_PASS 程序(原生模式) | 12.83 Gbps | veth 原生 XDP 自身瓶颈 |
| eShield PASS(原生模式,空规则) | 11.85 Gbps | 相对最小程序约 -7.6% |
| 最小 XDP_PASS 程序(SKB 通用模式) | 124.62 Gbps | 通用模式在 veth 上更快 |
| eShield PASS(SKB 通用模式,空规则) | 112.30 Gbps | 相对最小程序约 -9.9% |
| eShield PASS(原生模式,模块启用但不触发 DROP) | 11.81 Gbps | 相对空规则约 -0.3% |
基准结论:
- veth 原生 XDP 是主要瓶颈,eShield 程序相对最小 XDP_PASS 程序增加约 7%–10% 开销。
- 大包 TCP 场景下,启用速率限制、Trust、连接跟踪等模块后额外开销低于 1%。
- 大包 1500B 下,原生模式约 1 Mpps,SKB 通用模式约 9–10 Mpps。
- 小包、高 pps 与物理网卡线速必须通过真实网卡、
xdp-bench或pktgen复测,不能由本表推算。
| 路径 | 策略 |
|---|---|
| Trust PASS 更新 | 1/64 采样写入,按 64 倍权重补偿。 |
| Trust DROP 更新 | 信任分已归零的源 1/16 采样写入。 |
| Blacklist hit_count | 1/16 采样写入,单次补 16。 |
| TOP_ATTACKERS 热榜 | 1/16 采样写入,单次补 16。 |
| 黑名单命中 RingBuf 事件 | 不再写入,计数由全局统计与 hit_count 覆盖。 |
详细基准方法与数据见 docs/benchmark.md。
cargo test --workspace --exclude eshield-ebpf集成测试需要 root 权限,并在 network namespace 中运行。虚拟网卡环境建议使用 SKB 模式。
sudo ESHIELD_TEST_XDP_MODE=skb bash tests/netns_test.sh
sudo ESHIELD_XDP_MODE=skb bash tests/hub_node_test.sh
sudo ESHIELD_XDP_MODE=skb bash tests/full_attack_test.sh覆盖场景:
- 黑名单、TCP RST 回包、速率限制
- SYN Flood、SYN Cookie 挑战与合法连接恢复
- UDP Flood、ICMP Flood、L7 指纹
- SIGHUP 热加载与服务停止恢复
- 自适应阈值、GeoIP/ASN、威胁情报
- 防护项目 DROP、GeoIP allowlist、IPv4 分片
- 连接跟踪半连接拦截
- Hub 策略同步、解封、规则下发与每节点 Token
cargo fmt --all -- --check
cargo clippy --workspace --exclude eshield-ebpf -- -D warnings
cargo +nightly-2026-07-31 clippy --package eshield-ebpf \
--target bpfel-unknown-none -Z build-std=core -- -D warnings.
├── eshield/ # 用户态控制面、Web 控制台、CLI、TUI
├── eshield-ebpf/ # eBPF/XDP 数据面
├── eshield-common/ # 共享结构体、常量与纯函数
├── eshield-hub/ # 分布式策略 Hub
├── xtask/ # eBPF 构建任务
├── scripts/ # 安装、卸载、基准与发布脚本
├── tests/ # 单元与集成测试脚本
├── docs/ # 架构、部署、运维、API、基准与开发文档
├── packaging/ # systemd、示例配置、容器与编排文件
├── README.md
├── README_EN.md
└── LICENSE
- 主机级防护:面向单机或边缘节点的 L3-L4 防护。T 级带宽耗尽型攻击需要上游云清洗或运营商清洗,eShield 无法突破物理链路上限。
- L7 能力有限:当前 L7 模块仅检查 TCP 首包指纹,不支持 TCP 分段重组,不提供 HTTP Flood、CC 或慢速攻击的完整应用层防御。
- SYN Cookie 范围:仅支持 IPv4 TCP,采用挑战模式,仅对超过阈值的源生效。
- 防护项目范围:数据面仅匹配 IPv4 精确 IP,CIDR 由控制面展开,下限
/24,项目上限 8192 条。 - 规则容量限制:
port_acl上限 32 条,l7_scan.patterns上限 8 条,用于满足内核 7.0 verifier 的指令处理限制。 - 虚拟网卡限制:veth 等虚拟网卡的原生 XDP_TX 存在内核异常风险,测试环境应使用
ESHIELD_XDP_MODE=skb。 - 平台限制:不支持 Windows;不支持无 BTF 的内核。
- 物理网卡基准缺失:当前公开基准基于 veth,物理网卡、多队列、小包 pps 与延迟需在目标环境实测。
| 文档 | 内容 |
|---|---|
| docs/user-guide.md | 运维与安全人员使用手册。 |
| docs/architecture.md | 系统架构、数据包旅程与 BPF Maps。 |
| docs/deployment.md | 二进制、systemd、容器、K8s 与 Hub 部署。 |
| docs/operations.md | 日常操作、日志、告警、备份恢复与故障排查。 |
| docs/dev-linux.md | 依赖安装、构建与本地测试。 |
| docs/api.md | REST API 端点、请求与响应示例。 |
| docs/benchmark.md | 基准测试方法与数据。 |
Apache-2.0