tcpdump抓包(linux)和丢包分析

1、下载安装

官网:https://www.tcpdump.org/index.html#latest-releases
编译和安装

[root@mysql01 ~]# tar -zxvf tcpdump-4.99.4.tar.gz
[root@mysql01 ~]# tar -zxvf libpcap-1.10.4.tar.gz 
[root@mysql01 ~]# cd libpcap-1.10.4/
[root@mysql01 ~/libpcap-1.10.4]# ./configure 
[root@mysql01 ~/libpcap-1.10.4]# make && make install
[root@mysql01 ~/libpcap-1.10.4]# cd ../tcpdump-4.99.4/
[root@mysql01 ~/tcpdump-4.99.4]# ./configure 
[root@mysql01 ~/tcpdump-4.99.4]# make && make install

2、常用命令

tcpdump命令的一些参数说明

tcpdump -D        #列出可用于tcpdump抓取数据包的网卡列表

image

  • ens33     //表示该服务器的第一块网卡,一般我们tcpdump抓包都使用这块网卡来抓取。可能有eth1,eth2等等
  • lo    //指的是该主机的回环地址(127.0.0.1),一般用来测试网络专用,一般的数据都不通过这块网卡,所以我们用tcpdump抓包的时候也不使用这块网卡。
  • any   //任何网卡接口
  • nflog    //Linux下的网络过滤网卡,一般我们不使用它
  • nfqueue   //Linux网络过滤队列接口,一般不使用它
  • bluetooth-monitor、bluetooth //蓝牙相关数据回环

参数说明

 tcpdump -i eth0 -nn -s0 -v port 80

-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。
-nn : 单个 n 表示不解析域名,直接显示 IP;两个 n 表示不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-v : 使用 -v,-vv 和 -vvv 来显示更多的详细信息,通常会显示更多与特定协议相关的信息。
port 80 : 这是一个常见的端口过滤器,表示仅抓取 80 端口上的流量,通常是 HTTP。
额外再介绍几个常用参数:

-p : 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。
-e : 显示数据链路层信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址

抓取http GET/POST requests

(1)抓取HTTP GET 请求

tcpdump -i enp0s8 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

解释:

tcp[((tcp[12:1] & 0xf0) >> 2):4]定义了我们所要截取的字符串的位置(http header的后面)的4 bytes。

0x47455420是G E T的ASCII码。

Character ASCII Value
G 47
E 45
T 54
Space 20
(2)抓取POST请求

tcpdump -i enp0s8 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354

(3)捕捉指定端口接收到的指定来源的http get/post 请求 重要

# 在服务器上监听18080接口,抓取114.249.234.39的getPost请求和返回
tcpdump -i eth0 -s 0 -A 'tcp dst port 18080 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F and host 114.249.234.39'

image

参考:
https://blog.csdn.net/weixin_42866036/article/details/128004750

丢包分析

参考https://www.cnblogs.com/liulianzhen99/articles/17894825.html
cpdump检查丢包环节在哪里

服务端执行tcpdump 命令,抓取 80 端口的包
image

客户端执行curl命令
image

查看 tcpdump 的输出
image

前三个包是正常的 TCP 三次握手,没问题。(SYN,SYN ACK,ACK)

四个包却是在 3 秒才收到,并且还是客户端发送过来的 FIN 包。

也就说明,客户端的连接关闭了。

posted @ 2024-01-18 15:33  spiderMan1-1  阅读(761)  评论(0编辑  收藏  举报