一、TcpDump的安装
分为两种安装方式:
1. rpm包的形式来安装
获取root权限,安装,命令:rpm -ivh tcpdump-3.rpm
2. 源代码形式的安装
(1)获取源代码
源代码打包方式有两种:tar压缩包(tcpdump-3_4a5.tar.Z)和rpm分发包(tcpdump-3_4a5.src.rpm)。
解压缩源代码,tar格式解压命令:tar -xvfz tcpdump-3_4a5.tar.Z;rpm格式解压命令:rpm -ivh tcpdump-3_4a5.src.rpm。
(2)编译源代码前的准备工作
编译之前,确认libpcap库文件已经安装,并且准备好标准c编译器(gcc等)。
在源代码目录中,有个Makefile.in文件。可以根据当前系统的配置情况来修改(vi Makefile.in)该文件中BINDEST和MANDEST两个宏定义,它们的缺省值为:BINDEST=@sbindir@,MANDEST=@mandir@。BINDEST表示安装tcpdump的二进制文件的路径名,MANDEST表示tcpdump的man帮助页的路径名。
(3)编译源代码
./configure:执行源代码目录下的configure脚本,它从系统中读取安装所需的必要属性
make:根据makefile.in文件中的规则来编译源代码
make install:安装编译好的二进制文件
二、TcpDump的使用
1. 普通情况下,直接启动tcpdump将监视第一个网络界面所流过的数据包,信息如下:
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
从上面的输出可以看出,tcpdump对截获的数据的内容没有进行详细解码,数据包里面大部分的数据还是用16进制的形式直接输出,因此,一般做法是使用-w参数将抓取到的包保存到文件中,再使用其他工具进行解码分析(如tcpshow)
2. 在抓取网络数据包的时候,可以在tcpdump后面加上各种参数,来对所有的数据包进行过滤,获取到自己所需要的数据包。
tcpdump的命令格式:
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ]
2.1选项介绍
-a 将网络地址和广播地址转变成名字;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e 在输出行打印出数据链路层的头部信息;
-f 将外部的Internet地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 不把网络地址转换成名字;
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-c 在收到指定的包的数目后,tcpdump就会停止;
-F 从指定的文件中读取表达式,忽略其它的表达式;
-i 指定监听的网络接口;
-r 从指定的文件中读取包(这些包一般通过-w选项产生);
-w 直接将包写入文件中,并不分析和打印出来;
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议)
2.2表达式介绍
在表达式中一般有如下关键字和逻辑运算
(1)关于类型的关键字,主要包括host,net,port。
例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.
(2)确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。
例如src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
(3)协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。
Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
(4)其他重要的关键字如下:gateway, broadcast,less,greater
(5)三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││'
举例:
A 想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
B 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信:(在命令行中使用括号时,一定要加上‘\’)
#tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)
C 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D 如果想要获取主机210.27.48.1接收或发出的telnet包:
#tcpdump tcp port 23 host 210.27.48.1
E 系统将只对名为hostname的主机上eth0网卡的通信数据包进行监视(主机名可以是本地主机,也可以是网络上的任何一台计算机):
#tcpdump -i eth0 src host hostname
2.3输出信息说明
下面是集中典型的输出信息
A 数据链路层头信息
使用命令 #tcpdump --e host ice
其中, ice 是一台装有linux的主机,它的MAC地址是0:90:27:58:AF:1A,
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;
上一条命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telnet 0:0(0) ack 22535 win 8760 (DF)
分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
B ARP包的TcpDump输出信息
使用命令#tcpdump arp
22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。
C TCP包的输出信息
使用命令#tcpdump tcp
src > dst: flags data-seqno ack window urgent options
src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. Options是选项.
D UDP包的输出信息
用TcpDump捕获的UDP包的一般输出信息是:
UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth