网络协议tcpdump抓包

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议tcpdump抓包相关的知识,希望对你有一定的参考价值。

一、简介

tcpdump根据使用者的定义对网络上的数据包进行截获的包分析工具,用简单的话来定义:

dump the traffic on a network

tcpdump可以将网络中传送的数据包的"头"完全截获下来提供分析
支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句去掉无用的信息

tcpdump基于底层libpcap库开发,运行需要root权限

二、抓包原理

Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权

当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块

三、核心参数图解

网络上的流量、数据包非常多,因此要想抓到所需要的数据包,就需要我们定义一个精准的过滤器,把这些目标数据包,从巨大的数据包网络中抓取出来

所以学习抓包工具,其实就是学习如何定义过滤器的过程

在 tcpdump 的世界里,过滤器的实现,都是通过一个又一个的参数组合起来,一个参数不够精准,那就再加一个,直到能过滤掉无用的数据包,只留下需要的数据包

tcpdump的参数特别多,经常我们对这个命令的众多参数产生疑惑

就比如下面这个命令,我们要通过host参数指定host ip进行过滤

tcpdump host 192.168.10.100

主程序 + 参数名+ 参数值这样的组合是我们正常认知里面命令行该有的样子

但tcpdump却不走寻常路,居然还可以在host前再加一个限定词,来缩小过滤的范围

tcpdump src host 192.168.10.100

从字面上理解很容易,但这不符合编写命令行程序的正常逻辑,导致会有所疑虑:

  1. 除了 src、dst,可还有其它可以用的限定词?
  2. src host 应该如何理解,参数名?

上面加src本身就颠覆了我们的认知,在 src 之前还可以加更多条件,比如 tcp, udp, icmp等,在之前的基础上再过滤一层

tcpdump tcp src host 192.168.10.100

这种参数的不确定性,让我们对 tcpdump的学习始终无法得其精髓

有必要知道tcpdump的参数是如何组成:
在这里插入图片描述

  1. option可选参数
    可选参数解析

  2. proto 类过滤器
    根据协议进行过滤,可识别的关键词有:
    tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet

  3. direction 类过滤器
    根据数据流向进行过滤,可识别的关键字有:src, dst
    同时可以使用逻辑运算符进行组合,比如 src or dst

  4. type 类过滤器
    可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数

proto、type、direction 这三类过滤器内容比较简单,组成不同的常规过滤规则,option可选的参数非常多,有的甚至也不经常用到

四、输出内容

4.1 输出内容结构

tcpdump 输出的内容虽然多,却很规律,接下来看一个tcp包:

16:23:36.916846 IP 172.28.64.155.15605 > 10.180.1.19.80: Flags [P.], seq 172, ack 106048, win 4723, length 48

从上面的输出来看,可以总结出:

  1. 第一列:时分秒毫秒 16:23:36.916846
  2. 第二列:网络协议 IP
  3. 第三列:发送方的ip地址+端口号,其中172.28.64.155是 ip,而15605是端口号
  4. 第四列:箭头 >, 表示数据流向
  5. 第五列:接收方的ip地址+端口号,其中10.180.1.19是 ip,而80是端口号
  6. 第六列:冒号
  7. 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见Flags 标识符

4.2 数据包结构

以下为一个数据包数据结构
在这里插入图片描述

4.3 Flags 标识符

使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:

  • [S] : SYN(开始连接)
  • [P] : PSH(推送数据)
  • [F] : FIN(结束连接)
  • [R] : RST(重置连接)
  • [.] : 没有 Flag(意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)

五、常规过滤规则

5.1 基于IP地址过滤:host

使用 host 就可以指定 host ip 进行过滤

tcpdump host 192.168.10.100

数据包的 ip 可以再细分为源ip和目标ip两种

# 根据源ip进行过滤
tcpdump -i eth2 src 192.168.10.100

# 根据目标ip进行过滤
tcpdump -i eth2 dst 192.168.10.200

5.2 基于网段进行过滤:net

若ip范围是一个网段,可以直接这样指定

tcpdump net 192.168.10.0/24

网段同样可以再细分为源网段和目标网段

# 根据源网段进行过滤
tcpdump src net 192.168

# 根据目标网段进行过滤
tcpdump dst net 192.168

5.3 基于端口进行过滤:port

使用port可以指定特定端口进行过滤

tcpdump port 8088

端口同样可以再细分为源端口,目标端口

# 根据源端口进行过滤
tcpdump src port 8088

# 根据目标端口进行过滤
tcpdump dst port 8088

如果想要同时指定两个端口可以这样写

# 可以多个port判断
tcpdump port 80 or port 8088

# 也可以简写成这样
tcpdump port 80 or 8088

