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, 内核网络, 客户端加密, 日志审计, 程序破解