命令概要
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。tcpdump是Linux中强大的网络数据采集分析工具之一。
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。
作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。
tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump常用示例
- 查看当前机器有哪些网络接口
[root@devops03 ~]# tcpdump -D
1.eth0
2.docker0
3.nflog (Linux netfilter log (NFLOG) interface)
4.nfqueue (Linux netfilter queue (NFQUEUE) interface)
5.usbmon1 (USB bus number 1)
6.usbmon2 (USB bus number 2)
7.usbmon3 (USB bus number 3)
8.usbmon4 (USB bus number 4)
9.any (Pseudo-device that captures on all interfaces)
10.lo [Loopback]
下面所有测试中都有 -i any的选项,表示抓取所有网络接口上的包,为了让测试方便
- 针对指定主机抓包
[root@devops03 ~]# tcpdump -i any -n -nn host 172.16.108.119 -w ./$(date +%Y%m%d%H%M%S).pcap
# 参数含义解释:
-i any:监听所有网络接口
-n:禁用主机名解析,以IP地址显示
-nn:禁用端口号的服务名称解析,以端口号显示
host 172.16.108.119:只捕获目标主机是172.16.108.119的数据包
-w ./$(date +%Y%m%d%H%M%S).pcap:将捕获的数据包写入以当前日期和时间命名的pcap文件中
# 查看文件内容
[root@devops03 ~]# tcpdump -r 20240514182013.pcap
reading from file 20240514182013.pcap, link-type LINUX_SLL (Linux cooked)
18:20:13.678708 IP harbor.even.com.ssh > 172.16.31.18.54089: Flags [P.], seq 3045468817:3045468993, ack 649850195, win 501, length 176
18:20:13.682001 IP 172.16.31.18.54089 > harbor.even.com.ssh: Flags [.], ack 176, win 512, length 0
18:20:15.296263 ARP, Request who-has harbor.even.com tell 172.16.108.155, length 46
18:20:15.296296 ARP, Reply harbor.even.com is-at 52:54:00:38:e6:42 (oui Unknown), length 28
18:20:15.323797 IP 172.16.108.138.27543 > harbor.even.com.zabbix-agent: Flags [S], seq 2059933354, win 29200, options [mss 1460,sackOK,TS val 571330580 ecr 0,nop,wscale 7], length 0
18:20:15.323846 IP harbor.even.com.zabbix-agent > 172.16.108.138.27543: Flags [S.], seq 2658345987, ack 2059933355, win 65160, options [mss 1460,sackOK,TS val 1037146019 ecr 571330580,nop,wscale 7], length 0
18:20:15.323958 IP 172.16.108.138.27543 > harbor.even.com.zabbix-agent: Flags [.], ack 1, win 229, options [nop,nop,TS val 571330580 ecr 1037146019], length 0
18:20:15.324009 IP 172.16.108.138.27543 > harbor.even.com.zabbix-agent: Flags [P.], seq 1:39, ack 1, win 229, options [nop,nop,TS val 571330580 ecr 1037146019], length 38
18:20:15.324018 IP harbor.even.com.zabbix-agent > 172.16.108.138.27543: Flags [.], ack 39, win 509, options [nop,nop,TS val 1037146019 ecr 571330580], length 0
18:20:15.324257 IP harbor.even.com.zabbix-agent > 172.16.108.138.27543: Flags [P.], seq 1:24, ack 39, win 509, options [nop,nop,TS val 1037146020 ecr 571330580], length 23
18:20:15.324274 IP harbor.even.com.zabbix-agent > 172.16.108.138.27543: Flags [F.], seq 24, ack 39, win 509, options [nop,nop,TS val 1037146020 ecr 571330580], length 0
- 针对指定端口抓包
[root@devops03 ~]# tcpdump -i any -n -nn port 9200 -w ./$(date +%Y%m%d%H%M%S).pcap
- 针对主机和端口抓包,两者关系and
[root@devops03 ~]# tcpdump -i any -n -nn host 172.16.108.119 and port 9200 -w ./$(date +%Y%m%d%H%M%S).pcap
- 针对多个端口抓包
[root@devops03 ~]# tcpdump -i any -n -nn port 80 or port 9200
- 针对多个主机抓包
[root@devops03 ~]# tcpdump -i any -n -nn host www.baidu.com or www.qq.com
其他示例:
- 抓取访问destination 80端口的包
[root@devops03 ~]# tcpdump -i any -n dst port 443 # 然后我们做一个curl https://www.baidu.com的操作
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:55:39.320610 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [S], seq 2771769551, win 64240, options [mss 1460,sackOK,TS val 4169377492 ecr 0,nop,wscale 7], length 0
10:55:39.328377 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [.], ack 3391280475, win 502, length 0
10:55:39.487925 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [P.], seq 0:199, ack 1, win 502, length 199
10:55:39.504044 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [.], ack 5213, win 483, length 0
10:55:39.510749 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [P.], seq 199:325, ack 5213, win 501, length 126
10:55:39.518820 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [.], ack 5264, win 501, length 0
10:55:39.519299 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [P.], seq 325:431, ack 5264, win 501, length 106
10:55:39.528207 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [.], ack 6472, win 501, length 0
10:55:39.528242 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [.], ack 8165, win 491, length 0
10:55:39.528837 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [P.], seq 431:462, ack 8165, win 501, length 31
10:55:39.528908 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [F.], seq 462, ack 8165, win 501, length 0
10:55:39.536886 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [R], seq 2771770014, win 0, length 0
10:55:39.536956 IP 172.16.108.119.50458 > 180.101.50.242.https: Flags [R], seq 2771770015, win 0, length 0
- 抓取源端口是80的包
[root@devops03 ~]# tcpdump -i any -nn src port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:01:16.417072 IP 172.16.108.119.80 > 172.16.108.119.18530: Flags [S.], seq 1499271863, ack 1106867567, win 65483, options [mss 65495,sackOK,TS val 2723400731 ecr 2723400731,nop,wscale 7], length 0
11:01:16.418054 IP 172.16.108.119.80 > 172.16.108.119.18530: Flags [.], ack 79, win 511, options [nop,nop,TS val 2723400732 ecr 2723400732], length 0
11:01:16.484603 IP 172.16.108.119.80 > 172.16.108.119.18530: Flags [P.], seq 1:309, ack 79, win 512, options [nop,nop,TS val 2723400799 ecr 2723400732], length 308: HTTP: HTTP/1.1 500 Internal Server Error
11:01:16.484975 IP 172.16.108.119.80 > 172.16.108.119.18530: Flags [F.], seq 309, ack 80, win 512, options [nop,nop,TS val 2723400799 ecr 2723400799], length 0
- 抓取源端口或目标端口都是80的包
[root@devops03 ~]# tcpdump -i any -n -nn port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:09:33.250146 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [S], seq 282283174, win 65495, options [mss 65495,sackOK,TS val 2723897564 ecr 0,nop,wscale 7], length 0
11:09:33.250196 IP 172.16.108.119.80 > 172.16.108.119.53666: Flags [S.], seq 259255655, ack 282283175, win 65483, options [mss 65495,sackOK,TS val 2723897565 ecr 2723897564,nop,wscale 7], length 0
11:09:33.250218 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [.], ack 1, win 512, options [nop,nop,TS val 2723897565 ecr 2723897565], length 0
11:09:33.251041 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [P.], seq 1:79, ack 1, win 512, options [nop,nop,TS val 2723897565 ecr 2723897565], length 78: HTTP: GET / HTTP/1.1
11:09:33.251053 IP 172.16.108.119.80 > 172.16.108.119.53666: Flags [.], ack 79, win 511, options [nop,nop,TS val 2723897565 ecr 2723897565], length 0
11:09:33.318471 IP 172.16.108.119.80 > 172.16.108.119.53666: Flags [P.], seq 1:309, ack 79, win 512, options [nop,nop,TS val 2723897633 ecr 2723897565], length 308: HTTP: HTTP/1.1 500 Internal Server Error
11:09:33.318482 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [.], ack 309, win 510, options [nop,nop,TS val 2723897633 ecr 2723897633], length 0
11:09:33.319341 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [F.], seq 79, ack 309, win 512, options [nop,nop,TS val 2723897634 ecr 2723897633], length 0
11:09:33.319587 IP 172.16.108.119.80 > 172.16.108.119.53666: Flags [F.], seq 309, ack 80, win 512, options [nop,nop,TS val 2723897634 ecr 2723897634], length 0
11:09:33.319602 IP 172.16.108.119.53666 > 172.16.108.119.80: Flags [.], ack 310, win 512, options [nop,nop,TS val 2723897634 ecr 2723897634], length 0
- 表示抓取destination port在100到455之间端口的数据
[root@devops03 ~]# tcpdump -i any -n -nn dst portrange 80-443 # 做一个curl https://www.baidu.com 以及 telnet www.baidu.com 111的操作
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
14:29:20.502287 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [S], seq 3483059725, win 64240, options [mss 1460,sackOK,TS val 4182198674 ecr 0,nop,wscale 7], length 0
14:29:20.509010 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 1701047965, win 502, length 0
14:29:20.657521 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [P.], seq 0:199, ack 1, win 502, length 199
14:29:20.666019 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 2905, win 497, length 0
14:29:20.666050 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 5213, win 483, length 0
14:29:20.671617 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [P.], seq 199:325, ack 5213, win 501, length 126
14:29:20.678827 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 5264, win 501, length 0
14:29:20.679094 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [P.], seq 325:431, ack 5264, win 501, length 106
14:29:20.686990 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 6472, win 501, length 0
14:29:20.687061 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [.], ack 8165, win 491, length 0
14:29:20.687456 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [P.], seq 431:462, ack 8165, win 501, length 31
14:29:20.687486 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [F.], seq 462, ack 8165, win 501, length 0
14:29:20.694377 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [R], seq 3483060188, win 0, length 0
14:29:20.694444 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [R], seq 3483060189, win 0, length 0
14:29:20.694465 IP 172.16.108.119.8480 > 180.101.50.242.443: Flags [R], seq 3483060189, win 0, length 0
14:29:29.884089 IP 172.16.108.119.61706 > 180.101.50.242.111: Flags [S], seq 2246955670, win 64240, options [mss 1460,sackOK,TS val 4182208055 ecr 0,nop,wscale 7], length 0
14:29:30.904203 IP 172.16.108.119.61706 > 180.101.50.242.111: Flags [S], seq 2246955670, win 64240, options [mss 1460,sackOK,TS val 4182209076 ecr 0,nop,wscale 7], length 0
- 抓取source port是20-80的包
[root@devops03 ~]# tcpdump -i any -n src portrange 20-80
- 抓取端口port是20-80的包,不考虑源或目标
[root@devops03 ~]# tcpdump -i any -n portrange 20-80
- 抓取destination为www.baidu.com的包
[root@devops03 ~]# tcpdump -i any dst www.baidu.com # 执行ping -c 3 www.baidu.com,和curl www.baidu.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
15:34:30.162236 IP harbor.even.com > 180.101.50.242: ICMP echo request, id 31966, seq 1, length 64
15:34:31.164817 IP harbor.even.com > 180.101.50.242: ICMP echo request, id 31966, seq 2, length 64
15:34:32.166182 IP harbor.even.com > 180.101.50.242: ICMP echo request, id 31966, seq 3, length 64
15:34:46.070756 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [S], seq 3704690556, win 64240, options [mss 1460,sackOK,TS val 4186124242 ecr 0,nop,wscale 7], length 0
15:34:46.078031 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [.], ack 3760907311, win 502, length 0
15:34:46.078321 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [P.], seq 0:77, ack 1, win 502, length 77: HTTP: GET / HTTP/1.1
15:34:46.091218 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [.], ack 1453, win 501, length 0
15:34:46.091273 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [.], ack 2782, win 497, length 0
15:34:46.091831 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [F.], seq 77, ack 2782, win 501, length 0
15:34:46.099119 IP harbor.even.com.19566 > 180.101.50.242.http: Flags [.], ack 2783, win 501, length 0
- 抓取destination为172.16.108.[0-255]的包
[root@devops03 ~]# tcpdump -i any -n -nn dst 172.16.108 # 可以指定范围,注意用法,不是一个完整的IP地址
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
15:37:10.052366 IP 172.16.31.18.54089 > 172.16.108.119.22: Flags [.], ack 3051135361, win 509, length 0
15:37:10.097314 IP 172.16.31.18.54089 > 172.16.108.119.22: Flags [.], ack 193, win 508, length 0
15:37:10.143171 IP 172.16.31.18.54089 > 172.16.108.119.22: Flags [.], ack 385, win 507, length 0
15:37:10.187203 IP 172.16.31.18.54089 > 172.16.108.119.22: Flags [.], ack 577, win 512, length 0
15:37:10.200045 IP 172.16.108.155.53019 > 172.16.108.119.9200: Flags [P.], seq 1902206985:1902207610, ack 1391047108, win 1432, options [nop,nop,TS val 1053789167 ecr 3762696261], length 625
15:37:10.203709 IP 172.16.108.119.9200 > 172.16.108.155.53019: Flags [P.], seq 1:248, ack 625, win 501, options [nop,nop,TS val 3762706248 ecr 1053789167], length 247
15:37:10.203857 IP 172.16.108.155.53019 > 172.16.108.119.9200: Flags [.], ack 248, win 1432, options [nop,nop,TS val 1053789171 ecr 3762706248], length 0
15:37:10.204175 IP 172.16.108.155.53019 > 172.16.108.119.9200: Flags [P.], seq 625:1444, ack 248, win 1432, options [nop,nop,TS val 1053789171 ecr 3762706248], length 819
15:37:10.204630 IP 172.16.31.18.54089 > 172.16.108.119.22: Flags [.], ack 1057, win 510, length 0
- 抓取source为172.16..的包
[root@devops03 ~]# tcpdump -i any -n -nn src host 172.16 # 等价于tcpdump -i any -n -nn src 172.16
- 抓取172.16的包(不管是source还是destination)
[root@devops03 ~]# tcpdump -i any -n -nn host 172.16
- 抓取包长度小于800的包
[root@devops03 ~]# tcpdump -i any -n -nn less 800
- 抓取包长度大于800的包
[root@devops03 ~]# tcpdump -i any -n -nn greater 800
- 只抓取tcp包
[root@devops03 ~]# tcpdump -i any -n tcp
- 只抓取udp包
[root@devops03 ~]# tcpdump -i any -n udp
- 只抓取icmp包,internet控制包
[root@devops03 ~]# tcpdump -i any -n icmp
tcpdump命令格式
tcpdump option filter
option举例-n,-i any等
filter是过滤包的条件,举例:tcp,portrange 1-1000,src port 58895,host www.itshouce.com.cn
filter可以进行组合,比如:dst port 3306 and src port 58895,portrange 1-1000 or src port 58895 not dst port 3306
option filter举例:tcpdump -i any -n portrange 1-3306 or portrange 10000-58895
tcpdump常见选项
参见:man tcpdump
-A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages)。
-B buffer_size/--buffer-size=buffer_size
将操作系统捕获缓冲区大小设置为buffer_size,单位为KiB(1024字节)。
-c count
tcpdump将在接受到count个数据包后退出。
-C file-size (nt: 此选项用于配合 -w file 选项使用)
该选项使得tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size。如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录。 新创建的文件名与 -w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加。file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)
# tcpdump -C 1 -w a.cap
-d 以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump停止。(nt | rt: human readable,容易阅读的,通常是指以ascii码来打印一些信息。compiled, 编排过的. packet-matching code, 包匹配码,含义未知, 需补充)
-dd 以C语言的形式打印出包匹配码。
-ddd 以十进制数的形式打印出包匹配码(会在包匹配码之前有一个附加的'count'前缀)。
-D 打印系统中所有tcpdump可以在其上进行抓包的网络接口。每一个接口会打印出数字编号,相应的接口名字,以及可能的一个网络接口描述。其中网络接口名字和数字编号可以用在tcpdump 的-i flag 选项(nt: 把名字或数字代替flag),来指定要在其上抓包的网络接口。
-e 每行的打印输出中将包括数据包的数据链路层头部信息。
-E spi@ipaddr algo:secret,...
可通过spi@ipaddr algo:secret 来解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload,IPsec 封装安全负载, IPsec可理解为, 一整套对ip数据包的加密协议, ESP 为整个IP 数据包或其中上层协议部分被加密后的数据,前者的工作模式称为隧道模式; 后者的工作模式称为传输模式 . 工作原理, 另需补充)。
需要注意的是, 在终端启动tcpdump 时, 可以为IPv4 ESP packets 设置密钥(secret)。
可用于加密的算法包括des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者没有(none).默认的是des-cbc(nt: des, Data Encryption Standard, 数据加密标准, 加密算法未知, 另需补充).secret 为用于ESP 的密钥, 使用ASCII 字符串方式表达. 如果以 0x 开头, 该密钥将以16进制方式读入.
该选项中ESP 的定义遵循RFC2406, 而不是 RFC1827. 并且, 此选项只是用来调试的, 不推荐以真实密钥(secret)来使用该选项, 因为这样不安全: 在命令行中输入的secret 可以被其他人通过ps 等命令查看到。
除了以上的语法格式(nt: 指spi@ipaddr algo:secret), 还可以在后面添加一个语法输入文件名字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,... 中...换成一个语法文件名). 此文件在接受到第一个ESP 包时会打开此文件, 所以最好此时把赋予tcpdump 的一些特权取消(nt: 可理解为, 这样防范之后, 当该文件为恶意编写时,不至于造成过大损害)。
-f 显示外部的IPv4 地址时(nt: foreign IPv4 addresses, 可理解为, 非本机ip地址), 采用数字方式而不是名字。(此选项是用来对付Sun公司的NIS服务器的缺陷(nt: NIS, 网络信息服务, tcpdump 显示外部地址的名字时会用到她提供的名称服务): 此NIS服务器在查询非本地地址名字时,常常会陷入无尽的查询循环)。
由于对外部(foreign)IPv4地址的测试需要用到本地网络接口(nt: tcpdump 抓包时用到的接口)及其IPv4 地址和网络掩码。如果此地址或网络掩码不可用, 或者此接口根本就没有设置相应网络地址和网络掩码(nt: linux 下的 'any' 网络接口就不需要设置地址和掩码, 不过此'any'接口可以收到系统中所有接口的数据包), 该选项不能正常工作。
-F file
使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略。
-i interface
指定tcpdump 需要监听的接口。如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口)。一但找到第一个符合条件的接口, 搜寻马上结束。
在采用2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接口上的数据包(nt: 这会包括目的是该网络接口的, 也包括目的不是该网络接口的)。 需要注意的是如果真实网络接口不能工作在'混杂'模式(promiscuous)下,则无法在'any'这个虚拟的网络接口上抓取其数据包。
如果 -D 标志被指定, tcpdump会打印系统中的接口编号,而该编号就可用于此处的interface 参数。
-l 对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就马上把这行的内容打印出来)。在需要同时观察抓包打印以及保存抓包记录的时候很有用。比如, 可通过以下命令组合来达到此目的:
tcpdump -l | tee dat 或者 tcpdump -l > dat & tail -f dat (nt: 前者使用tee来把tcpdump 的输出同时放到文件dat和标准输出中, 而后者通过重定向操作'>', 把tcpdump的输出放到dat 文件中, 同时通过tail把dat文件中的内容放到标准输出中)
-L 列出指定网络接口所支持的数据链路层的类型后退出。(nt: 指定接口通过-i 来指定)
-m module
通过module 指定的file 装载SMI MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构MIB, Management Information Base, 管理信息库. 可理解为, 这两者用于SNMP(Simple Network Management Protoco)协议数据包的抓取. 具体SNMP 的工作原理未知, 另需补充)。
此选项可多次使用, 从而为tcpdump 装载不同的MIB 模块。
-M secret 如果TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥secret。
-n 不将主机网络地址转换为名称。
-nn 不将协议和端口号等转换成名称。
-N 不打印出host 的域名部分. 比如, 如果设置了此选现, tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'。
-#/--number 在行的开头打印一个数据包序号。
-O 不运行包匹配编码优化器。当怀疑某些bug是由优化代码引起的, 此选项将很有用。
-p 一般情况下, 把网络接口设置为非'混杂'模式. 但必须注意 , 在特殊情况下此网络接口还是会以'混杂'模式来工作; 从而, '-p' 的设与不设, 不能当做以下选现的代名词:'ether host {local-hw-add}' 或 'ether broadcast'(nt: 前者表示只匹配以太网地址为host 的包, 后者表示匹配以太网地址为广播地址的数据包)。
-Q|-P direction/--direction=direction 选择发送/接收方向 direction 应该捕获数据包的方向。可能的值是 in、out和 inout。并非所有平台都可用。
-q 快速(安静?)输出。打印更少的协议信息,因此输出行更短。
-R 设定tcpdump 对 ESP/AH 数据包的解析按照 RFC1825而不是RFC1829(nt: AH, 认证头, ESP, 安全负载封装, 这两者会用在IP包的安全传输机制中)。 如果此选项被设置, tcpdump 将不会打印出‘禁止中继域’(nt: relay prevention field)。另外,由于ESP/AH规范中没有规定ESP/AH数据包必须拥有协议版本号域,所以tcpdump不能从收到的ESP/AH数据包中推导出协议版本号。
-r file
从文件file 中读取包数据. 如果file 字段为 '-' 符号, 则tcpdump 会从标准输入中读取包数据。
# tcpdump -n -r a.cap
-S 打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比如, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和 2。而如果此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号:232324, 232325)。
-s snaplen
设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是262144字节【256 Kb】。需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量,从而会导致数据包的丢失。所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好。将snaplen设置为0将其设置为262144的默认值,以便向后兼容最新版本的tcpdump。
-T type
强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包. 目前已知的type 可取的协议为:
aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)网络中使用),
cnfp (Cisco NetFlow protocol), rpc(Remote Procedure Call), rtp (Real-Time Applications protocol),
rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol),
tftp (Trivial File Transfer Protocol, 碎文件协议), vat (Visual Audio Tool, 可用于在internet 上进行电
视电话会议的应用层协议), 以及wb (distributed White Board, 可用于网络会议的应用层协议)。
-t 在每行输出中不打印时间戳。
-tt 不对每行输出的时间进行格式处理(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成1261798315)。
-ttt tcpdump 输出时, 每两行打印之间会延迟一个段时间(以毫秒为单位)。
-tttt 在每行打印的时间戳之前添加日期的打印。
-u 打印出未加密的NFS 句柄(nt: handle可理解为NFS 中使用的文件句柄, 这将包括文件夹和文件夹中的文件)。
-U 使得当tcpdump在使用-w 选项时, 其文件写入与包的保存同步.(nt: 即, 当每个数据包被保存时, 它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)
-U 标志在老版本的libcap库(nt: tcpdump 所依赖的报文捕获库)上不起作用, 因为其中缺乏pcap_cump_flush()函数。
-v 当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和。
-vv 产生比-v更详细的输出. 比如, NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。
-vvv 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,
其相应的图形选项将会以16进制的方式打印出来(nt: telnet 的SB,SE选项含义未知, 另需补充)。
-w file 把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印。
file 为 - 时,表示标准输出 也就是输出到标准输出中。
# tcpdump -w - |strings 这是一个超级有用的命令,把包的数据,用字符展示出来。
-W
此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序。
-x 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必须要注意的是, 如果高层协议数据没有snaplen 这么长,并且数据链路层(比如, Ethernet层)有填充数据, 则这些填充数据也会被打印.(nt: so for link layers that pad, 未能衔接理解和翻译, 需补充)
-xx tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部。
-X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便。
-XX 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便。
-y datalinktype
设置tcpdump 只捕获数据链路层协议类型是datalinktype的数据包。
-Z user
使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID(nt: tcpdump 此处可理解为tcpdump 运行之后对应的进程)。
此选项也可在编译的时候被设置为默认打开。(nt: 此时user 的取值未知, 需补充)
tcpdump条件表达式
该表达式用于决定哪些数据包将被打印。如果不给定条件表达式,网络上所有被捕获的包都会被打印。否则,只有满足条件表达式的数据包被打印.(nt: all packets, 可理解为,所有被指定接口捕获的数据包)。
表达式由一个或多个表达元组成(nt:primitive,表达元,可理解为组成表达式的基本元素)。一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的id组成(nt:即 qualifiers id )。有三种不同类型的修饰符:type、dir以及 proto。
参见:man pcap-filter
type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字.
可选的对象类型有: host, net, port 以及portrange(nt: host 表明id是主机, net 表明id是网络, port 表明id是端口,而portrange 表明id 是一个端口范围).
如, 'host foo', 'net 128.3', 'port 20', 'portrange 6000-6008'(nt: 分别表示主机 foo,网络 128.3, 端口 20, 端口范围 6000-6008).
如果不指定type 修饰符, id默认的修饰符为host。
dir 修饰符描述id 所对应的传输方向, 即发往id 还是从id 接收(nt: 而id 到底指什么需要看其前面的type 修饰符)。
可取的方向为: src, dst, src or dst, src and dst.(nt:分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源并且是传输目的).
例如, 'src foo','dst net 128.3', 'src or dst port ftp-data'.(nt: 分别表示符合条件的数据包中, 源主机是foo, 目的网络是128.3, 源或目的端口为 ftp-data).
如果不指定dir修饰符, id 默认的修饰符为src or dst。
proto 修饰符描述id 所属的协议. 可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及 upd.
(nt | rt: ether, fddi, tr, 具体含义未知, 需补充. 可理解为物理以太网传输协议, 光纤分布数据网传输协议,以及用于路由跟踪的协议.
wlan, 无线局域网协议; ip,ip6 即通常的TCP/IP协议栈中所使用的ipv4以及ipv6网络层协议;
arp, rarp 即地址解析协议,反向地址解析协议;
decnet, Digital Equipment Corporation开发的, 最早用于PDP-11 机器互联的网络协议;
tcp and udp, 即通常TCP/IP协议栈中的两个传输层协议)。
表达式顺序:proto dir type
对于修饰符后跟id 的格式,可理解为 type id 是对包最基本的过滤条件:即对包相关的主机,网络,端口的限制;dir 表示对包的传送方向的限制;proto表示对包相关的协议限制。
表达元之间还可以通过关键字and,or 以及 not 进行连接,从而可组成比较复杂的条件表达式。比如,host foo and not port ftp and not port ftp-data (nt:其过滤条件可理解为,数据包的主机为foo,并且端口不是ftp(端口21) 和ftp-data(端口20,常用端口和名字的对应可在linux 系统中的/etc/service 文件中找到))。
为了表示方便,同样的修饰符可以被省略,如 tcp dst port ftp or ftp-data or domain 与以下的表达式含义相同 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain。(nt:其过滤条件可理解为:包的协议为tcp,目的端口为ftp 或 ftp-data 或 domain(端口53) )。
标签:示例,IP,Linux,108.119,length,172.16,win,tcpdump From: https://www.cnblogs.com/even160941/p/18193381