Tcpdump

tcpdump

1
2
# tcpdump 是一个Linux的网络抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 适用于大多数的类Unix系统操作系统,如路由器、debian、centos等均可安装。 
yum install tcpdump

参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-c 指定要抓取的包数量,-c 10将获取10个包。
-i interface:指定tcpdump需要监听的接口。
-n 对地址以数字方式显式,否则显式为主机名。
-nn除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-P:指定要抓取的包是流入还是流出的包。可以给定的值为in、out和inout(默认)
-r 从给定的数据包文件中读取数据。

-a 将网络地址和广播地址转变成名字;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e 在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;
-f 将外部的Internet地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;
-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-c 在收到指定的包的数目后,tcpdump就会停止;
-F 从指定的文件中读取表达式,忽略其它的表达式;
-i 指定监听的网络接口;
-p:将网卡设置为非混杂模式,不能与host或broadcast一起使用
-r 从指定的文件中读取包(这些包一般通过-w选项产生);
-w 直接将包写入文件中,并不分析和打印出来;
-s snaplen snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)
-X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时
是绝对的利器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
控制详细内容的输出
-v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
-vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过)
-vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
控制时间的显示
-t:在每行的输出中不输出时间
-tt:在每行的输出中会输出时间戳
-ttt:输出每两行打印的时间间隔(以毫秒为单位)
-tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
显示数据包的头部
-x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
-xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
-X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
-XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
过滤指定网卡的数据包
-i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any
过滤特定流向的数据包
-Q: 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction]这种写法
其他常用的一些参数
-A:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
-l : 基于行的输出,便于你保存查看,或者交给其它工具分析
-q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短.
-c : 捕获 count 个包 tcpdump 就退出
-s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-S : 使用绝对序列号,而不是相对序列号
-C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录.
新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)
-F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.
对输出内容进行控制的参数
-D : 显示所有可用网络接口的列表
-e : 每行的打印输出中将包括数据包的数据链路层头部信息
-E : 揭秘IPSEC数据
-L :列出指定网络接口所支持的数据链路层的类型后退出
-Z:后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。
-d:打印出易读的包匹配码
-dd:以C语言的形式打印出包匹配码.
-ddd:以十进制数的形式打印出包匹配码

列出可以抓包的网络接口

1
2
3
4
5
6
7
8
[root@VM-2-4-centos ~]# tcpdump -D
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.usbmon1 (USB bus number 1)
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]
[root@VM-2-4-centos ~]#

抓指定网卡的数据包

抓取指定ip的数据包

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@VM-2-4-centos ~]# tcpdump -c 10 net 192.168.2.4
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:19:56.515521 IP 192.168.2.4.ssh > 222.90.149.207.56894: Flags [P.], seq 1005786212:1005786424, ack 3012154067, win 335, length 212
10:19:56.515914 IP 192.168.2.4.51627 > 183.60.83.19.domain: 42146+ PTR? 207.149.90.222.in-addr.arpa. (45)
10:19:56.517223 IP 183.60.83.19.domain > 192.168.2.4.51627: 42146 ServFail 0/0/0 (45)
10:19:56.517276 IP 192.168.2.4.59411 > 183.60.82.98.domain: 42146+ PTR? 207.149.90.222.in-addr.arpa. (45)
10:19:56.518292 IP 183.60.82.98.domain > 192.168.2.4.59411: 42146 ServFail 0/0/0 (45)
10:19:56.518325 IP 192.168.2.4.55971 > 183.60.83.19.domain: 42146+ PTR? 207.149.90.222.in-addr.arpa. (45)
10:19:56.582099 IP 222.90.149.207.56894 > 192.168.2.4.ssh: Flags [.], ack 212, win 1022, length 0
10:19:56.605591 IP 183.60.83.19.domain > 192.168.2.4.55971: 42146 ServFail 0/0/0 (45)
10:19:56.605673 IP 192.168.2.4.54336 > 183.60.82.98.domain: 42146+ PTR? 207.149.90.222.in-addr.arpa. (45)
10:19:56.606699 IP 183.60.82.98.domain > 192.168.2.4.54336: 42146 ServFail 0/0/0 (45)

抓ping包

1
2
3
4
5
6
7
8
[root@VM-2-4-centos ~]# tcpdump -c 5 -nn -i eth0 icmp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:22:10.132459 IP 82.157.235.221 > 192.168.2.4: ICMP echo request, id 2093, seq 4, length 64
10:22:10.132492 IP 192.168.2.4 > 82.157.235.221: ICMP echo reply, id 2093, seq 4, length 64
10:22:10.697060 IP 169.254.128.13 > 192.168.2.4: ICMP echo request, id 19882, seq 28077, length 8
10:22:10.697093 IP 192.168.2.4 > 169.254.128.13: ICMP echo reply, id 19882, seq 28077, length 8
10:22:10.775278 IP 169.254.128.7 > 192.168.2.4: ICMP echo request, id 16572, seq 32653, length 8