Linux tcpdump

tcpdump 根据用户自定义的规则截取网络数据包,并输出内容的工具。

它支持针对网络层、协议、主机、网络或端口的过滤,并提供 andornot 等逻辑语句来帮助你去掉无用的信息。

一、tcpdump 抓包常用参数

参数 说明
-c count 指定要抓取的包数量,将在接受到 count 个数据包后退出
-i interface 指定 tcpdump 需要监听的接口。默认会抓取第一个网络接口(接口编号最小的配置可用的)
-F file 使用 file 文件中的抓包规则进行抓包。此时命令行的规则失效
-s snaplen 设置 tcpdump 抓数据包的长度, 如果不设置默认将会是68字节
-T type 指定 tcpdump 抓取某种协议的包。aodv cnfprtp rtcp snmp tftp vat wb
-y datalinktype 设置 tcpdump 只捕获数据链路层协议类型是 datalinktype 的数据包

二、tcpdump 输出常用参数

参数 说明
-D 打印系统中所有 tcpdump 可进行抓包的网络接口
-q 快速输出,只输出较少的信息
-n 用 ip 的方式显示主机地址
-e 每行的输出中将包括数据包的数据链路层头部信息
-L 列出指定网络接口所支持的数据链路层的类型后退出
-O 禁用包匹配时的优化代码。当怀疑某些 bug 是由优化代码引起时可以使用
-w file 把数据写入文件。 这些包数据可在随后通过 -r 命令来进行分析和打印
-W filecount -C file_size 一起使用,限制打开的文件数量, 并且当文件数超过 filecount 设置的限制时,次循环替代之前的文件
-C file_size 将 tcpdump 抓取的数据保存到文件中。当文件大于 file_size 时,创建新的记录文件。与 -w file 一起使用
-r file 读取 -w file 中生成的文件。使用 "-" 表示从标准输入中读取。
-t 在每行输出中不打印时间戳
-tt 不对每行输出的时间进行格式处理
-ttt tcpdump 输出时, 每两行打印之间会延迟一个段时间(以毫秒为单位)
-tttt 在每行打印的时间戳之前添加日期的打印
-X tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据
-XX -X 的基础上增加数据链路层的头部信息
-v 产生详细的输出,如:生存时间、标识、总长度等。-vv-vvv 一个比一个内容多
-d 将匹配信息包的代码用汇编格式显示
-dd 将匹配信息包的代码用C语言程序段格式显示
-ddd 将匹配信息包的代码用十进制格式显示

三、表达式

表达式用于筛选输出哪些类型的数据包,如果没有给定表达式,所有的数据包都将输出。

表达式由一个或多个表达元 组成(表达元:组成表达式的基本元素)。

一个表达元通常由一个或多个修饰符,后跟一个名字或数字组成。

有三种不同类型的修饰符:typedir 以及 proto

修饰符 说明 示例
type 指定抓取类型。默认为 host typehost: 表示主机地址 net:网络 port:端口 portrange:端口范围 host 128.34.1.10 net 128.3 port 20 portrange 5000-6000
dir 指定抓取数据包方向。默认为 src or dst dir: src: 源地址 dst:目标地址 src or dst:源地址或目标地址 src and dst:源地址且目标地址 src 172.12.45.2:表示源主机为 172.12.45.2 的数据包 dst net 128.3:表示目标网络为128.3的数据包 src or dst port 22:表示源或目的端口为22的数据包 src and dst port 22:表示源且目的端口为22的数据包
proto 指定抓取数据包协议类型 protowlan:无线局域网协议 ip:ipv4 协议 ip6:ipv6协议 arp:地址解析协议 rarp:反向地址解析协议 decnet:机器互联的网络协议 tcp upd ether src 145.23.34.33:从以太网地址 145.23.34.33 来的数据包 arp net 128.3:发往或来自128.3 网络的 arp 协议数据包 tcp port 21:发送或接收端口为 21 的 tcp 协议数据包 udp portrange 7000-7009:发送或接收端口范围为 7000-7009 的 udp 协议数据包

四、示例

1. 抓取指定网卡数据包

不指定网卡默认是第一个

shell 复制代码
root@test-physical:~# tcpdump -i eth2
listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
09:49:32.521925 IP 172.16.245.1 > 172.16.245.153: ICMP echo request, id 62819, seq 0, length 64
09:49:32.521942 IP 172.16.245.153 > 172.16.245.1: ICMP echo reply, id 62819, seq 0, length 64
2. 抓取指定 host 的数据包
shell 复制代码
root@test-physical:~# tcpdump host 172.16.245.1
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:24:39.166981 IP 172.16.245.145.ssh > 172.16.245.1.62592: Flags [P.], seq 2121937010:2121937198, ack 564783646, win 315, options [nop,nop,TS val 297485967 ecr 2044646503], length 188
14:24:39.167281 IP 172.16.245.1.62592 > 172.16.245.145.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 2044646913 ecr 297485967], length 0
3. 抓取 hostA 和 hostB 之间或 hostA 和 hostC 之间的通讯

tcpdump host hostA and \(hostB or hostC \)

shell 复制代码
root@test-physical:~# tcpdump host 172.16.245.1 and \(172.16.245.145 or 172.16.245.146\)
4. 抓取 hostA 与所有主机之间的通讯,但是不包括 hostB

tcpdump ip host hostA and not hostB

shell 复制代码
root@test-physical:~# tcpdump ip host 172.16.245.1 and not 172.16.245.145
5. 抓取指定源地址或 IP 的数据包

tcpdump src host hostname

抓取源地址是 baidu.com 的数据包

shell 复制代码
root@test-physical:~# tcpdump src host baidu.com
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:46:33.484762 IP 220.181.38.148 > 172.16.245.153: ICMP echo reply, id 38286, seq 1, length 64
14:46:34.487862 IP 220.181.38.148 > 172.16.245.153: ICMP echo reply, id 38286, seq 2, length 64
14:46:35.491003 IP 220.181.38.148 > 172.16.245.153: ICMP echo reply, id 38286, seq 3, length 64
6. 抓取指定目标地址或 IP 的数据包

tcpdump dst host hostname

抓取目标地址是 baidu.com 的数据包

shell 复制代码
root@test-physical:~# tcpdump dst host baidu.com
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:41:32.028922 IP 172.16.245.153 > 220.181.38.148: ICMP echo request, id 38241, seq 1, length 64
14:41:33.030989 IP 172.16.245.153 > 220.181.38.148: ICMP echo request, id 38241, seq 2, length 64
14:41:34.034075 IP 172.16.245.153 > 220.181.38.148: ICMP echo request, id 38241, seq 3, length 64
7. 抓取指定端口和主机的数据包

tcpdump tcp port portNumber and host hostname

shell 复制代码
root@test-physical:~# tcpdump -i eth0 port 80 and host www.baidu.com
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:00:55.976759 IP 192.168.50.145.51677 > 61.135.169.121.443: Flags [F.], seq 3695524080, ack 157044170, win 4096, length 0
15:00:55.976789 IP 192.168.50.145.51676 > 61.135.169.125.443: Flags [F.], seq 1010083189, ack 1311922281, win 4096, length 0
15:00:55.976822 IP 192.168.50.145.51675 > 61.135.169.121.443: Flags [F.], seq 1355311995, ack 556334558, win 4096, length 0
8. 抓取指定网络的数据包

tcpdump -c count net netIP

抓取本机与 172.16 网段通信的 10 个数据包

