tcpdump会在网络接口抓取匹配布尔表达式的包,并将包的描述内容打印出来。如果系统中没有tcpdump,需要手工安装一下。本文以Centos6.5为基础进行讲解,安装tcpdump的命令:yum install -y tcpdump



在讲抓包以前,首先需要了解一下网卡的工作模式。网卡有四种模式:

广播模式(Broadcast):网卡接收广播数据

多播模式(Multicast):网卡接收多播数据

单播模式(Unicast):网卡只接收目的mac为自己的数据

混杂模式(Promiscuous):网卡接收所有通过它的数据,不管目的mac是不是自己。

通过对网卡模式的描述,我们知道,如果要抓取目的mac地址不为自己的数据包,需要开启网卡的混杂模式,windows中网卡没有模式的概念,由应用程序本身决定网卡的功能。

如果使用SSH登录到远程Linux,运行tcpdump,会发现抓到大量的数据包,这是因为tcpdump将抓到的包发送给远端,同时又抓了这个包,再显示,再抓取,造成了循环抓取。通过ctrl+c退出即可。

tcpdump的使用可以接一些可选参数

-D显示可以通过哪几个网卡抓包

# tcpdump -D
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.any (Pseudo-device that captures on all interfaces)
6.lo

-i 后接网卡名字,指定抓哪一个网卡的包

tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

-w 将抓取的数据保存为文件

tcpdump -i eth1 -w test5.cap
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

-r 读取通过-w参数保存的文件

# tcpdump -r test5.cap |grep ssh
reading from file test5.cap, link-type EN10MB (Ethernet)
15:37:39.578895 IP 192.168.56.102.ssh > 192.168.56.1.50480: Flags [P.], seq 2289452744:2289452920, ack 252499783, win 153, length 176
15:37:39.579071 IP 192.168.56.1.50480 > 192.168.56.102.ssh: Flags [.], ack 176, win 256, length 0
15:37:49.814141 IP 192.168.56.1.50480 > 192.168.56.102.ssh: Flags [P.], seq 1:97, ack 176, win 256, length 96

信息简单分析如下:

15:37:39 时间

578895 ID

IP 192.168.56.102.ssh > 192.168.56.1.50480 表示从192.168.56.102的ssh端口发送到192.168.56.1的50480端口的数据

Flags 是TCP报文中的标志信息

seq TCP报文的序列号

ack 确认序列号,希望下次收到的序列号

win 窗口大小

length 包的长度

-c 收到多少个数据包后退出

# tcpdump -c 3 -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:04:06.258916 IP 192.168.56.102.ssh > 192.168.56.1.50480: Flags [P.], seq 2289463272:2289463512, ack 252506311, win 153, length 240
16:04:06.259849 IP 192.168.56.1.50480 > 192.168.56.102.ssh: Flags [.], ack 240, win 253, length 0
16:04:06.380007 IP 192.168.56.102.ssh > 192.168.56.1.50480: Flags [P.], seq 240:560, ack 1, win 153, length 320
3 packets captured
3 packets received by filter
0 packets dropped by kernel

-f 用数字的形式显示外部地址

-n 不把地址转换成名字

-N 不显示主机名字中的域名部分

-q 快速输出

-t 禁止显示时间戳

tcpdump 后可以使用过滤器来过滤抓取哪些数据包,主要通过BPF语言来使用。

BPF语言主要有一个标志和限定词组成,限定词有三种

第一种:指定类型

host:可以指定主机的IP或MAC

net:可以指定网络号,只给出网络号就可以,比如 tcpdump net 10.1.1 tcpdump会通过网络判断这是一个C类地址

port:指定端口

portrange:指定端口范围

第二种:指定方向

src:指定源主机或网络

dst:指定目的主机或网络

第三种:指定协议

主要包括ether,fddi,ip,ip6,arp,,rarp,tcp等


截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname
监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname