foxhackerzdevs/ebpf-visualizer

GitHub: foxhackerzdevs/ebpf-visualizer

一个基于 eBPF/XDP 与 Go 的高性能零拷贝网络数据包实时监控工具,提供低开销的 IPv4 流量可见性。

Stars: 2 | Forks: 0

# eBPF XDP 数据包监控器 一个使用 **eBPF**、**XDP** 和 **Go** 构建的高性能数据包监控工具。该应用程序将 XDP 程序附加到网络接口,并使用 Linux eBPF ring buffer 将 IPv4 数据包元数据(包括 Layer 4 端口信息)流式传输到用户空间。 该监控器旨在提供低开销、实时的网络流量可见性,同时允许所有数据包继续通过网络协议栈(`XDP_PASS`)。 ## 目录 - [功能](#features) - [架构](#architecture) - [要求](#requirements) - [安装说明](#installation) - [构建](#building) - [用法](#usage) - [输出示例](#output-example) - [项目结构](#project-structure) - [工作原理](#how-it-works) - [数据包元数据](#packet-metadata) - [配置](#configuration) - [局限性](#limitations) - [故障排除](#troubleshooting) - [未来改进](#future-improvements) - [许可证](#license) # 功能 - 高性能 XDP 数据包检测 - 通过 eBPF Ring Buffer 进行零拷贝通信 - IPv4 数据包监控 - TCP 和 UDP 端口提取 - ICMP 协议识别 - 自动协议检测 - 动态 IPv4 头部解析 - 安全且兼容验证器的边界检查 - root 权限验证 - 在 SIGINT/SIGTERM 时优雅关闭 - 使用 Go 编写的轻量级用户空间程序 # 架构 ``` Incoming Packets │ ▼ Network Interface │ ▼ XDP eBPF Program │ ┌──────────────┴──────────────┐ │ Parse Ethernet Header │ │ Parse IPv4 Header │ │ Parse TCP/UDP Header │ └──────────────┬──────────────┘ │ ▼ Ring Buffer Map │ ▼ Go Userspace │ ▼ Console Output ``` # 要求 - 支持 eBPF 的 Linux 内核 - 启用 XDP 的网络驱动程序 - Go 1.20+ - clang/LLVM - libbpf 头文件 - root 权限 所需的 Go 包: ``` github.com/cilium/ebpf ``` # 安装说明 克隆代码库: ``` git clone cd ``` 安装 Go 依赖项: ``` go mod tidy ``` # 构建 从 eBPF 程序生成 Go 绑定: ``` go generate ``` 构建应用程序: ``` go build -o ebpf-visualizer ``` # 用法 监控默认接口(`eth0`): ``` sudo ./ebpf-visualizer ``` 监控另一个接口: ``` sudo ./ebpf-visualizer -i ens33 ``` 显示帮助: ``` ./ebpf-visualizer -h ``` # 输出示例 TCP: ``` [TCP ] 192.168.1.10:54231 → 142.250.72.46:443 len=60 ``` UDP: ``` [UDP ] 192.168.1.15:60120 → 8.8.8.8:53 len=76 ``` ICMP: ``` [ICMP] 192.168.1.20 → 1.1.1.1 len=84 ``` # 项目结构 ``` . ├── bpf/ │ ├── packet_monitor.c # XDP eBPF program │ └── headers/ # Kernel headers used by bpf2go ├── main.go # Userspace application ├── go.mod ├── go.sum ├── LICENSE └── README.md ``` # 工作原理 ## 内核 (XDP) XDP 程序执行以下步骤: 1. 读取 Ethernet 头部。 2. 确保数据包是 IPv4。 3. 验证所有内存边界以确保验证器安全。 4. 解析 IPv4 头部。 5. 使用 `ihl` 计算动态 IP 头部大小。 6. 在适用时解析 TCP 或 UDP 头部。 7. 提取: - 源 IP - 目标 IP - 源端口 - 目标端口 - 协议 - 数据包长度 8. 将元数据写入 Ring Buffer。 9. 返回 `XDP_PASS` 以便数据包继续通过正常的网络协议栈。 ## 用户空间 Go 应用程序执行以下操作: - 移除 memlock 限制 - 加载编译后的 eBPF 对象 - 附加 XDP 程序 - 打开 Ring Buffer - 持续读取事件 - 将二进制数据转换为 Go 结构体 - 以人类可读的格式打印数据包信息 # 数据包元数据 内核发送以下结构体: ``` struct packet_meta { __u32 src_ip; __u32 dst_ip; __u16 src_port; __u16 dst_port; __u16 payload_len; __u8 protocol; __u8 pad; }; ``` | 字段 | 描述 | |--------|-------------| | src_ip | 源 IPv4 地址 | | dst_ip | 目标 IPv4 地址 | | src_port | TCP/UDP 源端口 | | dst_port | TCP/UDP 目标端口 | | payload_len | IPv4 总长度 | | protocol | IP 协议号 | | pad | 对齐填充 | # 配置 ## 接口 默认: ``` eth0 ``` 自定义: ``` -i ``` 示例: ``` -i enp0s3 ``` # 支持的协议 | 协议 | 是否支持 | |-----------|-----------| | IPv4 | ✅ | | TCP | ✅ | | UDP | ✅ | | ICMP | ✅ | | IPv6 | ❌ | | ARP | ❌ | # 安全功能 XDP 程序包含对验证器友好的安全检查: - Ethernet 边界验证 - IPv4 边界验证 - 动态 IP 头部长度验证 - TCP 头部边界验证 - UDP 头部边界验证 - Ring buffer 分配失败处理 - 显式的结构体填充初始化 # 性能特征 该监控器针对高吞吐量进行了优化: - 完全在 XDP hook 中运行 - 最小化的数据包解析 - 零拷贝 Ring Buffer 通信 - 不修改数据包 - 不丢弃数据包(始终返回 `XDP_PASS`) - 低用户空间开销 # 局限性 当前的局限性包括: - 仅支持 IPv4 - 不支持 IPv6 - 不捕获数据包负载 - 仅支持控制台输出 - 无数据包过滤 - 无统计信息聚合 - 无持久化日志 # 故障排除 ## 此工具需要 root privileges 请使用以下命令运行: ``` sudo ./ebpf-visualizer ``` ## 找不到接口 列出可用接口: ``` ip link ``` ## 附加 XDP 失败 可能的原因: - 接口不支持 XDP。 - 驱动程序未实现原生 XDP。 - 已经附加了另一个 XDP 程序。 - 权限不足。 ## Ring Buffer 错误 请验证: - 内核支持 BPF Ring Buffer。 - eBPF 程序成功加载。 - XDP 附加成功。 # 未来改进 潜在的增强功能包括: - 支持 IPv6 - 解析 ARP - 感知 VLAN - 解码 DNS - 检测 HTTP - 数据包过滤 - Prometheus 指标 - JSON 输出 - 导出 PCAP - 交互式终端 UI - 流量跟踪 - 按接口统计 - 数据包速率监控 - 用于计数器的 eBPF maps - Prometheus exporter # 许可证 eBPF 程序在 GPL 许可证下发布: ``` char LICENSE[] SEC("license") = "GPL"; ``` 完整的许可条款请参阅项目的 LICENSE 文件。 # 致谢 - Linux eBPF 子系统 - XDP (Express Data Path) - Cilium eBPF Go 库 - Linux 内核网络协议栈
标签:Docker镜像, Go语言, XDP, 内核网络, 客户端加密, 日志审计, 程序破解