一、tcpdump简介
tcpdump是一个命令行网络抓包工具,核心功能是捕获制定网络接口的数据包,并按照指定的规则解析和显示数据包。
Debian系统上tcpdump通常不是预装的,需要使用apt安装:
bash
sudo apt update
sudo apt install tcpdump
二、tcpdump使用方法
tcpdump的基本命令格式:
bash
sudo tcpdump [选项] [过滤表达式]
1.选项
|-------------|-------------------|---------------------------------------------------------------------------|
| 选项 | 全称 | 作用 |
| -i <接口> | --interface | 指定要监听的网络接口,-i any可以监听所有活动的接口 网络接口使用 ip a命令查看 |
| -n | | 直接显示IP地址,而非解析为服务名,可以显著加快解析速度 |
| -nn | | 直接显示IP地址和端口号,而非解析为服务名,可以显著加快解析速度 |
| -c <数量> | --count | 捕获到指定数量的数据包后自动退出 |
| -A | | 以ASCII格式打印每个数据包的内容,但不包括链路层头部 |
| -X | | 同时以十六进制和ASCII格式打印数据包内容,包括链路层头部 |
| -XX | | 与-X类似,但是会显示更多的数据包内容 |
| -v/-vv/-vvv | --verbose | 输出更详细的内容,v越多输出越详细 |
| -s <长度> | --snapshot-length | 设置从每个数据包中捕获的数据字节长度,默认是262144字节 如果只想捕获数据包头部内容,可以设置为 -s 96 使用-s 0 表示捕获整个数据包 |
| -w <文件> | --wirte | 将捕获到的网络数据包写入文件,而非在屏幕上显示 文件通常以.pcap结尾,是二进制文件,需要使用tcpdump -r xxx.pcap读取 |
| -r <文件> | --read | 从之前保存的文件中读取并分析数据包,而非从网络接口捕获并分析 |
2.过滤表达式
过滤表达式由原语、限定词和逻辑表达式组成
限定词:
- 类型:host,net,port,portrange
- 方向:src,dst
- 协议:tcp,udp,icmp,arp,ip,ip6
逻辑运算符:
- and,&&
- or,||
- not,!
- () 用于组合条件,但是在shell中需要转义:\(...\)
3.过滤示例
- host 192.168.1.100:捕获与指定主机的(源或目的)的所有数据包
- src host 192.168.1.100:只捕获来自该主机的数据包
- dst port 80:只捕获目的是80端口的数据包
- tcp port 22:只捕获使用TCP协议且端口是22的数据包
- net 192.168.1.0/24:捕获整个192.168.1.x网段的数据包
- icmp:只捕获使用icmp协议的数据包
- udp portrange 10000-20000:捕获使用UDP协议且端口号在10000到20000之间的数据包
- src host 10.0.0.5 and (dst port 80 or dst port 443):捕获来自主机10.0.0.5且目的端口是80或443的数据包
- tcp and not host 192.168.1.1:捕获所有使用tcp协议的数据包,但除去192.168.1.1的数据包
三、tcpdump的实际使用示例
1.捕获指定网络接口的数据包,并写入二进制文件
bash
zbc@zbc-PC:~/Code/tmp$ sudo tcpdump -i eno1 -c 10 -nn -w 111.pcap
tcpdump: listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
21 packets received by filter
0 packets dropped by kernel
zbc@zbc-PC:~/Code/tmp$ tcpdump -r 111.pcap
reading from file 111.pcap, link-type EN10MB (Ethernet)
17:48:46.985714 IP zbc-PC.48476 > sea09s30-in-f10.1e100.net.https: Flags [S], seq 3788360429, win 64240, options [mss 1460,sackOK,TS val 3932148771 ecr 0,nop,wscale 7], length 0
17:48:46.994410 88:2a:5e:0f:a7:c6 (oui Unknown) > 01:0f:e2:00:00:07 (oui Unknown), ethertype Unknown (0x8918), length 60:
0x0000: 0001 0000 0010 0000 0108 882a 5e0f a7c6 ...........*^...
0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0020: 0000 0000 0000 0000 0000 0000 0000 ..............
17:48:47.022034 ARP, Request who-has 192.168.111.254 tell 192.168.111.91, length 46
17:48:47.087801 IP 10.20.12.67.33652 > 239.255.255.250.1900: UDP, length 166
17:48:47.110984 74:d6:cb:07:24:ab (oui Unknown) > 01:0f:e2:00:00:07 (oui Unknown), ethertype Unknown (0x8918), length 60:
0x0000: 0001 0000 0010 0000 0108 74d6 cb07 24ab ..........t...$.
0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0020: 0000 0000 0000 0000 0000 0000 0000 ..............
17:48:47.175459 STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 102
17:48:47.191153 IP6 fe80::c48d:50bb:2116:a142 > ff02::1:ff99:801: ICMP6, neighbor solicitation, who has _gateway, length 32
17:48:47.300345 50:fa:84:ac:63:cb (oui Unknown) > Broadcast, RRCP-0x23 query
17:48:47.337555 IP6 zbc-PC.44748 > edge-star-mini6-shv-02-lax3.facebook.com.https: Flags [S], seq 779843219, win 64800, options [mss 1440,sackOK,TS val 3370035297 ecr 0,nop,wscale 7], length 0
17:48:47.356984 50:fa:84:ac:62:ed (oui Unknown) > Broadcast, RRCP-0x23 query
2.捕获USB总线上的数据包
捕获命令:tcpdump -i usbmon1 -w usb.pcap
tcpdump不止能捕获网络数据包,也能捕获usb通信数据包。tcpdump本质上是一个从各种接口读取数据并解析/转储的工具,虽然它最常用在网络接口,但是它的设计是通用的,只要某个接口能提供标准格式的数据包,tcpdump就能读取。
使用tcpdump -D命令查看能够捕获的所有接口,会发现输出中有usbmon1,usbmon2... ,这是USB总线监控接口,属于内核的usbmon功能,用于捕获USB总线上的原始通信数据,即所有USB设备与主机控制器之间的通信数据包。usbmon1对应USB总线1,usbmon2对应USB总线2,以此类推。
前置条件:
- 内核开启CONFIG_USB_MON选项
- 挂载debugfs:sudo mount -t debugfs none /sys/kernel/debug(mount | grep debugfs验证)
- 加载usbmon模块:sudo modprobe usbmon(lsmod | grep usbmon验证)
从usbmon捕获数据包需要使用wireshark工具解析,可读性更强
bash
zbc@zbc-PC:~/Code/myproject$ sudo tcpdump -i usbmon1 -c 20 -w usb.pcap
tcpdump: listening on usbmon1, link-type USB_LINUX_MMAPPED (USB with padded Linux header), capture size 262144 bytes
20 packets captured
50 packets received by filter
0 packets dropped by kernel
