0x1f6/dashcap

GitHub: 0x1f6/dashcap

一款网络流量「行车记录仪」,通过环形缓冲区持续捕获数据包,支持按需触发保存事发前后的完整流量上下文。

Stars: 2 | Forks: 0

# dashcap 网络数据包行车记录仪 —— 持续进行全包捕获,并支持按需持久化。 dashcap 将所有网络流量持续捕获到预分配的 pcapng 分段环形缓冲区中。当被触发时(通过 REST API、信号或 CLI),它会保存相关的捕获窗口(包括触发时刻*之前*的流量),以供后续分析。可以把它当作你网络的行车记录仪:一直在录制,仅在发生情况时保存。 ## 工作原理 ``` Network Interface → Capture Engine → Segment Writer → Ring Buffer (fixed size, overwrites oldest) ↓ on trigger Saved Captures (pcapng + metadata.json) ``` - 数据包通过 libpcap (Linux/macOS) 或 Npcap (Windows) 捕获,并写入固定大小的 pcapng 分段文件 - 分段以环形方式循环 —— 当缓冲区满时,最旧的分段会被覆盖 - 所有磁盘空间在启动时预分配;占用空间恒定为 `segment_count * segment_size` - 触发操作会将相关时间窗口合并为单个 `capture.pcapng` 文件,保存在 `saved/` 目录中并附带元数据 ## 状态 **第一阶段 (MVP) 已完成。** 核心的磁盘捕获管道及 REST API 触发功能已在 Linux 上运行。完整路线图请参阅 [DESIGN.md](DESIGN.md)。 已实现的功能: - `gopacket/pcap` 捕获后端(跨平台) - 带有精确字节追踪的 pcapng 分段写入器 - 带有预分配分段和循环功能的环形缓冲区 - 包含 `/trigger`, `/status`, `/health`, `/ring`, `/triggers` 端点的 REST API - Bearer-token API 认证(默认启用,自动生成 token) - API 服务器的 TLS 支持 (`--tls-cert` / `--tls-key`) - 触发保存功能将分段合并为单个 `capture.pcapng` 文件 - 接口锁定(每个接口仅允许一个实例) - 磁盘安全检查(基于绝对值和百分比的可用空间阈值) - 平台感知路径 ## 系统要求 | 平台 | 需求 | |----------|-------------| | Linux | `libpcap-dev` (`apt install libpcap-dev` 或 `dnf install libpcap-devel`) | | Windows | 已安装 [Npcap](https://npcap.com/) (与 Wireshark 相同) | | macOS | libpcap (随 Xcode Command Line Tools 提供) | | 所有 | 启用 CGO 的 Go 1.25+ | ## 构建 ``` make build # → bin/dashcap ``` 二进制文件需要 `CGO_ENABLED=1`,因为 gopacket 需要链接 libpcap。这由 Makefile 自动处理。 对于交叉编译(需要特定平台的 libpcap/Npcap SDK): ``` make cross # → dist/dashcap-linux-amd64, dist/dashcap-windows-amd64.exe, dist/dashcap-darwin-arm64 ``` ## 快速开始 本示例使用环回接口 (`lo`),因此除了 `CAP_NET_RAW` 外,你无需任何特殊硬件或权限即可试用。 ### 1. 构建并启动 dashcap ``` make build # 从一个小型环形缓冲区开始(总共 10 MB,1 MB 分段 = 10 个分段) sudo bin/dashcap -i lo --buffer-size 10MB --segment-size 1MB --api-port 9800 ``` 你应该会看到: ``` API token: dashcap vdev starting on interface lo ring buffer: 10 segments x 1MB = 10MB total ring pre-allocated at /var/lib/dashcap/lo WARNING: API auth enabled without TLS — tokens sent in cleartext REST API listening on :9800 ``` 从输出中复制 API token —— 所有 API 请求(除了 `/health`)都需要它。要使用可预测的 token,请传递 `--api-token ` 或设置 `DASHCAP_API_TOKEN=`。 ### 2. 生成一些流量 在第二个终端中: ``` ping -c 100 127.0.0.1 # 或 curl http://127.0.0.1:9800/api/v1/health ``` ### 3. 检查状态 ``` curl -s -H "Authorization: Bearer " http://127.0.0.1:9800/api/v1/status | python3 -m json.tool ``` ``` { "interface": "lo", "uptime": "42s", "segment_count": 10, "total_packets": 200, "total_bytes": 19600 } ``` ### 4. 触发保存 ``` curl -s -X POST -H "Authorization: Bearer " http://127.0.0.1:9800/api/v1/trigger | python3 -m json.tool ``` ``` { "id": "1740960600000000000-1", "timestamp": "2026-03-02T22:30:00Z", "source": "api", "status": "pending" } ``` ### 5. 检查已保存的捕获 ``` ls /var/lib/dashcap/lo/saved/ # → 2026-03-02T22-30-00_api/ cat /var/lib/dashcap/lo/saved/2026-03-02T22-30-00_api/metadata.json # → trigger metadata with capture path # 在 Wireshark 中打开(所有分段合并为一个文件): wireshark /var/lib/dashcap/lo/saved/2026-03-02T22-30-00_api/capture.pcapng ``` ### 6. 查看环形缓冲区状态 ``` curl -s -H "Authorization: Bearer " http://127.0.0.1:9800/api/v1/ring | python3 -m json.tool ``` ### 7. 停止 dashcap 按 `Ctrl+C` 或发送 `SIGTERM` —— dashcap 会刷新活动分段并干净地退出。 ## CLI 参考 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `-i`, `--interface` | *(必填)* | 要进行捕获的网络接口 | | `--buffer-size` | `2GB` | 环形缓冲区总大小 (例如 `2GB`, `500MB`) | | `--segment-size` | `100MB` | 每个环形分段的大小 (例如 `100MB`, `1MB`) | | `--data-dir` | `/var/lib/dashcap/` | 环形缓冲区和已保存捕获的数据目录 | | `--api-port` | `9800` | REST API 的 TCP 端口 (`0` = 禁用) | | `--api-token` | *(自动生成)* | API 认证的 Bearer token | | `--no-auth` | `false` | 完全禁用 API 认证 | | `--tls-cert` | | TLS 证书文件路径 (需要 `--tls-key`) | | `--tls-key` | | TLS 私钥文件路径 (需要 `--tls-cert`) | | `--pre-duration` | `5m` | 触发前向前保存的时长 | | `--promiscuous` | `true` | 在接口上启用混杂模式 | | `--snaplen` | `0` | 快照长度 (`0` = 完整数据包) | 环境变量: | 变量 | 描述 | |----------|-------------| | `DASHCAP_API_TOKEN` | API token (会被 `--api-token` 标志覆盖) | 子命令: ``` dashcap version # Print version, commit, and build time ``` ## REST API 所有端点均返回 JSON。API 监听 `--api-port` 指定的端口。 **认证:** 除 `/health` 外的所有端点都需要 bearer token。每次请求都需包含 `Authorization: Bearer ` 标头。Token 会在启动时打印到 stderr。使用 `--no-auth` 禁用认证。 **TLS:** 传递 `--tls-cert` 和 `--tls-key` 以启用 HTTPS。若无 TLS,token 将以明文传输(会记录警告日志)。 | 方法 | 端点 | 认证 | 描述 | |--------|----------|------|-------------| | `GET` | `/api/v1/health` | 否 | 存活检查 —— 返回 `{"status": "ok"}` | | `GET` | `/api/v1/status` | 是 | 实例状态:接口、运行时间、包/字节计数 | | `POST` | `/api/v1/trigger` | 是 | 触发保存触发前窗口的数据 | | `GET` | `/api/v1/triggers` | 是 | 列出所有触发记录(最新的在前) | | `GET` | `/api/v1/ring` | 是 | 每个分段的元数据:索引、路径、时间戳、包/字节计数 | ## 配置 dashcap 通过 CLI 标志进行配置。YAML 配置文件支持计划在第二阶段推出。 提供了示例配置文件 [`configs/dashcap.example.yaml`](configs/dashcap.example.yaml) 供参考。 ## 项目结构 ``` dashcap/ ├── cmd/dashcap/ # CLI entry point (Cobra) ├── internal/ │ ├── api/ # REST API server (net/http) │ ├── buffer/ # Ring manager + pcapng segment writer │ ├── capture/ # Packet capture abstraction (gopacket/pcap) │ ├── config/ # Runtime configuration + validation │ ├── persist/ # Save triggered captures to disk │ ├── storage/ # Platform-specific disk ops (prealloc, flock, free space) │ └── trigger/ # Trigger dispatcher (multiplexes API/signal/CLI sources) ├── configs/ # Example configuration ├── DESIGN.md # Full architecture and design document ├── Makefile # Build, test, lint, cross-compile targets └── go.mod ``` ## 开发 ``` make test # Run tests with race detector make lint # Run golangci-lint make fmt # Format code (gofmt + goimports) make cover # Generate coverage report (coverage.html) ```
标签:EVTX分析, EVTX分析, Go语言, HTTP 参数枚举, pcapng, REST API, 全包捕获, 抓包工具, 持续监控, 故障排查, 日志审计, 服务管理, 流量录制, 环形缓冲区, 程序破解, 网络安全, 网络流量分析, 行车记录仪, 防御绕过, 隐私保护