使用 tcpdump 实现可读的 http 标头格式

使用 tcpdump 实现可读的 http 标头格式

我想要查看 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)。

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

答案1

下面是我想出的用于显示请求和响应 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 magic filter 的详细解释如下:https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep 正在寻找任何带有 GET、HTTP/ 或 POST 的行;或任何看起来像标题的行(字母和数字后跟冒号)
  • 开始{$|=1}导致 perl 运行行缓冲
  • s/.*?(GET |HTTP/[0-9.]* |POST )/\n$1/g在每个新请求或响应开始前添加一个换行符

答案2

你可以通过使用得到接近你想要的东西-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以交互方式查看标题。

答案3

尝试使用http://justniffer.sourceforge.net/ 带有“跟踪 TCP 流”选项的 Wireshark 是更好的工具,有很多比 tcpdump 更好的选项可以查看标头(请求/响应)

相关内容