根据Wikipedia,
<头标字段是明文字符串格式的冒号分隔的名称/值对。
我尝试了以下
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 楼
这是我想使用tcpdump
显示请求和响应HTTP标头的一种方法(它也适用于您的情况):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/g'
它限制了数据包的切割以10Kb的速度关闭,并且只知道GET,POST和HEAD命令,但是在大多数情况下应该足够了。
EDIT:对其进行了修改,使其在每一步都摆脱了缓冲区的影响,从而使响应速度更快。不过现在需要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/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在每个新请求或响应开始之前添加换行符
评论
效果很好。您能否添加更多有关tcpdump表达式如何工作的详细信息?
– Vivek Thomas
2014年10月4日4:54
此处解释了括号中的“ ip”部分,例如:stackoverflow.com/questions/11757477/…
– Kibber
2015年5月27日,1:11
你真让我头疼。可惜我只能+1。
–亚伦·多布(Aaron Dobbing)
2015年9月10日下午13:01
哇,我认为stdbuf | egrep | perl刚刚使WireShark过时了😊很棒的oneliner
– conny
20 Mar 11 '20 at 10:58
#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
来交互查看标题。评论
尝试-A和-s 0,得到相同的输出。
–亚当·马坦(Adam Matan)
13年5月2日,11:51
尝试不使用-X。
– Flup
13年5月2日,11:52
tcpdump -s 0 -dst端口4080给出E..e .. @。?。$ bb ... b ....:...... w ........ Q ... ..G..1.b..HEAD / dapper_serving / AdMonkey?ping = 1 HTTP / 1.0。
–亚当·马坦(Adam Matan)
13年5月2日,11:56
...这很接近您想要的东西。从“ HEAD”读取-这是HTTP有效负载。如果您确实使用-s 0,并且在HTTP / 1.0之后没有任何内容,则请求中没有HTTP标头。
– Flup
2013年5月3日7:00
谢谢。没有二进制有效载荷,有没有办法只打印文本标题?
–亚当·马坦(Adam Matan)
13年5月3日,12:47
#3 楼
尝试使用http://justniffer.sourceforge.net/它是更好的工具或带有“跟随TCP流”选项的Wireshark,与tcpdump相比,有很多更好的选项可以查看标头(请求/响应)
评论
也许还要添加一个示例,说明如何使它正常工作
–vikas027
18年3月24日在5:09
也许您可以阅读手册页? justniffer.sourceforge.net/#!/man_page
–达妮拉·拉德纳(Danila Ladner)
18-3-25的3:06
评论
Tcpdump显示整个数据包。这包括IP和TCP标头。 AFAIK,您不能仅显示TCP有效负载。还请检查fir3net.com/UNIX/Linux/…我不见了