ti-mo/conntracct
GitHub: ti-mo/conntracct
基于 eBPF 和 Linux conntrack 子系统的低开销实时网络流量监控工具,将网络流级别的统计信息推送到多种后端存储。
Stars: 100 | Forks: 12
# conntracct
Conntracct 是一个从 Linux 主机、防火墙、网关、容器或虚拟化主机,甚至中高端嵌入式设备中提取网络流信息的工具。
它不以任何方式捕获或分析数据包,而是利用 eBPF 以最小的开销挂钩到 Conntrack 的记账子系统。
## 概述
Conntracct 包含一个 metrics pipeline,支持将单个网络流的 packet/byte 计数器发送到 InfluxDB 和 ElasticSearch 等后端,以便在其中进行实时查询和可视化。
## 兼容性
支持以下主要发行版:
- Debian
- Stretch
- Buster
- Ubuntu
- Xenial(带有 Hardware Enablement kernel)
- Bionic
- Fedora
- Arch Linux
所需的最低内核版本为 4.9。对于滚动发布的发行版,随着内核内部数据结构的演变,预计会出现损坏。如果您在滚动发行版上运行该项目时遇到任何问题,请创建一个 issue。
## 路线图
针对 amd64 Linux 机器的主要挑战已基本解决。
这是一个计划中的小功能列表
- [x] 针对多个内核版本同时编译基于 C 的 eBPF probe
- [x] 用于实时流指标的 InfluxDB sink driver
- [x] 用于测试和调试的 StdOut/Err sink driver
- [x] 用于归档已完成流的 Elasticsearch sink
- [x] 自动化跨发行版测试运行器
- [ ] 社区提供的 Grafana dashboards(用于 InfluxDB 和 Elastic 后端)
- [ ] 用于监控 pipeline 内部状态的 Prometheus endpoint
- [ ] `conntracct test` 子命令,用于随二进制文件发布 eBPF 测试套件
- [ ] ARMv7 (aarch64) 支持(Odroid XU3/4+, RPi 3+, 等)
- [ ] 针对单个自定义内核的简易构建流程
- [x] 纯 Go eBPF 实现(无 Cgo)(https://github.com/cilium/ebpf)
## 安装
从 Releases 获取最新的二进制文件。Conntracct 需要以下 capabilities:
当使用 BPF probe 获取实时记账事件时:
- `cap_sys_admin` 用于调用 bpf()
- `cap_sys_resource` 用于为 ring buffer 内存调用 `setrlimit()`
- `cap_ipc_lock` 用于为 ring buffer 锁定内存(较新的 gobpf 版本似乎不再需要)
- `cap_dac_override` 用于打开 /sys/kernel/debug/tracing/*
当让 Conntracct 管理 sysctl 时:
- `cap_net_admin` 用于管理 `sysctl net.netfilter.nf_conntrack_{acct,timestamp}`
## 配置
虽然配置布局在不久的将来肯定会发生变化,但最新的示例始终可以在 [`configs/`](https://github.com/ti-mo/conntracct/blob/master/configs/) 中找到。
配置使用 Viper,因此也可以使用 TOML 和 JSON。
默认配置搜索路径为(有效扩展名为 `yml`、`toml`、`json`):
- `$HOME/.config/conntracct.yml`
- `/etc/conntracct/conntracct.yml`
使用全局 `-c`/`--config` 标志显式指定配置文件。
### iptables / nftables
为了确保您的主机跟踪传出连接,需要配置 `iptables` 或 `nftables` 来执行此操作。请记住,所有 NAT 流都由 `conntrack` 自动跟踪,这无法禁用(NAT 依赖于它)。例如,如果您在机器上运行 Docker,往返于容器的流量可能已经被跟踪,具体取决于您的网络配置。
使用以下命令跟踪所有传出的 IPv4 和 IPv6 连接:
```
sudo ip6tables -t filter -A OUTPUT -m conntrack --ctstate related,established -j ACCEPT
sudo iptables -t filter -A OUTPUT -m conntrack --ctstate related,established -j ACCEPT
```
## 构建
Conntracct 使用 [Mage](https://magefile.org) 进行构建。
`mage build`
所有 BPF probe 都是使用 Clang 7.0 预构建的,并使用 `statik` 打包。
这意味着只需 Go toolchain 即可从源代码构建二进制文件,并且只需导入 `pkg/bpf` 包即可使用所有 probe,即使是从其他项目中。
### 构建 BPF probe
所有与 bpf 相关的任务都在其自己的 `bpf:` Mage namespace 中。
`mage bpf:build`
这将获取、解压缩并配置构建包所针对的所有 Linux 版本以构建 probe。这是在 `$HOME/.cache/conntracct` 中隔离执行的,不会触及您安装的 OS 内核。
## 开发
Conntracct 附带了一个基于 Docker 的开发环境,可使用
`mage dev`
这将启动一个 docker-compose stack,构建二进制文件并运行 `modd` 以便在保存时实时重新加载。
`go get github.com/cortesi/modd/cmd/modd`
## 致谢
如果没有 WeaveWorks 的 [tcptracer-bpf](https://github.com/weaveworks/tcptracer-bpf),这个项目是不可能完成的。虽然我没有采用偏移量扫描的方法,但围绕使用 `statik` 将字节码打包到包中以及 tracer 程序的整体实现的想法,作为本项目的示例起到了重要作用。谢谢你们,伙计们!
## 参与其中
一如既往,非常感谢 pull requests 和反馈。
请随时通过以下任一渠道取得联系:
- Gophers Slack 上的 #networking
- 提交 [一个 issue](https://github.com/ti-mo/conntracct/issues/new)
- 如果您想赞助新功能,请[发送电子邮件给我](mailto:timo@incline.eu)
标签:Conntrack, Docker镜像, Elasticsearch, EVTX分析, Golang, Grafana, InfluxDB, IP 地址批量处理, 内核探针, 后端开发, 安全渗透, 安全编程, 容器网络, 带宽统计, 开源安全, 性能分析, 日志审计, 网络可见性, 网络安全, 请求拦截, 进程隐藏, 隐私保护