使用tcpdump抓包

最近搞PKI,遇到问题经常不明所以,后来找同事帮忙抓包才定位到原因,瞬间感觉学习抓包的重要。

为什么要使用tcpdump

据了解tcpdump工具在unix中内置了,所以一般的什么ubuntu、Android、mac系统中都内置了,不需要额外下载安装,尤其是在Android系统中使用非常方便。

本文主要参考肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁,一边学习,一遍整理成自己容易记忆的文字,感谢原作!

命令格式

eg:

1
tcpdump src host 192.168.10.100

tcpdump参数图解

  1. option 可选参数;
  2. proto 协议过滤器,根据协议进行过滤,关键词:upd,udp,icmp,ip,ip6,arp,rarp,ether,wlan,fddi,tr,decnet;
  3. direction 定向过滤器,根据数据流向进行过滤,关键词:src,dst,可以通过逻辑运算符进行组合,如:src or dst;
  4. type 类过滤器,关键词:host,net,port,portrange。

输出格式

1
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
  1. 时间:时:分:秒.毫秒
  2. 网络协议:IP
  3. 发送方ip.端口号
  4. 箭头表示数据流向
  5. 接收方ip.端口号
  6. 冒号
  7. 数据包内容,包括Flags标识符,seq号,ack号,win窗口,数据长度length。

Flags 标识符

常规过滤规则

IP和域名过滤

1
2
3
4
5
6
7
tcpdump host 192.168.10.100

#根据源IP过滤
tcpdump -i eth2 src 192.168.10.100

#根据目标IP过滤
tcpdump -i eth2 dst 192.168.10.200

网段过滤

1
2
3
4
5
6
7
tcpdump net 192.168.10.0/24

#源网段
tcpdump src net 192.168.10.11

#目标网段
tcpdump src net 192.168.10.11

端口过滤

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
tcpdump port 8088

# 源端口
tcpdump src port 8088

# 目标端口
tcpdump dst port 8088

# 多个端口
tcpdump port 80 or 8088

# 范围抓取
tcpdump portrange 8000-8080$ tcpdump src portrange 8000-8080$ tcpdump dst portrange 8000-8080

协议过滤

1
tcpdump tcp

可选值:

protocol 可选值:

可选参数

不解析域名提升速度

过滤结果输出到文件

-w参数后接一个以.pcap为后缀的文件名。

1
tcpdump icmp -w icmp.pcap

从文件读取包数据

1
tcpdump icmp -r icmp.pcap

控制输出

控制时间

显示数据包头部

过滤指定网卡的数据包

过滤特定流向的数据包

1
2
3
4
5
6
7
8
// 入方向
tcpdump -Q in

// 出方向
tcpdump -Q out

// 都要
tcpdump -Q inout

其他常用参数

输出控制参数

逻辑过滤

tcpdump可以通过逻辑运算符配置出更加灵活的过滤规则:

eg:

比如我现在要过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包,可以这样子写:

1
tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"

特殊过滤规则

过滤mac地址

1
tcpdump ether host [ehost]$ tcpdump ether dst    [ehost]$ tcpdump ether src    [ehost]

过滤网关

1
tcpdump gateway [host]

过滤广播/多播数据包

1
tcpdump ether broadcast$ tcpdump ether multicast$ tcpdump ip broadcast$ tcpdump ip multicast$ tcpdump ip6 multicast