为了监控服务器和 Web 服务器之间的 HTTP 流量,我目前使用tcpdump
。这很好用,但我想删除输出中的一些多余数据(我知道 和tcpflow
,wireshark
但它们在我的环境中不容易获得)。
从tcpdump
手册页中:
打印往返于端口 80 的所有 IPv4 HTTP 数据包,即仅打印包含数据的数据包,而不是例如 SYN 和 FIN 数据包和仅 ACK 数据包。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
此命令
sudo tcpdump -A 'src example.com 和 tcp 端口 80 和 (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
提供以下输出:
19:44:03.529413 IP 192.0.32.10.http > 10.0.1.6.52369:标志 [P.],seq 918827135:918827862,ack 351213824,win 4316,选项 [nop,nop,TS val 4093273405 ecr 869959372],长度 727
呃......@...... ....P..6.0........D...... __..e=3...__HTTP/1.1 200 OK 服务器:Apache/2.2.3 (Red Hat) 内容类型:text/html;charset=UTF-8 日期:2009 年 11 月 14 日星期六 18:35:22 GMT 年龄:7149
内容长度:438<HTML> <HEAD> <TITLE>示例网页</TITLE> </HEAD> <body>
<p>您已到达此网页...</p> </BODY> </HTML>
除了突出显示的部分外,这几乎是完美的。这是什么,结束——更重要的是——我该如何摆脱它?也许只是对命令末尾的表达式进行一些小调整?
答案1
tcpdump 打印完整的数据包。您看到的“垃圾”实际上是 TCP 包头。
您当然可以使用 perl 脚本来修改输出,但为什么不使用 tshark(wireshark 的文本版本)呢?
tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
它采用与 tcpdump 相同的参数(相同的库),但由于它是一个分析器,它可以进行深度数据包检查,因此您可以进一步优化过滤器,即
tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'
答案2
答案3
答案4
您使用的 Web 服务器不生成日志吗?这肯定是监控 HTTP 流量的更好方法,有大量工具可以分析数据,任何有能力的 Web 服务器都应该生成可靠的日志。