tcpdump

一、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
相关推荐
maosheng11466 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken7 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2917 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C7 小时前
CPU Cache
linux·cache
Hoshino.418 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源10 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry10 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu10 小时前
Linux安装redis
linux·运维·redis
寂柒12 小时前
序列化与反序列化
linux·网络
lay_liu12 小时前
ubuntu 安装 Redis
linux·redis·ubuntu