如果想抓取的不再是一两个端口,而是一个范围,此时可以这样指定一个端口段

tcpdump portrange 8000-8080
tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080

对于一些常见协议的默认端口,我们还可以直接使用协议名,而不用具体的端口号
比如http==80https==443

tcpdump tcp port http

5.4 基于协议进行过滤:proto

常见的网络协议有:tcp, udp, icmp, http, ip, ipv6 等

若只想查看 icmp 的包,可以直接这样写

tcpdump icmp

protocol 可选值:
ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui

六、可选参数解析

6.1 设置不解析域名提升速度

  • -n

不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多

  • -nn

不把协议和端口号转化成名字,速度也会快很多。

  • -N

不打印出host的域名部分.
比如如果设置了此选项,tcpdump 将会打印nic而不是nic.ddn.mil

6.2 过滤结果输出到文件

使用 tcpdump 工具抓到包后,往往需要再借助其他的工具进行分析,比如wireshark,而要使用wireshark ,得将 tcpdump抓到的包数据生成到文件中,最后再使用 wireshark打开它即可

使用-w参数后接一个以.pcap后缀命令的文件名,可以将 tcpdump 抓到的数据保存到文件中

tcpdump icmp -w icmp.pcap

6.3 从文件中读取包数据

使用-w是写入数据到文件,而使用-r是从文件中读取数据

读取后,照样可以使用上述的过滤器语法进行过滤分析

tcpdump icmp -r all.pcap

6.4 控制时间的显示

  • -t

在每行的输出中不输出时间

  • -tt

在每行的输出中会输出时间戳

  • -ttt

输出每两行打印的时间间隔(以毫秒为单位)

  • -tttt

在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)

6.5 其他常用的一些参数

  • -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=1048576)

  • -F

使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略

七、过滤规则组合

tcpdump支持的逻辑运算符:

  • and
    所有的条件都需要满足,也可以表示为 &&

  • or
    只要有一个条件满足就可以,也可以表示为 ||

  • not
    取反,也可以使用 !

举个例子,需要抓一个来自172.20.116.22,发往任意主机的3333端口的包

tcpdump src 172.20.116.22 and dst port 3333

八、常用命令

8.1 栗子

1. tcpdump -i any port 80 or port 443 -A -nn

2. tcpdump -i any port 80 and host 192.168.1.1 -w ping.pcapng

3. timeout 600 tcpdump -i any port 80 or port 443 -A -nn

4. tcpdump -c 5 -i any port  80 or port 443 -A -nn
  • tcpdump使用 – 选项类
选项示例说明
-itcpdump -i eth0指定网络接口,默认是eth0,any表示所有接口
-nntcpdump -nn不解析IP地址和端口号的名称
-ctcpdump -c 5限制要抓取的网络包个数
-wtcpdump -w file.pcap保存到文件中,文件名通常以.pcap
  • tcpdump使用 – 过滤表达式类
选项示例说明
host、src host、dst hosttcpdump -nn host 192.168.1.100主机过滤
port、src port、dst porttcpdump -nn port 80端口过滤
ip、ip6、arp、tcp、udp、icmptcpdump -nn tcp协议过滤
and、or、nottcpdump -nn host 192.168.1.100 and prot 80逻辑表达式
tcp[tcoflages]tcpdump -nn “tcp[tcoflages]&tcp-syn!=0”特定状态的TCP包

8.2 详细栗子

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
  1. tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
  2. -i eth1 : 只抓经过接口eth1的包
  3. -t : 不显示时间戳
  4. -s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
  5. -c 100 : 只抓取100个数据包
  6. dst port ! 22 : 不抓取目标端口是22的数据包
  7. src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
  8. -w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

九、实战

抓取一个80端口的数据包,由于该数据包很大,查询含有RST的异常数据包,获取该包的端口并将符合条件的一个完整的TCP包保存

  1. 抓取80端口的数据包
tcpdump -i  any  port 80 -w ceph.pcapng
  1. 查看生成的pcapng文件
ls -alh
  1. 将pcapng转成log格式
tcpdump -r ceph.pcapng  > ceph.tcpdump.log
  1. 查询符合条件的RST包
grep -i flags  ceph.tcpdump.log  | grep "\\[R"
  1. 根据条件获取该数据包的端口并搜索生成新的pcapng文件
tcpdump -r ceph.pcapng  port 33646 -w 33646.pcapng

以上操作可以将保存好的数据包根据条件搜索并生成一个新的数据包

以上是关于网络协议tcpdump抓包的主要内容,如果未能解决你的问题,请参考以下文章

tcpdump抓包工具

关于Tcpdump抓包总结

tcpdump原理及常用命令

网络协议分析仪tcpdump和wireshark使用

tcpdump 抓包

Linux 抓包工具 tcpdump