ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PulseHttp:零侵入的被动 HTTP 抓包 Web 工具

PulseHttp:零侵入的被动 HTTP 抓包 Web 工具 文章目录背景一、项目简介二、技术栈三、核心功能与数据流1. 被动抓包BPF 内核过滤2. 多网卡与旁路部署3. 实时会话列表4. 多视图 Inspector5. 计时三段6. 会话管理7. 内存可控8. 其他工程细节四、项目结构五、环境、依赖与使用教程5.1 环境要求5.2 安装5.3 运行5.4 配置5.5 日常使用5.6 验证抓包是否工作WSL2 示例5.7 运行效果六、能力边界写在最后部署即用、单二进制、无代理、无证书、不解密——在服务器上被动嗅探网卡实时观察明文 HTTP/1.1 流量。背景PulseProxy这个工具使用MITM 代理抓包更适合于在开发期间使用对于在服务器运行中web系统抓包我另外 独立开发PulseHttp这个工具。以下文档和实现代码均使用Claude Code 火山引擎的GLM-5.3 编写。一、项目简介做过服务端排障、接口联调或者内网流量观测的同学对 Fiddler、Charles 这类抓包工具一定不陌生。但它们都是代理式抓包要么给进程配代理要么在网关劫持流量还得装根证书才能看 HTTPS。当你的场景是一台线上服务器上面跑着一堆微服务和第三方回调想看看明文 HTTP到底谁在发什么时代理方案的侵入性就成了麻烦改进程环境变量或系统代理可能影响业务行为装证书涉及安全审计得不偿失Windows 服务器上装 GUI 抓包工具远程桌面来回切体验极差。PulseHttp就是为此而生的一个开源小工具它以类 Fiddler 的只读观察版为定位直接在网卡上被动嗅探HTTP/1.1 流量——TCP 流重组、HTTP 解析、会话存储、Web 展示全部在进程内完成。目标业务进程完全无感不动一行配置、不装任何东西。一句话概括设计哲学不使用代理——旁路观察零侵入不解密 HTTPS——只看明文 HTTP不碰任何密钥与证书单二进制部署——纯 Go 实现无 CGO一个可执行文件扔上服务器就能跑。二、技术栈层选型说明语言Go 1.25双平台Windows/Linux交叉编译无 CGO抓包gopacket v1.7.2Windows 走 pcap纯 syscall 动态加载wpcap.dll免 CGOLinux 走 afpacketAF_PACKET TPACKET mmap ringWeb 框架ginREST API 静态资源托管实时推送gorilla/websocket会话事件总线 → 50ms 合并推送日志logrus结构化文本日志配置yaml.v3三层合并内置默认值 → 配置文件 → normalize前端Bootstrap 4.6 jQuery 3.5 highlight.jsCDN 引入、无构建工具、原生 ES Modulesgo:embed打进单二进制压缩解码brotli 标准库gzip / deflate / br 响应体自动解码三、核心功能与数据流先看整体数据流再逐个说功能点┌─ 网卡 (Windows: Npcap/wpcap.dll · Linux: AF_PACKET mmap ring) │ BPF 端口白名单内核层过滤 ├─ TCP 流重组gopacket reassembly乱序/重传兜底 ├─ HTTP/1.1 解析标准库 framingContent-Length/chunked/keep-alive/管线化 ├─ 会话存储内存 ring条数 body 总量双上限淘汰大 body 截断 SHA256 └─ Web UIgin REST WebSocket 实时推送 token 认证单二进制 go:embed1. 被动抓包BPF 内核过滤不设代理、不装证书端口白名单在内核层丢弃无关流量。默认抓 80 端口可配置多端口如[80, 8080, 8000]也支持在 Web 设置面板里热切换——切换时旧流自动冲刷归档新配置立即生效无需重启进程。2. 多网卡与旁路部署支持同时监听多张网卡。部署在网关/旁路镜像口时开启混杂模式即可观察非本机的流量Linux 需CAP_NET_ADMIN。Windows 抓本机回环流量时在设置面板勾选 loopback 网卡即可需 Npcap 安装时勾选 loopback 支持Linux 直接选lo。3. 实时会话列表WebSocket 推送50ms 窗口内按会话 ID 合并高频场景下既不丢事件也不刷屏。支持排序、多条件过滤文本 / Host / 方法 / 状态码 / 网卡 / 隐藏 304以及 Fiddler 用户熟悉的 QuickExec 语法语法含义?文本请求或响应中包含该文本404状态码等于 404支持区间如4xx10000响应体大于 10000 字节api.example.comHost 匹配4. 多视图 InspectorHeaders保留原始顺序解析时按序捕获不受 map 遍历乱序影响TextView / JSON / XML / RawJSON 自动格式化 语法高亮压缩解码gzip / deflate / brotli 响应体自动解开截断标注超限 body 截断保存界面明确标注原始大小与截断标记不误导排障。5. 计时三段每个会话记录请求首包 → 响应首包TTFB 近似 → 响应收完。首包时间取自网卡时间戳比应用层记录时刻更贴近真实网络行为排查慢接口时能区分等服务器和传得慢。6. 会话管理暂停/恢复暂停期间丢弃新包避免半截状态干扰、一键清空、多选删除、注释、颜色标记、保护标记受保护的会话不会被 ring 淘汰方便钉住现场慢慢看。7. 内存可控会话存储是内存 ring条数上限 body 总量上限双维度淘汰默认 1 万条 / 512 MB单 body 超过 2 MB 截断。长时间挂着跑也不会把服务器内存吃穿。8. 其他工程细节token 认证配置server.token后保护全部 API 与 WebSocket远程部署不怕裸奔优雅退出CtrlC 先停抓包并冲刷在途 TCP 流避免最后几个会话半途而废再关 Web降级容错Windows 上没装 Npcap进程不崩溃不退出Web UI 顶部横幅提示原因缺依赖 / 无权限 / 网卡不存在装好 Npcap 后在面板里重试即可端口冲突自动 13000 被占用自动换 3001不影响启动。四、项目结构PulseHttp/ ├── cmd/pulsehttp/ # 入口配置 → 事件总线 → 存储 → 抓包 → Web装配顺序即依赖方向 ├── internal/ │ ├── model/ # 纯数据契约Session/ConnInfo/Timing/BodyRef/KV/State │ │ # CaptureStats/IfaceStateapi↔capture 共享无环依赖 │ ├── config/ # YAML 三层配置默认值 → 覆盖 → normalize │ ├── events/ # typed 事件总线seq 单调、非阻塞发布慢订阅丢弃、重连全量重拉兜底 │ ├── store/ # 会话存储ring 双上限 截断 SHA256并发约定收口 │ ├── capture/ # 抓包引擎数据面枢纽 │ │ ├── source.go # Source 抽象 降级错误码npcap_missing/perm_denied/… │ │ ├── source_windows # pcap 后端纯 syscall构建标签隔离 │ │ ├── source_linux # afpacket 后端TPACKET mmap ring │ │ ├── bpfgen.go # 端口白名单 → cBPF 指令汇编 tcpdump 串 │ │ └── sniffer.go # 多源生命周期、流组装调度、暂停/恢复、统计 │ ├── httpparse/ # HTTP 解析角色判定、每连接解析循环、双向流队列 │ └── api/ # gin REST WS hub token 认证 go:embed 静态资源 └── web/ # 前端coreapi/ws/store uigrid/inspector/panels分层原则很朴素model 只放数据、不引依赖capture 和 api 之间通过 model 里的接口类型解耦api 依赖 capture 的控制面接口而非实现并发修改统一收口到 store 的闭包方法里避免散落的锁。五、环境、依赖与使用教程5.1 环境要求WindowsLinux抓包后端pcap动态加载 wpcap.dllafpacketAF_PACKET mmap运行要求安装 Npcap默认选项即可抓本机回环需勾选 loopback 支持root或setcap cap_net_raw,cap_net_adminep ./pulsehttp只抓本机流量仅需cap_net_rawWSL2—可完整验证lo网卡开箱即用5.2 安装方式一直接用发行版二进制推荐从仓库dist/目录或 Release 页取对应平台文件pulsehttp-windows-amd64.exe—— Windowspulsehttp-linux-amd64—— Linux方式二源码构建gitclone仓库地址cdPulseHttp go build-opulsehttp ./cmd/pulsehttpWindows 上也可以直接双击运行项目根目录的build.cmd一次性交叉编译出双平台产物到dist/build.cmd :: 全部Windows Linux build.cmd linux :: 仅 Linux5.3 运行./pulsehttp# Linux需 root 或提前 setcap./pulsehttp.exe# Windows./pulsehttp-configmy.yaml# 指定配置文件不指定-config时依次查找./configs/pulsehttp.yaml、./pulsehttp.yaml都不存在则使用内置默认值——零配置直接跑。启动横幅会明确告诉你状态Web UI 地址、监听与认证状态、当前抓包网卡与端口白名单。浏览器打开http://127.0.0.1:3000默认0.0.0.0:3000即可看到界面。5.4 配置全部字段有默认值按需覆盖即可server:bind:0.0.0.0# 远程访问保持 0.0.0.0port:3000token:# 认证 token空 不认证仅建议本机/可信内网使用capture:interfaces:[]# 空 默认路由网卡可配置多张同时抓ports:[80]# HTTP 端口白名单BPF 内核过滤源/目的端口任一命中promisc:true# 混杂模式旁路/网关部署抓非本机流量Linux 需 CAP_NET_ADMINflush_idle_seconds:60# 空闲连接冲刷周期sessions:max_count:10000# 会话条数上限max_body_kb:2048# 单 body 保存上限超出截断并标注ring_max_mb:512# body 总内存上限log:level:infofile:# 空 stdout指定则写文件配置了token后页面静态资源仍可加载首次 API 调用返回 401 时前端会弹出输入框输入一次即可。5.5 日常使用打开 Web UI默认看到实时滚动的会话列表Host、方法、路径、状态码、耗时三段、大小、网卡设置面板网卡多选 端口白名单输入框改完即热切换无需重启过滤与定位用 QuickExec?token、500、api.example.com、10000或过滤栏缩小范围点开任意会话上半区看请求、下半区看响应Headers 保序、JSON 高亮、压缩自动解码钉住现场给关键会话加注释 / 颜色 / 保护标记防止被 ring 淘汰暂停排查时点暂停画面定格慢慢分析恢复后继续实时滚动。5.6 验证抓包是否工作WSL2 示例# 终端 1启动选 lo 网卡sudo./pulsehttp-linux-amd64# 终端 2制造一点明文 HTTP 流量curlhttp://example.com/# 浏览器打开 Web UI会话列表应立即出现 example.com 的 GET 请求Windows 本机验证同理Npcap 装好后启动设置面板勾选 loopback 网卡然后curl http://example.com/注意不要带 https本工具只看明文。5.7 运行效果六、能力边界工具不是万能的PulseHttp 明确不做这些事选型前请对照仅支持HTTP/1.1 明文——HTTPS / HTTP2 / QUIC 不在目标范围内纯只读观察——无断点、无改写、无重放、无 HAR/pcap 导出会话存内存不持久化进程退出即清空定位是实时排障不是审计存储端口白名单上限 60 个cBPF 跳转距离的硬限制VLAN 帧与 IPv6 扩展头后的 TCP 不在 BPF 匹配范围不做进程归属哪个进程发的包不标注。写在最后PulseHttp 解决的是一个很具体的问题在服务器上用零侵入的方式看清明文 HTTP 流量。它不追求 Fiddler 的全功能只把被动观察这一件事做扎实——内核层过滤、流重组、标准 framing 解析、内存可控、单二进制、双平台。如果你有内网服务排障、第三方回调观察、明文接口审计的需求欢迎试用。项目纯 Go 实现、模块边界清晰internal/下每个包职责单一也适合作为学习 gopacket 流重组、AF_PACKET mmap、gin WebSocket 实时推送的参考实现。仓库地址https://gitee.com/penngo/ai_projects/tree/master/go/PulseHttp
返回列表