简介
Tcpdump是linux环境下的报文抓包工具。支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
Windows下一般使用wireshark进行报文抓取和报文分析。Linux下一般可以使用tcpdump+(tcptrace或wireshark)。
安装tcpdump
本文以redhat as 5作为基础环境安装说明,内核:
Linux hadoop00 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
下载对应的RPM版本,下载地址:http://www.tcpdump.org
# wget http://www.tcpdump.org/release/tcpdump-4.0.0.tar.gz
# tar -xzvf tcpdump-4.0.0.tar.gz
# ./configure
# make
# make install
# tcpdump -?
tcpdump version 4.0.0
libpcap version 1.1.1
Usage: tcpdump [-aAdDefIKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -M secret ] [ -r file ]
[ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ]
[ -y datalinktype ] [ -z command ] [ -Z user ]
[ expression ]
Tcpdump常用命令
打印参数
-A:以ASCⅡ编码打印除了链路层报文头外的报文内容。用于捕捉web请求。
-B:设置抓取报文的缓存大小。
-c:收到多少包后退出程序
-dd:dump报文存储格式为C程序格式。
-e:打印链路层报文头
-X:不包括数据链路层的报文,并且以ASCⅡ的编码方式。
-v:详细的输出,也就比普通的多了个TTL和服务类型
-vv:截取显示详细的报文(注意是两个v)
-n:不进行IP地址到主机名的转换
-nn:不进行端口名称的转换
-N:不打印出默认的域名
-O:不进行匹配代码的优化
-t:不打印UNIX时间戳,也就是不显示时间
-tt:打印原始的、未格式化过的时间
-S:Print absolute, rather than relative, TCP sequence numbers.
-w filename : 保存截取的报文到指定的文件。
tcpdump man 文档: http://www.tcpdump.org/tcpdump_man.html
过滤参数
-b 在数据链路层上选择过滤的协议,包括ip,arp,rarp,ipx等
-i 表示指定过滤的网络设备,如网卡标志(eth0,eth1等)。
src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项,用于分辨数据包的来源和去向。可以使用and,or和not等进行逻辑组合。
src:数据源(请求);dst 目标;host 主机名或IP;net只网络平面或段;port表示端口号;ether只的是物理地址,即MAC地址;geteway表示网关。
例子:
# tcpdump src host 192.168.1.100 and dst host 192.168.1.101 and port 8080
表示:源为192.168.1.100,目标为192.168.1.101并且端口号为8080的报文。
# tcpdump dst net 192.168.0.0/24
表示目标的网络地址为192.168.0.0/24的子网
我习惯的报文截取和分析
服务器上tcpdump截取报文,本地wireshark分析报文
1. 使用tcpdump在目标服务器上截取报文并保持到文件中。
# # tcpdump -X –w httpdump ‘tcp port 8080 and (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0)’
# sz httpdump
2. 下载截取的报文文件到本地,使用wireshark进行分析。
打开wireshark,点击界面中间的open打开下载的dump文件。
列表和流式浏览报文
HTTP报文截取例子
1. 源,目标及端口号过滤
# tcpdump –X –w filename src 192.168.91.1 and dst 192.168.91.10 and port 8080
2.通过报文中的协议标志过滤
# tcpdump -XvvennSs 0 -i eth0 –w filename tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为”GET”前两个字母”GE”
0x4854 为”HTTP”前两个字母”HT”
3.端口号及报文头标志(官方例子)
# tcpdump -X –w filename ‘tcp port 8080 and (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0)’