1. 概述
tcpdump是一个用于抓取网络数据包的命令行工具,与带界面的Wireshark一样,基于libpcap库构建。
tcpdump的设计目标是帮你分析包头(比如Tcp包头,udp包头),同时你可以根据包头,用它支持的表达式,过渡出你感兴趣的包,从而方便你自己处理包中数据。
2.移植
分为下面三步:
1)设置环境变量:
a. vi configure.env
b. 输入以下内容:
ARCH=xxxxxx #xxxxx为你的编译器目录
CC=${ARCH}-gcc
CXX=${ARCH}-g++
AR=${ARCH}-ar
export ARCH
export CC
export CXX
export AR
c. 保存后,配置当前shell:
source configure.env
2)移植libpcap
a. 下载libpcap-1.0.0.tar.gz;
b. 解压:
tar xvf libpcap-1.0.0.tar.gz
c. 进入解压后的libpcap-1.0.0目录,配置项目:
ac_cv_linux_vers = 2.6.35 ./configure -host=arm-linux --with-pcap=linux --prefix=xxxxxx #2.6.35为目标linux版本,xxxxxx为你想安装的位置
d.编译、安装:
make; make install
3)移植tcpdump
a.下载tcpdump-4.0.0.tar.gz;
b.解压:
tar xvf tcpdump-4.0.0.tar.gz
c.进入解压后的tcpdump-4.0.0目录,配置项目:
ac_cv_linux_vers = 2.6.35 ./configure -host=arm-linux --prefix=xxxxxx #选项含义同上
d.编译:
make; #此步骤会提示"undefined reference to ‘ip6_print‘"
e.注释掉print-enc.c文件中的下面这段:
case AF_INET6:
ip6_print(p, length);
break;
f.编译、安装:
make; make install #完成后,可以安装目录的sbin中找到tcpdump
3.使用
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 ]
2)常用标志:
-x #打印数据的16进制值,每行16个字节
-X #同上,还在每行右边显示对应的ASCII的值,如果值可显示的话
-s 0 #打印时,包括包中的数据,默认只打包的帧头(比如:tcp的帧头)
3)常用表达式
a. 单个表达式间存在空格时,要用引号包起来
b. 表达式间要用and/or/not连接起来
src/dst #指定下一个参数(host/net/port) 作用于本地,或是远程
host/net 192.168.1.150 #指定我们关心的主机、IP等
tcp/udp port 3333 #指定我们关心的tcp或udp端口
and or not #表达式间的与、或、非
& || ! #表达式内部的与、或、非
c.示例
./tcpdump -X -s 0 host 192.168.1.153 and "tcp[tcpflags] & tcp-push != 0" and src port 3333
#抓住所有从192.168.1.153的3333端口发过来的tcp数据包(不要同步包、结束包等),并将包头和数据的16进制值与ASCII值打印到控制台
4)详细使用说明
标志说明:http://www.tcpdump.org/tcpdump_man.html
表达式说明:http://www.tcpdump.org/manpages/pcap-filter.7.html