在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则输出更详细信息。
抓取带有特殊标记的数据包
https://www.jb51.net/LINUXjishu/118388.html?pc
示例:抓取只包含SYN位的数据包
1.客户端发送SYN
2.服务端回应SYN和ACK
3.客户端发送ACK
现在我们仅捕获包含SYN位的数据包。 注意,不希望步骤2(SYN-ACK)的数据包,只是一个普通的初始SYN。
tcp头的结构
TCP头包含20个字节固定长度的数据(上图中的前4行),而控制位位于第13个字节(字节计算从0开始)
只看我们感兴趣的控制位:
这些是我们感兴趣的TCP控制位。我们对这个八位组中的位进行了编号,从0到7,从右到左,所以PSH位是位编号3,而URG位是编号5,SYN位是2。
如果只包含 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进制。