Tcpdump是Linux系统中命令行的抓包工具,也称为网络数据采集分析工具。它可以打印出所有经过网络接口的数据包的头信息。tcpdump命令工作时先最好把网卡的工作模式切换到混杂模式,所以tcpdump命令最好以root身份运行,这样可以分析网络中所有发给本机的报文了。使用tcpdump命令时,必须熟悉TCP/IP协议工作原理。
注:网口的混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC地址。普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。查看网口是否开启了混杂模式:
开启混杂模式:
[root@shijie Desktop]# ifconfig eno16777736 promisc # eno16777736是本机的网卡名称
[root@shijie Desktop]# ifconfig eno16777736 -promisc # 关闭混杂模式
参数 作用
-i<网络界面> 指定抓取的网口
-n 不看域名信息,只看转换后的IP
-s<数据包大小> 设置每个数据包的大小,0表示整个数据包
-a 尝试将网络和广播地址转换成名称
-v 详细显示指令执行过程
-vv 更详细显示指令执行过程
-x 输出包的头部数据,会以16进制和ASCII两种方式同时输出,-xx更详细
port 指定抓取的端口
icmp 只抓ping包
host 指定抓取的主机名或IP
net 指定抓取的网段,需要加/掩码
src 指定抓取的源IP地址
dst 指定抓取的目的IP地址
and 逻辑与,报文必须满足所有条件才被抓取
or 逻辑或,报文只要满足任何一个条件都被抓取
not 逻辑非,符合条件的报文不抓取
-w<数据包文件> 把数据包数据写入指定的文件
-r<数据包文件> 从指定的文件读取数据包数据
-c<数目> 收到指定的数据包数目后,就停止进行倾倒操作
-d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出
-D 显示可以抓包的接口
-e 在每列倾倒资料上显示连接层级的文件头
-f 用数字显示网际网络地址
-F<表达文件> 指定内含表达方式的文件
-l 使用标准输出列的缓冲区
-p 不让网络界面进入混杂模式
-S 用绝对而非相对数值列出TCP关联数
-t 在每列倾倒资料上不显示时间戳记
-T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型
如果tcpdump抓出的包显示过多影响分析,可以根据情况使用参数只抓出自己需要的报文。以下举一个常用参数的例子,实际情况可举一反三。
[root@shijie Desktop]# tcpdump -i eno16777736 -c 5 port 22 and src 192.168.10.10 and dst net 192.168.10.0/24 -w ./1.cap
(1)-i eno16777736:只抓网口eno16777736上的包
(2)-c 5:抓5个包后停止
(3)port 22:指定端口为22
(4)src 192.168.10.10:指定源地址
(5)dst net 192.168.10.0/24:指定目标网段
(6)-w ./1.cap:生成的文件1.cap放到当前目录下,使用Wireshark分析,也可以使用tcpdump -r来读取该文件,使用-w参数后报文不会显示到窗口上
(7)抓取条件和条件之间要使用逻辑and或or
如果你对网络协议非常了解,那么就不需要借助Wireshark分析了。重点开始了,我们分析tcpdump抓出的内容。
加上-e参数,显示数据链路层头部信息。因为我使用的是虚拟机所以会有(oui Unknown),上一篇讲过oui是IEEE分配给网卡制造商的部分。ethertype IPv4 (0x0800)表示帧的载荷类型是IP,详细分析可以看上一章以太网基础。
[root@shijie Desktop]# tcpdump -ei eno16777736
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes
22:55:18.050521 00:0c:29:cb:a6:09 (oui Unknown) > 00:0c:29:aa:87:a8 (oui Unknown), ethertype IPv4 (0x0800), length 74: 192.168.10.30 > 192.168.10.10: ICMP echo request, id 512, seq 56092, length 40
22:55:18.050571 00:0c:29:aa:87:a8 (oui Unknown) > 00:0c:29:cb:a6:09 (oui Unknown), ethertype IPv4 (0x0800), length 74: 192.168.10.10 > 192.168.10.30: ICMP echo reply, id 512, seq 56092, length 40
抓5个包存放到3.cap的文件中,使用-r参数读取。先看前两个包
[root@shijie Desktop]# tcpdump -i eno16777736 -w 3.cap -c 5 -s0
tcpdump: listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes
5 packets captured
22 packets received by filter
0 packets dropped by kernel
[root@shijie Desktop]# tcpdump -r 3.cap -xxvv
reading from file 3.cap, link-type EN10MB (Ethernet)
表示该包读取自3.cap的文件,链路类型是以太网。若直接抓取的网口会显示tcpdump: listening on eno16777736
第二段
10:46:53.728042 IP (tos 0x0, ttl 128, id 156, offset 0, flags [DF], proto TCP (6), length 48)
(1)10:46:53.728042表示时间
(2)IP表示载荷的协议是IP,括号中的参数是IP头部的参数,详情可参考网络学习第一节
(3)tos(Type ofService)服务类型0x0表示普通;
(4)ttl表示存活位数,每经过一次三层转发就会减1,ttl为0时设备将直接丢弃;
(5)id即Identification,标识符。
(6)offset 0,分段偏移为0,表示前面没有分片的包
(7)flags [DF],标志置DF位,表示不能分片
(8)proto TCP (6)传输层的协议类型TCP,6表示传输层是TCP协议。
(9)length 48数据包总长度48字节
第三段
192.168.10.30.dcutility > 192.168.10.10.ssh: Flags [S], cksum 0xf0d7 (correct), seq 3431018802, win 64240, options [mss 1460,nop,nop,sackOK], length 0
(1)192.168.10.30.dcutility > 192.168.10.10.ssh表示源地址、源端口、目标地址和目标端口,其中源端口为随机端口。后面是TCP头部参数,需要对TCP头部有一定了解
(2)Flags [S]标志位为SYN,即客户端向服务器请求同步,TCP三次握手第一个包
(3)cksum 0xf0d7 (correct)校验和
(4)seq 3431018802序号
(5)win 64240窗口大小
(6)options [mss 1460,nop,nop,sackOK]描述了TCP的一些选项,最长可达40字节。
(7)mss 1460最大报文段长度(Max Segment Size)1460,是MTU1500减去20字节IP头部和20字节TCP头部。
(8)nop空选项,无操作
(9)sackOK选择性确认(Selective Acknowledgment),支持SACK技术
(10)length 0后续数据部分长度,因为是TCP握手没有数据
第四段
0x0000: 000c 29aa 87a8 000c 29cb a609 0800 4500
0x0010: 0030 009c 4000 8006 64b3 c0a8 0a1e c0a8
0x0020: 0a0a 0414 0016 cc81 3132 0000 0000 7002
0x0030: faf0 f0d7 0000 0204 05b4 0101 0402
这一段用16进制表示了以太网帧、IP头部和TCP头部所有信息内容。
(1)开头是以太网帧参数,000c 29aa 87a8:目标MAC,000c 29cb a609:源MAC,0800:协议是IP;后面是IP头部参数,4:版本号;5:包头长度,以4bit为单位4X5=20字节;00表示服务类型。
(2)0030:报文总长度48,009c:标识符156,40:标志,00:分段偏移,80:TTL,06:传输层协议6是TCP,64b3:IP头部校验和,c0a8 0a1e:源IP。
(3)c0a8 0a0a:目标IP(接上面一行后两个字节),0414:源端口,0016:目标端口,cc81 3132:seq序号,0000 0000:ASK序号,7002:标志
(4)faf0:窗口大小,f0d7:TCP头部校验和,0000:无意义,0204 05b4 0101 0402:TCP选项。
相比第一个报文,第二个标志为Flags [S.],表示服务器回复客户端SYN,并且应答ASK=seq+1,seq的值会重置随机数seq2。
第三个报文标志为Flags [.],表示客户端再次向服务器发送ASK确认,至此TCP三次握手完成可以传输数据了。ASK=seq2+1。注意第三个报文seq=1,ask=1是tcpdump显示的相对值,真实值是第四部分第三行1bf7 0f60。