最近需要分析某程序的所有 HTTP 请求。
需求大概可分为两类:
- 监控本机发送给目标 host 的所有请求
- 监控某个进程的所有 http 请求
tcp 抓包工具
这类工具工作在 tcp 层,可以过滤指定目标 host 的包
- tcpdump -A -s0 -i eth0 host www.example.com and port 80
最基本的,但是输出凌乱……
- tcpflow -c -p host www.example.com and port 80
基本可行
- wireshark-gtk
我是用 root 运行,选择 eth0 ,添加过滤器 tcp port 80,然后在查看的窗口中也过滤 http。这个时候你的其他浏览器最好不要发请求……
虽然是 GUI 程序,但看请求内容的时候感觉还不如 tcpflow 方便
其他工具:
反向代理类
原理是改 hosts ,把发给目标 host 的所有请求反向代理到自己的中间层上,然后中间层输出所有请求数据。也就是说,反向代理也只能实现需求 1 ,不能实现需求 2 。
- fiddler2
Windows 的,算了……
也算了……
- nginx && apache
最后我想既然我要的是反向代理,那么 nginx 或者 apache 能不能配置在反向代理中 log request headers / body 呢?
最后没找到相应 log 选项……
监控进程类
- strace -e trace=network -s 65536 -o strace.log cmd
strace 的输出基本上没法看...比如 recvfrom 可能是一个字节一个字节调用的
网上的讨论:
http://social.technet.microsoft.com/Forums/en-US/netmon/thread/4098958f-0527-4f09-bdf1-a671325d40cd 给出了 Windows 下的 netsh trace 可以?
http://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process 似乎 linux 下除了 strace 以外也没有其他办法
可能自己写一个 strace 输出的整合工具会好一点
总结
轻量级 tcpflow ,重量级 wireshark
strace 输出整合工具,有时间再写
from http://www.douban.com/note/237408782/