在linux中使用tcpdump抓包的方法:

1,运行下面命令来从所有网卡中捕获数据包:

tcpdump -i any

2,从指定网卡中捕获数据包

tcpdump -i eth0

3,指定网卡,IP地址,写入文件

tcpdump -i eth0 host 10.19.150.242 -w ./datdump.cap

4,指定网卡,源ip 且 目的ip,写入文件

tcpdump -i eth0 src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump1.cap

5,指定网卡,源ip 或 目的ip,写入文件

tcpdump -i eth0 src host 10.10.100.19 or dst host 10.10.100.153 -w ./datdump1.cap

6,指定网卡,tcp端口 且 源ip 且 目的ip,写入文件

tcpdump -i eth0 tcp port 52312 and src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump3.cap

7,指定网卡,tcp端口 且 源ip 且 目的ip,写入文件

tcpdump -i eth0 host ! 10.10.100.19 and ! 10.10.100.153 -w ./datdump4.cap

8,只抓取sync的数据包 具体什么意思,详见

tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap

9,只抓取HTTP包

tcpdump -i eth0 'tcp[(tcp[12]>>2):4] = 0x48545450' -w ./datdump5.cap

10,只抓取ip数据帧中没有数据的包,详见

tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' -w ./datdump6.cap

tcpdump [ 选项 ] [ -c 数量 ] [ -i 网络接口 ] [ -w 文件名 ] [ 表达式 ]

man tcpdump


tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]

    [ -c count ]

    [ -C file_size ] [ -G rotate_seconds ] [ -F file ]

    [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]

    [ --number ] [ -Q in|out|inout ]

    [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]

    [ -W filecount ]

    [ -E spi@ipaddr algo:secret,... ]

    [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]

    [ --time-stamp-precision=tstamp_precision ]

    [ --immediate-mode ] [ --version ]

    [ expression ]



选项翻译如下: 

-l:使标准输出变为缓冲行形式;

-c:抓包次数;

-nn:直接以 IP 及 Port Number 显示,而非主机名与服务名称;

-s :<数据包大小> 设置每个数据包的大小;

-i:指定监听的网络接口;

-r:从指定的文件中读取包;

-w:输出信息保存到指定文件;

-a:将网络地址和广播地址转变成名字;

-d:将匹配信息包的代码以人们能够理解的汇编格式给出;

-e:在输出行打印出数据链路层的头部信息;

-f:将外部的Internet地址以数字的形式打印出来;

-t:在输出的每一行不打印时间戳;

-v :输出稍微详细的报文信息;--vv则输出更详细信息。

抓取带有特殊标记的数据包

示例:抓取只包含SYN位的数据包

1.客户端发送SYN

2.服务端回应SYN和ACK

3.客户端发送ACK

现在我们仅捕获包含SYN位的数据包。 注意,不希望步骤2(SYN-ACK)的数据包,只是一个普通的初始SYN。

tcp头的结构

centos tcpdump 抓取指定网卡_数据

TCP头包含20个字节固定长度的数据(上图中的前4行),而控制位位于第13个字节(字节计算从0开始)

centos tcpdump 抓取指定网卡_数据_02

只看我们感兴趣的控制位:

centos tcpdump 抓取指定网卡_写入文件_03

这些是我们感兴趣的TCP控制位。我们对这个八位组中的位进行了编号,从0到7,从右到左,所以PSH位是位编号3,而URG位是编号5,SYN位是2。

centos tcpdump 抓取指定网卡_数据_04

如果只包含 SYN 位,那就是 tcp头的第13个字节(0开始)的值为2,即tcp[13] == 2。

tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap

如果抓取包含SYN位的数据包

tcpdump -i eth0 'tcp[13] & 2 == 2' -w ./datdump5.cap

示例:只抓取ip数据包没有数据的包

tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) == 0' -w ./datdump6.cap

ip[2:2]

表示整个ip数据包总长度,即ip头的第2个字节(0开始)开始的两个字节(2,3)的值。

(ip[0]&0xf)<<2

ip头的第0个字节取低4位,然后左移两位(乘4),即ip头的长度。乘4的原因是首部长度表示有多少个32位的数据。

(tcp[12]&0xf0)>>2)

表示tcp头的长度。

示例:只抓取http数据包

tcpdump -i eth0 'tcp[(tcp[12]>>2):4] = 0x47455420' -w ./datdump5.cap

tcp[(tcp[12]>>2):4] 表示tcp头部之后的4个字节的值,0x47455420 就是HTTP的16进制。