shell 复制代码
root@test-physical:~# tcpdump -c 10 net 172.16
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:03:54.887095 IP 172.16.245.145.ssh > 172.16.245.1.62592: Flags [P.], seq 2240238270:2240238458, ack 564887890, win 315, options [nop,nop,TS val 298074897 ecr 2046987344], length 188
15:03:54.887189 IP 172.16.245.1.62592 > 172.16.245.145.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 2046987853 ecr 298074897], length 0
15:03:54.887510 IP 172.16.245.153.42352 > public1.114dns.com.domain: 52224+ PTR? 1.245.16.172.in-addr.arpa. (43)
15:03:55.322557 ARP, Request who-has 172.16.245.153 tell 172.16.245.2, length 46
15:03:55.322578 ARP, Reply 172.16.245.153 is-at 00:0c:29:4b:87:05 (oui Unknown), length 28
15:03:55.322652 IP 118.144.77.165.4506 > 172.16.245.153.54822: Flags [R.], seq 3084328717, ack 449394572, win 64240, length 0
15:03:57.577262 IP 172.16.245.1 > 172.16.245.145: ICMP echo request, id 14029, seq 0, length 64
15:04:14.911573 IP 172.16.245.145.ssh > 172.16.245.1.62592: Flags [P.], seq 188:560, ack 1, win 315, options [nop,nop,TS val 298079903 ecr 2046987853], length 372
15:04:14.911641 IP 172.16.245.153.38782 > public1.114dns.com.domain: 28450+ PTR? 114.114.114.114.in-addr.arpa. (46)
15:04:24.940290 IP 172.16.245.145.ssh > 172.16.245.1.62592: Flags [P.], seq 560:708, ack 1, win 315, options [nop,nop,TS val 298082410 ecr 2047007856], length 148
10 packets captured
37 packets received by filter
25 packets dropped by kernel
9. 抓取 ICMP 包。ping包

tcpdump -i networkCard icmp

shell 复制代码
root@test-physical:~# tcpdump -i eth0 icmp

指定某主机对本机的 ping 包

shell 复制代码
root@test-physical:~# tcpdump -i eth0 icmp and src 172.16.245.145
10. 抓包并保存到指定文件

tcpdump -i networkCard -c count -w filePath

抓取的数据包保存到 /var/log/tcpdump.log 文件中,当抓取100个数据包后就退出程序

shell 复制代码
root@test-physical:~# tcpdump -i eth0 -c 100 -w /var/log/tcpdump.log
11. 读取抓包保存文件

tcpdump -i networkCard -r filePath

/var/log/tcpdump.log 中读取 tcp 协议的数据包

shell 复制代码
root@test-physical:~# tcpdump -i eth0 -r /var/log/tcpdump.log

读取文件中 host 是 172.16.245.145 的数据包

shell 复制代码
root@test-physical:~# tcpdump -i eth0 -r /var/log/tcpdump.logl host 172.16.245.145
12. 抓取多播并数据包

tcpdump -i networkCard ether multicast

shell 复制代码
root@test-physical:~# tcpdump -i ech0 ether multicast
13.解析数据包
shell 复制代码
root@test-physical:~# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:10:54.514308 IP (tos 0x48, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    172.16.245.1.62592 > 172.16.245.145.22: tcp 0
	0x0000:  000c 294b 8705 0050 56c0 0008 0800 4548  ..)K...PV.....EH
	0x0010:  0034 0000 4000 4006 f7c7 ac10 f501 ac10  .4..@.@.........
	0x0020:  f591 f480 0016 21ab 8aae 8587 68d2 8010  ......!.....h...
	0x0030:  07fe 4049 0000 0101 080a 7a08 f3cc 11c5  ..@I......z.....
	0x0040:  dcdc                                     ..
15:10:54.514643 IP (tos 0x48, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    172.16.245.1.62592 > 172.16.245.145.22: tcp 0
	0x0000:  000c 294b 8705 0050 56c0 0008 0800 4548  ..)K...PV.....EH
	0x0010:  0034 0000 4000 4006 f7c7 ac10 f501 ac10  .4..@.@.........
	0x0020:  f591 f480 0016 21ab 8aae 8587 6ad6 8010  ......!.....j...
	0x0030:  07f7 3e4c 0000 0101 080a 7a08 f3cc 11c5  ..>L......z.....
	0x0040:  dcdc                                     ..
2 packets captured
2 packets received by filter
0 packets dropped by kernel
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展