nevinshine/hyperion-xdp

GitHub: nevinshine/hyperion-xdp

Hyperion XDP 是一款基于 eBPF 和 XDP 的高性能网络数据平面工具,用于网络安全监控和防御。

Stars: 6 | Forks: 1

# Hyperion XDP ### 高性能 AF_XDP 执法与遥测数据平面

Hyperion XDP 是一个可度量的、基础设施级别的网络数据平面,专为极端高吞吐量数据包过滤和深度数据包检测(DPI)而设计。通过利用 eBPF 和 AF_XDP 零拷贝套接字,Hyperion 在 Linux 内核网络堆栈分配 `sk_buff` 之前直接拦截流量,从而实现低延迟、高吞吐量的数据包处理,并具有显式的队列级可观察性。 ## 架构拆分:快速路径与慢速路径 为了保持严格的 eBPF 验证器纪律并保证硬件限定的吞吐量,Hyperion 在物理上隔离了数据包处理。 ``` graph TD classDef nicSpace fill:#1e1e1e,stroke:#00ADD8,stroke-width:2px,color:#fff classDef kernelSpace fill:#1e1e1e,stroke:#D22128,stroke-width:2px,color:#fff classDef userSpace fill:#1e1e1e,stroke:#3776AB,stroke-width:2px,color:#fff subgraph Physical ["Physical NIC"] NIC(("NIC RX Queue")) -->|Raw Frame| XDP["XDP Hook"] end subgraph Fast_Path ["Kernel XDP Fast Path"] XDP -->|Bounded Parse| PARSE["Protocol Parser"] PARSE -->|IP Match| DROP1(("XDP_DROP")) PARSE -->|Target Port| REDIRECT(("XDP_REDIRECT")) PARSE -->|Unknown| ACCEPT(("XDP_PASS")) end subgraph Kernel_Maps ["eBPF Maps (Lockless)"] BL[("blocklist_map")] RM[("redirect_ports_map")] XM[("xsk_map")] TE[("telemetry_ringbuf")] end subgraph Slow_Path ["AF_XDP Userspace (Go)"] AFXDP["AF_XDP Socket"] -->|Zero-Copy Ring| DPI["Deep Packet Inspection"] DPI -->|Signature Match| METRIC_DROP["Prometheus Drop Metric"] DPI -->|Safe Payload| RECYCLE["Recycle Descriptor"] YAML[("policy.yaml")] -->|Hot Reload| DPI end XDP -.- BL REDIRECT -.-> XM XM ===>|Shared UMEM| AFXDP DROP1 -.-> TE class NIC,XDP nicSpace class PARSE,DROP1,ACCEPT,REDIRECT kernelSpace class BL,RM,XM,TE kernelSpace class AFXDP,DPI,METRIC_DROP,YAML,RECYCLE userSpace ``` ### 快速路径(内核/XDP) XDP 钩子保证了有界、无状态的处理。 - **`O(1)` IP 黑名单**:通过 LRU 哈希表对已知恶意行为者进行即时 `XDP_DROP`。 - **损坏数据包拒绝**:在头部进行硬件级别的边界检查。 - **AF_XDP 重定向**:目标协议(例如,UDP 53)被推入 `xsk_map`,完全绕过 Linux 堆栈。 ### 慢速路径(AF_XDP 用户空间) 重负载工作由 `github.com/asavie/xdp` 的 Go 用户空间引擎承担。 - **深度数据包检测(DPI)**:对完整数据包有效载荷进行正则表达式和签名分析。 - **遥测关联**:Prometheus 端点跟踪检测延迟、丢弃率和队列饱和度。 - **结构化策略引擎**:评估 `policy.yaml`,支持 `SIGHUP` 热重载。 ## 零拷贝队列生命周期编排 Hyperion 已从简单的数据包引擎发展成为 **硬件队列编排运行时**。在 Mellanox `mlx5` 零拷贝架构上进行的严格行为隔离实验表明,逻辑 AF_XDP 队列拆除(关闭套接字)不足以终止硬件描述符的所有权。 实验表明,安全的队列编排需要在多个独立的状态平面之间进行协调: 1. **流量引导平面** (`ethtool -X` / RSS) * 确定哪些硬件 RX 队列从物理上接收来自线的数据包。 2. **eBPF 重定向平面** (`xsk_map`) * 控制数据包是否被重定向到 AF_XDP 用户空间套接字。 3. **DMA 描述符所有权平面** * 管理 UMEM 描述符填充所有权和 AF_XDP 队列内存注册。 4. **固件执行平面** * 内部 NIC 固件执行状态,负责描述符轮询、重试行为、队列执行上下文和 DMA 调度。 ### 实验发现 受控故障注入实验在测试的 `mlx5` 堆栈上展示了几个关键行为: * 在负载下销毁 AF_XDP UMEM 所有权可以触发 NIC 固件内部持续描述符重试循环 (`rx*_xsk_buff_alloc_err`)。 * 从 RSS 引导中删除队列并删除 `xsk_map` 重定向并不一定终止固件级别的轮询行为。 * 将新的 UMEM 动态重新绑定到陷入重试状态的队列会导致测试硬件上严重的节点不稳定和 DMA 相关故障。 * 接口重置序列(`ip link down/up`)成功终止重试状态并恢复了收敛。 实验的关键发现是,Linux 可见队列拆除语义可以在固件可见描述符执行保持永久活动的同时成功完成,从而在软件拆除状态和硬件执行状态之间产生差异。 这些观察表明,软件可见的拆除完成并不一定意味着硬件级别的执行收敛。 ### 架构影响 实验表明,在测试的 `mlx5_core` / ConnectX-4 Lx / Linux 6.8 堆栈上,一旦出现持续的描述符重试状态,可靠的队列本地恢复可能无法实现。 因此,Hyperion 将队列生命周期编排视为一等系统关注点,强调: * 确定性队列围栏 * 显式 RSS 控制 * 看门狗驱动的降级语义 * 描述符收敛监控 * 意识到编排的拆除顺序 * 当队列本地恢复不安全时,在整个接口上实施恢复策略 ## 研究贡献 Hyperion 贡献了关于 AF_XDP 零拷贝生命周期行为在持续负载下的几个实验性观察: * 持续描述符重试状态的实证特征 * 队列级拆除和重新绑定失败分析 * 固件可见与 Linux 可见拆除差异的隔离 * 确定性队列围栏和 RSS 编排方法 * 描述符收敛遥测仪表 * AF_XDP 数据平面看门狗驱动的降级语义 * 在对抗性故障条件下编排意识到的队列生命周期建模 因此,该项目既是一个实验性的高性能 XDP 数据平面,也是一个系统研究平台,用于研究零拷贝队列编排行为。 ## 已知限制 当前的观察受到以下限制: - Mellanox ConnectX-4 Lx 硬件 - `mlx5_core` - Linux 6.8 - AF_XDP 零拷贝模式 - `asavie/xdp` 用户空间绑定 该项目尚未验证: - 非 zero-copy AF_XDP 模式行为 - Intel `ice` - Intel `ixgbe` - Broadcom 网卡 - 多 NUMA 队列迁移 - SmartNIC 转发架构 - 共享 UMEM 队列编排 - 硬件辅助队列重置语义 ## 性能工程(基准测试) Hyperion 通过使用 `veth` 对和 `iperf3` / `tcpreplay` 的隔离命名空间基准测试来证明其主张。 ``` # 1. 启动隔离的网络命名空间沙盒 sudo ./scripts/netns_sandbox.sh # 2. 将 Hyperion 连接到沙盒接口 sudo ./bin/hyperion_ctrl -iface veth0 # 3. 发射 10Gbps UDP 流量并测量 CPU/PPS sudo ./benchmarks/benchmark_suite.sh ``` ### 高级可观察性 Hyperion 在端口 `2112` 上公开 `/metrics` Prometheus 端点,跟踪: - `hyperion_fastpath_drops_total`:内核中杀死的包。 - `hyperion_slowpath_drops_total`:由 AF_XDP DPI 丢弃的包。 - `hyperion_redirect_failures_total`:映射重定向失败(用户空间断开连接)。 - `hyperion_afxdp_rx_queue_pressure`:环形缓冲区占用率。 ## 队列生命周期与故障语义基准测试 Hyperion 的基准测试框架不仅扩展到吞吐量测量,还扩展到确定性队列生命周期分析和故障语义验证。 基准测试工具捕获: * 队列占用振荡 * 看门狗转换时间 * 降级状态停留分布 * IRQ 拓扑稳定性 * 调度抖动 * NAPI 预算压力 * 描述符重试收敛行为 * 持续负载下的 AF_XDP 拆除语义 ### 实验基础设施 实验在隔离的 CloudLab 裸金属系统上执行,使用 Mellanox `mlx5` 网卡,具有明确的 IRQ 粘性固定、CPU 管理器锁定、RSS 控制和连续遥测捕获。 遥测流包括: * `/proc/interrupts` * `/proc/net/softnet_stat` * `ethtool -S` * `bpftool` * `turbostat` * Prometheus 队列指标 * AF_XDP 描述符压力指标 ### 故障注入方法 Hyperion 包括受控故障注入,用于在压力条件下研究数据平面降级和恢复行为: * AF_XDP 用户空间终止(`SIGTERM`,`SIGKILL`) * 队列围栏(`xsk_map` 分离) * RSS 引导撤回 * 描述符饥饿 * 队列本地拆除 * 实时重新绑定实验 * 饱和诱导的降级 目标是不仅最大化每秒数据包数,而且要描述零拷贝数据平面在所有权转换、拆除竞争和硬件重试条件下的行为。 ## 故障模式文档 基础设施信誉要求在出现问题时具有确定性行为。Hyperion 实现了显式的故障状态: | 故障场景 | 解决方案 | 安全立场 | |:-----------------|:-----------|:----------------| | **Go 用户空间崩溃** | `bpf_redirect_map` 返回错误,如果 AF_XDP 套接字(`xsk_map`)已死或未绑定。 | **Fail-Closed(可选)** 或 **Fail-Open(默认)**。目前,不可路由的 AF_XDP 数据包回退到 `XDP_PASS` 以避免网络隔离,增加 `hyperion_redirect_failures_total` Prometheus 计数器。 | | **Rx 队列溢出** | 如果 AF_XDP 填充环耗尽,内核将丢弃数据包。 | **Fail-Closed**。数据包被丢弃,增加接口 `rx_dropped` 计数器。 | | **映射耗尽** | IP 黑名单使用 `BPF_MAP_TYPE_LRU_HASH`。 | **自我修复**。过时的 IP 地址会自动删除以腾出空间用于新的块。 | ## 验证器统计与纪律 编写原始 eBPF 需要严格遵守验证器预算,以确保内核不会死锁。Hyperion 的 `hyperion_core.c` 运行在以下限制以下: - **指令计数**:~150 指令(限制:1,000,000)。通过从内核中删除有效载荷签名循环(`#pragma unroll`)并将其推送到 AF_XDP,我们实现了逻辑深度的巨大减少。 - **堆栈使用**:~128 字节(限制:512 字节)。变量被紧密限制,大型结构直接推入环形缓冲区。 - **尾调用深度**:0(限制:33)。数据平面目前是单块的,但足够模块化,可以支持尾调用流水线,如果需要的话。 - **辅助调用**:严格限制为 `bpf_map_lookup_elem`、`bpf_redirect_map` 和 `bpf_ringbuf_*`。 ## 入门 ### 先决条件 - Linux 内核 >= 5.4(XDP + AF_XDP 支持) - Go >= 1.24 - Clang / LLVM(用于 eBPF 编译) ### 构建 ``` make build ``` ### 策略配置(`policy.yaml`) ``` fast_path: drop_ips: ["198.51.100.42"] redirect_ports: - protocol: 17 port: 53 slow_path: dns_rules: - match: "evil.com" action: "drop" ``` ## 许可证 GPL 许可证 — 查看 [LICENSE](LICENSE).
标签:AGPLv3 许可证, Docker镜像, GPL许可证, Linux内核, Sentinel Runtime, XDP, 低延迟, 安全策略, 客户端加密, 提示词设计, 数据包过滤, 数据平面, 日志审计, 深度包检测, 硬件加速, 硬件绑定, 网络卫星, 网络安全, 网络安全分析, 网络性能, 网络架构, 队列监控, 隐私保护, 零拷贝技术, 高吞吐量, 高性能网络