# ebpf_filter **Repository Path**: ploynomail/ebpf_filter ## Basic Information - **Project Name**: ebpf_filter - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-29 - **Last Updated**: 2025-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # eBPF 流量拦截与加密转发器 一个基于 eBPF 的智能流量拦截系统,支持 TC egress 和 XDP bridge 两种模式,能够自动检测网卡类型并选择最佳拦截策略。 ## 🚀 特性 - **双模式支持** - 🔵 **TC Egress 模式**:拦截普通网卡的本机出站流量 - 🟢 **XDP Bridge 模式**:拦截桥接网卡上所有物理接口的转发流量 - **自动模式检测**:智能识别网卡类型并自动选择合适的 eBPF hook点 - **目标IP过滤**:仅拦截发往指定目标IP的流量 - **AES-256-GCM 加密**:对拦截的数据包进行加密后转发 - **零拷贝性能**:TC使用perf events,XDP使用AF_XDP socket - **实时统计**:提供详细的包处理统计信息 ## 📋 系统要求 - Linux 内核 >= 4.18 (推荐 5.x+) - Go >= 1.20 - Clang >= 10 - 内核头文件 (linux-headers) - root 权限 ## 🔧 快速开始 ### 编译 ```bash make all ``` ### 运行(自动检测模式) ```bash sudo ./ccdd ``` ### 测试 ```bash sudo ./test_quick.sh ``` ## 📖 使用方法 ### 基本用法 ```bash sudo ./ccdd \ -interface=ens33 \ -targets="10.10.10.2,10.10.10.3" \ -server=192.168.23.15 \ -port=8080 ``` ### 参数说明 | 参数 | 说明 | 默认值 | | ------------ | ---------------------- | -------------------------------- | | `-interface` | 网络接口名称 | ens33 | | `-targets` | 目标IP列表(逗号分隔) | 10.10.10.2,10.10.10.3 | | `-server` | 转发服务器IP | 192.168.23.15 | | `-port` | 转发服务器端口 | 8080 | | `-key` | 加密密钥 | my-secret-encryption-key-32bytes | | `-mode` | 运行模式:auto/tc/xdp | auto | ### 模式选择 #### 自动模式(推荐) ```bash sudo ./ccdd -mode=auto -interface=ens33 ``` 程序会自动检测网卡类型并选择合适的模式。 #### 强制 TC 模式 ```bash sudo ./ccdd -mode=tc -interface=ens33 ``` 适用于普通网卡,拦截本机发出的流量。 #### XDP 桥接模式 ```bash sudo ./ccdd -mode=auto -interface=br0 ``` 适用于桥接网卡,在所有物理成员接口上附加XDP程序。 ## 🏗️ 架构说明 ### TC Egress 模式 ``` 应用程序 → 协议栈 → TC egress hook → [eBPF拦截] ↓ 匹配目标IP? ↓ ↓ 是 否 ↓ ↓ Perf Event 放行 ↓ 用户态接收 ↓ AES加密 ↓ UDP转发到服务器 ↓ 丢弃原包 ``` ### XDP Bridge 模式 ``` 物理网卡1 → XDP hook → [eBPF拦截] ↓ 匹配目标IP? ↓ ↓ 是 否 ↓ ↓ AF_XDP Socket 桥接转发 ↓ ↓ 用户态接收 物理网卡2 ↓ AES加密 ↓ UDP转发到服务器 ``` ## 📊 验证和调试 ### 检查 TC Filter ```bash sudo tc filter show dev ens33 egress ``` 预期输出: ``` filter protocol all pref 1 bpf chain 0 filter protocol all pref 1 bpf chain 0 handle 0x1 tc_egress_filter direct-action ``` ### 检查 XDP 程序 ```bash sudo bpftool net show ``` ### 查看 Map 数据 ```bash # 查看目标IP配置 sudo bpftool map dump name target_ips # 查看统计信息 sudo bpftool map dump name stats_map ``` ### 实时日志 程序会输出详细日志: ``` 📦 拦截出站包 #1: 192.168.23.197:0 -> 10.10.10.2:0 (协议: 1, 长度: 98) ✓ 已加密并转发 126 字节 📊 [TC模式] 处理=572, 匹配=6, 拦截=6 | 用户态捕获=6 ``` ## 🧪 测试 ### 自动化测试 ```bash sudo ./test_quick.sh ``` ### 手动测试 1. 启动程序: ```bash sudo ./ccdd ``` 2. 另一个终端发送测试流量: ```bash # ICMP ping -c 3 10.10.10.2 # TCP curl http://10.10.10.3 # UDP echo "test" | nc -u 10.10.10.2 1234 ``` 3. 观察拦截日志 ## 📁 项目结构 ``` . ├── main.go # 用户态程序(支持TC和XDP两种模式) ├── xdp/ │ ├── tc_egress.c # TC eBPF程序 │ └── xdp_bridge.c # XDP eBPF程序 ├── Makefile # 编译配置 ├── test_quick.sh # 快速测试脚本 ├── USAGE_FULL.md # 详细使用手册 └── README.md # 本文件 ``` ## 🔍 工作原理 ### TC Egress 模式 1. **Hook点**: TC egress (qdisc层,出站方向) 2. **触发时机**: 数据包离开协议栈,进入发送队列时 3. **数据传递**: Perf event ringbuffer 4. **处理方式**: TC_ACT_SHOT (丢弃匹配的包) ### XDP Bridge 模式 1. **Hook点**: XDP (网卡驱动层,最早处理点) 2. **触发时机**: 数据包从物理网卡接收时 3. **数据传递**: AF_XDP socket (零拷贝) 4. **处理方式**: XDP_REDIRECT (重定向到用户态socket) ## 🛠️ 故障排查 ### 编译失败 检查依赖: ```bash make check-deps ``` ### 无法附加eBPF程序 1. 确认root权限 2. 检查内核版本:`uname -r` 3. 检查是否有冲突:`sudo tc filter show dev ens33 egress` ### 没有拦截到包 1. 确认目标IP配置正确 2. 验证eBPF程序已加载:`sudo bpftool prog show` 3. 检查map内容:`sudo bpftool map dump name target_ips` 4. 查看统计信息:`sudo bpftool map dump name stats_map` ## 📄 许可证 GPL v2(因使用eBPF需遵循内核许可证) ## 🙏 致谢 - Linux eBPF 社区 - Cilium eBPF 库 - Netlink 库 ## 📚 参考资料 - [eBPF Documentation](https://ebpf.io/) - [Cilium eBPF](https://github.com/cilium/ebpf) - [XDP Tutorial](https://github.com/xdp-project/xdp-tutorial) - [TC BPF Documentation](https://docs.kernel.org/bpf/tc-bpf.html) --- **版本**: 1.0.0 **最后更新**: 2025-12-29