0


linux 的抓包操作(tcpdump)

linux 查看网络状况(netstat)

使用 netstat 命令用来打印网络连接状况、系统所开放端口、路由表等信息。最常用的关于netstat 的命令就是:

netstat -lnp //打印当前系统启动哪些端口

以及

netstat -an //打印网络连接状况

如果你所管理的服务器是一台提供 web 服务(80 端口)的服务器,那么你就可以使用 netstat -an |grep 80 开查看当前连接 web 服务的有哪些 IP 了。

抓取操作流程

1.首先确定系统有没有安装 tcpdump 工具,使用命令:

which tcpdump

如果打印出/usr/sbin/tcpdump 说明有安装,如果没有则去安装一个 tcpdump 工具:

sudo apt-get install tcpdump

2.开始抓包,使用 tcpdump -D(如果没有权限加 sudo)命令查看可以抓包的网络接口

3.如上所示,可以看到我的机器中所有可以抓包的网络接口。其中特殊接口 any 可用于抓取所有活动的网络接口的数据包。现在就可以对网络接口进行抓包,例如我们使用 sudo tcpdump -I any 命令对 any 接口进行抓包:

     tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。正如上面示例所示,tcpdump 抓取了超过 9000 个数据包。在这个示例中,由于是通过 ssh 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。-c 选项可以用于限制 tcpdump 抓包的数量:例如:可以使用 sudo tcpdump -I any -c 5 指定抓 5 个包分析

     如上所示,tcpdump 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用 ,比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包(如下所示)时,-c 的作用就十分突出了。 

    在上面示例中,tcpdump 默认是将 IP 地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中,使用 IP 地址和端口号更便于分析问题;用-n 选项显示IP 地址,-nn 选项显示端口号:例如: 

     如上所示,抓取的数据包中显示 IP 地址和端口号。这样还可以阻止 tcpdump 发出 DNS查找,有助于在网络故障排查中减少数据流量。 

数据包解析

    tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP、UDP、ICMP 等等。这里只分析下 TCP 类型的数据报文。更多有 tcpdum 的详细介绍可以参考其帮助手册。tcpdump 抓取的 TCP 报文看起来如下: 

     具体的字段根据不同的报文类型会有不同,但上面这个例子是一般的格式形式。第一个字段 08:41:13.729687 是该数据报文被抓取的**系统本地时间戳**。然后,**IP 是网络层协议类型**,这里是 IPv4,如果是 IPv6 协议,该字段值是 IP6。**192.168.64.28.22 是源 ip 地址和端口号**,紧跟其后的是**目的 ip 地址和其端口号**,这里是 192.168.64.1.41916。 

    在源 IP 和目的 IP 之后,可以看到是 TCP 报文标记段 Flags [P.]。该字段通常取值如下:

     该字段也可以是这些值的组合,例如 [S.] 代表 SYN-ACK 数据包。 

    接下来是该**数据包中数据的序列号**。对于抓取的第一个数据包,该字段值是一个绝对数字,后续包使用相对数值,以便更容易查询跟踪。例如此处 seq 196:568 代表该数据包包含该数据流的第 196 到 568 字节。

    接下来是 ack 值:ack 1。该数据包是数据发送方,ack 值为 1。在数据接收方,该字段代表**数据流上的下一个预期字节数据**,例如,该数据流中下一个数据包的 ack 值应该是 568。接下来字段是**接收窗口大小 **win 309,它**表示接收缓冲区中可用的字节数**,后跟 TCP 选项如 MSS(最大段大小)或者窗口比例值。更详尽的 TCP 协议内容请参考 Transmission Control Protocol (TCP) Parameters (iana.org) 

    最后,length 372 代表**数据包有效载荷字节长度**。这个长度和 seq 序列号中字节数值长度是不一样的。 

数据包过滤

    正如上面所提,tcpdump 可以抓取很多种类型的数据报文,其中很多可能和我们需要查找的问题并没有关系。举个例子,假设你正在定位一个与 web 服务器连接的网络问题,就不必关系 SSH 数据报文,因此在抓包结果中过滤掉 SSH 报文可能更便于你分析问题。tcpdump 有很多参数选项可以设置数据包过滤规则,例如根据源 IP 以及目的 IP 地址,端口号,协议等等规则来过滤数据包。下面就介绍一些最常用的过滤方法。 

**方法一:通过协议 **

  1. 在命令中指定协议便可以按照协议类型来筛选数据包。比方说用如下命令只要抓取 ICMP报文:

  1. 再打开一个终端,去 ping 其他网络地址,例如:

  1. 回到运行 tcpdump 命令的终端中,可以看到它筛选出了 ICMP 报文。这里 tcpdump 并没

有显示有关 opensource.com 的域名解析数据包:

**方法二.通过主机 **

  1. 用 host 参数只抓取和特定主机相关的数据包:

如上所示,只抓取和显示与 54.204.39.132 有关的数据包。

**方法三.通过端口 **

1.tcpdump 可以根据服务类型或者端口号来筛选数据包。例如,抓取和 HTTP 服务(http 服务

器端口号为 80)相关的数据包:

**方法四.ip 地址/主机名 **

1.同样,你也可以根据源 IP 地址或者目的 IP 地址或者主机名来筛选数据包。例如抓取源 IP

地址为 192.168.122.98 的数据包:

    注意此处示例中抓取了来自源 IP 地址 192.168.122.98 的 53 端口以及 80 端口的数据包,它们的应答包没有显示出来因为那些包的源 IP 地址已经变了。相对的,使用 dst 就是按目的 IP/主机名来筛选数据包。 

**方法五.多条件筛选 **

1.当然,可以使用多条件组合来筛选数据包,使用 and 以及 or 逻辑操作符来创建过滤规则。例 如,筛选来自源 IP 地址 192.168.122.98 的 HTTP 数据包:

也可以使用括号来创建更为复杂的过滤规则,但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式:

    上面例子中我们只抓取了来自源 IP 为 192.168.122.98 或者 54.204.39.132 的 HTTP (端号 80)的数据包。使用该方法就很容易抓取到数据流中交互双方的数据包了。 

检查数据包内容

    有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发 送、什么内容需要被接收等。tcpdump 提供了两个选项可以查看数据包内容,-X 以十六进制打印出数据报文内容,-A 打印数据报文的 ASCII 值。 

    例如,HTTP 请求报文内容如下: 

    这对定位一些普通 HTTP 调用 API 接口的问题很有用。当然如果是加密报文,这个输出也就没多大用了。

保存抓取数据

    1.tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以夜里让它在那里抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。 

    使用 -w 选项来保存数据包而不是在屏幕上显示出抓取的数据包:

    该命令将抓取的数据包保存到文件 webserver.pcap。后缀名 pcap 表示文件是抓取的数据包格式。 

    正如示例中所示,保存数据包到文件中时屏幕上就没有任何有关数据报文的输出,其中 - c10 表示抓取到 10 个数据包后就停止抓包。如果想有一些反馈来提示确实抓取到了数据包,可以使用 -v 选项。 

    2.tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r 选项参数来阅读该文件中的报文内容:

标签: linux tcpdump 运维

本文转载自: https://blog.csdn.net/jiu_yue_ya/article/details/130885221
版权归原作者 九月丫 所有, 如有侵权,请联系我们删除。

“linux 的抓包操作(tcpdump)”的评论:

还没有评论