具有tcpdump的HTTP标头的可读格式


69

我想查看在Linux机器中从Apache(在端口80上侦听)发送到Tomcat(在端口4080上)的HTTP标头。

根据维基百科

标头字段是用冒号分隔的明文字符串格式的名称/值对。

我尝试了以下tcpdump命令的一些变体:

$ sudo tcpdump -lnX dst port 4080 -c 10

11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
    0x0000:  4500 0065 3a9f 4000 3f06 0084 628a 9ec4  E..e:.@.?...b...
    0x0010:  628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1  b............K..
    0x0020:  8018 0017 fb43 0000 0101 080a 4708 d442  .....C......G..B
    0x0030:  1e5c b127 4845 4144 202f 6461 7070 6572  .\.'HEAD./dapper
    0x0040:  5f73 6572 7669 6e67 2f41 644d 6f6e 6b65  _serving/AdMonke
    0x0050:  793f                                     y?

结果始终是相同的-乱七八糟的英文单词(例如HEAD)混合在一起。

如何以人类可读的格式查看标题?


Tcpdump显示整个数据包。这包括IP和TCP标头。AFAIK,您不能仅显示TCP有效负载。
Zoredache

Answers:


93

这是我想使用的显示请求和响应HTTP标头的单行代码tcpdump(也应适用于您的情况):

sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

它的限制是将数据包截断为10Kb,并且只知道GET,POST和HEAD命令,但是在大多数情况下这应该足够了。

编辑:修改它以摆脱缓冲区的每一步,以使其更具响应性。现在需要Perl和stdbuf,因此如果没有,请使用原始版本: 编辑:将脚本端口目标从80更改为4080,以实际侦听已经通过apache的流量,而不是直接将外部流量到达端口80:

sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'

一些解释:

  • sudo stdbuf -oL -eL 使tcpdump运行行缓冲
  • 此处详细说明了tcpdump魔术过滤器:https//stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep正在寻找任何带有GET,HTTP /或POST的行;或任何看起来像标题的行(字母和数字后跟冒号)
  • BEGIN {$ | = 1}使perl运行行缓冲
  • s /.*?(GET | HTTP / [0-9。] * | POST)/ \ n $ 1 / g在每个新请求或响应开始之前添加换行符

1
效果很好。您能否添加更多有关tcpdump表达式如何工作的详细信息?
Vivek Thomas

1
此处说明了括号中的“ ip”部分,例如:stackoverflow.com/questions/11757477/…–
Kibber

你真让我头疼。可惜我只能+1。
亚伦·多布

19

您可以使用来获得接近您想要的东西-A,例如

E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*

请记住使用-s 0以确保您获得了整个包装。

另外,您可以使用wireshark交互方式查看标题。


1
尝试过-A-s 0,得到相同的输出。
亚当·马坦

2
不尝试-X
2013年

tcpdump -s 0 -A dst port 4080E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0
亚当·马坦

...这很接近您想要的东西。从“ HEAD”读取-这是HTTP有效负载。如果您确实使用过,-s 0并且之后HTTP/1.0没有任何内容,则请求中没有HTTP标头。
2013年

谢谢。没有二进制有效载荷,有没有办法只打印文本标题?
亚当·马坦

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.