Tcpdump 抓包分析指令使用方法

简介: tcpdump是一个强大的网络数据包抓包分析工具,用于抓取数据包和分析网络流量。并以可阅读的格式展示,包括源和目标地址、端口、协议类型等信息。

tcpdump介绍

tcpdump是一个强大的网络数据包抓包分析工具,用于抓取数据包和分析网络流量。并以可阅读的格式展示,包括源和目标地址、端口、协议类型等信息。
tcpdump还有很多过滤选项,可以帮助我们筛选有用的信息,精准筛选特定流量,便于网络故障判断、网络性能分析、安全审计等等。

tcpdump支持多种协议和格式,服务器管理员、网络工程师、安全专家都经常会用到这个工具。

tcpdump使用方法

tcpdump是一个跨平台的工具,可以支持Linux、bsd、macos等不同的操作系统,Windows下也可以用windump。今天我们基于Ubuntu进行分享:

tcpdump 安装

TCP dump在大多数Linux系统中都有默认安装,无需额外安装。包括Ubuntu系统。

tcpdump常见报错

Ubuntu执行tcpdump报错

error:tcpdump: socket:address family not supported by protocol

错误通常是因为尝试在不支持的地址族上运行 tcpdump 导致的。在某些情况下,可能是因为使用了不支持的选项或参数。

这个错误可能有几个常见原因:

  1. 不支持的地址族tcpdump 可能无法在指定的网络接口或环境下正常工作。尝试使用 -D 参数列出系统支持的接口,然后确保选择的接口是有效的,并且 tcpdump 支持。

    tcpdump -D
    
  2. 权限问题:在某些系统上,需要特殊的权限(例如 root 权限)才能运行 tcpdump 来捕获网络数据包。

  3. 错误的选项或参数:检查你是否输入了正确的选项和参数,确保它们是 tcpdump 支持的,并且没有拼写错误。

  4. af_packet未加载内核模块:这种情况比较少见,要根据实际环境分析确定。但是如果在Windows WSL子系统中,这个问题会存在。通常模块会自动加载,但如果模块丢失或模块依赖项未知(depmod -a未执行)。

尝试以下操作:

  • 确保以足够的权限(通常是以管理员或 root 身份)运行 tcpdump
  • 使用 -D 参数列出支持的接口,并确认选择的接口有效。
  • 检查命令中的选项和参数,确保没有拼写错误或不支持的设置。
  • 如果是af_packet未加载内核模块导致,可以尝试使用如下方法:
    更新模块依赖项,然后手动加载模块:
depmod -a
modprobe af_packet

执行如果失败,可以通过如下命令查看是否存在:

find /lib/modules -name "af_packet*"

ps:以上方法,我再Windows的wls子系统中执行时失败了的。提示找不到目录。

如果问题仍然存在,可能需要更详细地检查 tcpdump 的用法、支持的选项和系统文档,或者提供更多的上下文信息来帮助进一步解决。寻求tcpdump帮助指令:man tcpdump

tcpdump常用指令用法

tcpdump常用选项和参数

  1. 列出系统接口
    在进行抓包前,我们往往需要指定接口,可以通过sudo tcpdump -D指令来查看当前服务器有哪些接口。

    sudo tcpdump -D
    

    列出当前Ubuntu服务器的所有接口。

    mirror@Ubuntu22:~$ sudo tcpdump -D
    [sudo] password for mirror: 
    1.ens160 [Up, Running, Connected]
    2.ens192 [Up, Running, Connected]
    3.any (Pseudo-device that captures on all interfaces) [Up, Running]
    4.lo [Up, Running, Loopback]
    5.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless]
    6.nflog (Linux netfilter log (NFLOG) interface) [none]
    7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
    8.dbus-system (D-Bus system bus) [none]
    9.dbus-session (D-Bus session bus) [none]
    
  2. 指定接口抓包
    在Ubuntu服务器中找到要进行抓包的接口,采用-i参数指定接口后开始进行抓包

sudo tcpdump -i ens160

从以下输出结果,已经可以正常抓取数据包信息。因为是实际环境的,所以筛检了部分信息。

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
03:42:17.246688 IP 192.168.1.8.42463 > public1.114dns.com.domain: 41988+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:17.246854 IP 192.168.1.8.58001 > public1.114dns.com.domain: 25469+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:17.246905 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [S], seq 3628915760, win 64240, options [mss 1460,sackOK,TS val 380598131 ecr 0,nop,wscale 7,tfo  cookiereq,nop,nop], length 0
03:42:17.288016 IP public1.114dns.com.domain > 192.168.1.8.58686: Flags [S.], seq 1011366664, ack 3628915761, win 64240, options [mss 1460,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,tfo  cookiereq,nop,nop], length 0
03:42:17.288084 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [.], ack 1, win 64240, length 0
03:42:17.288122 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:17.533736 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:17.781715 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:18.273741 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:19.265742 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:21.249711 IP 192.168.1.8.58686 > public1.114dns.com.domain: Flags [P.], seq 1:46, ack 1, win 64240, length 45 17322+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:37.263316 IP 192.168.1.8.33584 > public1.114dns.com.domain: 49580+ PTR? 114.114.114.114.in-addr.arpa. (46)
03:42:37.263436 IP 192.168.1.8.47765 > public1.114dns.com.domain: 39262+ PTR? 111.1.30.172.in-addr.arpa. (43)
03:42:37.263483 IP 192.168.1.8.42463 > public1.114dns.com.domain: 41988+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:37.263498 IP 192.168.1.8.58001 > public1.114dns.com.domain: 25469+ PTR? 69.35.10.10.in-addr.arpa. (43)
03:42:37.263512 IP 192.168.1.8.45521 > public1.114dns.com.domain: 42802+ PTR? 228.1.30.172.in-addr.arpa. (43)
listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes

这句输出的信息表示当前 tcpdump 正在监听名为 ens160 的网络接口,该接口的链路类型为以太网(Ethernet),并设置了捕获的快照长度为 262144 字节。

  1. 取消解析主机名
    抓包通常包含ARPA,反解析数据包中的主机名称,如果要直接看IP,可以在后面跟上-n参数。这样就会以数字的形式显示。
    sudo tcpdump -i ens160 -n
    
mirror@Ubuntu22:~$ sudo tcpdump -i ens160 -n
[sudo] password for mirror: 
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
05:10:15.243705 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 3209440688:3209440928, ack 2284055446, win 501, length 240
05:10:15.287791 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 0, win 513, length 0
05:10:15.318211 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 240:560, ack 1, win 501, length 320
05:10:15.373988 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 240, win 512, length 0
05:10:15.422191 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 560:848, ack 1, win 501, length 288
05:10:15.463074 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 560, win 511, length 0
05:10:15.526180 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 848:1136, ack 1, win 501, length 288
05:10:15.532448 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 848, win 509, length 0
05:10:15.630126 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 1136:1440, ack 1, win 501, length 304
05:10:15.635049 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 1136, win 508, length 0
05:10:15.686352 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 1440, win 507, length 0
05:10:15.733967 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 1440:1840, ack 1, win 501, length 400
05:10:15.792947 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 1840, win 513, length 0
05:10:15.838213 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 1840:2144, ack 1, win 501, length 304
05:10:15.896544 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 2144, win 512, length 0
05:10:15.941949 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 2144:2448, ack 1, win 501, length 304
05:10:15.993089 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 2448, win 510, length 0
05:10:16.046087 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 2448:2752, ack 1, win 501, length 304
05:10:16.110191 IP 10.10.35.69.56256 > 192.168.1.8.22: Flags [.], ack 2752, win 509, length 0
05:10:16.149927 IP 192.168.1.8.22 > 10.10.35.69.56256: Flags [P.], seq 2752:3056, ack 1, win 501, length 304

tcpdump常用过滤器

  1. 过滤指定抓包端口和抓包数量
    抓包过程中,会产生非常多的数据信息,我们还可以通过-c 参数指定抓包的数量。port参数指定抓包的tcp端口。
    sudo tcpdump -i ens160 port 80 -n -c 20
    
mirror@Ubuntu22:~$ sudo tcpdump -i ens160 port 80 -n -c 20
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
05:18:01.319622 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [S], seq 988678533, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
05:18:01.319648 IP 192.168.1.228.80 > 10.10.35.69.58740: Flags [S.], seq 776352123, ack 988678534, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
05:18:01.324080 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [.], ack 1, win 256, length 0
05:18:01.488661 IP 10.10.35.69.58741 > 192.168.1.228.80: Flags [S], seq 2538381446, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
05:18:01.488701 IP 192.168.1.228.80 > 10.10.35.69.58741: Flags [S.], seq 3999755288, ack 2538381447, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
05:18:01.492415 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [P.], seq 1:499, ack 1, win 256, length 498: HTTP: GET /simple/0/ HTTP/1.1
05:18:01.492440 IP 192.168.1.228.80 > 10.10.35.69.58740: Flags [.], ack 499, win 501, length 0
05:18:01.494088 IP 10.10.35.69.58741 > 192.168.1.228.80: Flags [.], ack 1, win 256, length 0
05:18:01.498164 IP 192.168.1.228.80 > 10.10.35.69.58740: Flags [P.], seq 1:650, ack 499, win 501, length 649: HTTP: HTTP/1.1 200 OK
05:18:01.554996 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [.], ack 650, win 254, length 0
05:18:06.504170 IP 192.168.1.228.80 > 10.10.35.69.58740: Flags [F.], seq 650, ack 499, win 501, length 0
05:18:06.508091 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [.], ack 651, win 254, length 0
05:18:14.517204 IP 10.10.35.69.58740 > 192.168.1.228.80: Flags [F.], seq 499, ack 651, win 254, length 0
05:18:14.517229 IP 192.168.1.228.80 > 10.10.35.69.58740: Flags [.], ack 500, win 501, length 0
05:18:14.519102 IP 10.10.35.69.58752 > 192.168.1.228.80: Flags [S], seq 777512590, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
05:18:14.519126 IP 192.168.1.228.80 > 10.10.35.69.58752: Flags [S.], seq 2039516034, ack 777512591, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
05:18:14.540753 IP 10.10.35.69.58752 > 192.168.1.228.80: Flags [.], ack 1, win 256, length 0
05:18:19.362131 IP 10.10.35.69.58741 > 192.168.1.228.80: Flags [P.], seq 1:501, ack 1, win 256, length 500: HTTP: GET /simple/0-0/ HTTP/1.1
05:18:19.362184 IP 192.168.1.228.80 > 10.10.35.69.58741: Flags [.], ack 501, win 501, length 0
05:18:19.605373 IP 192.168.1.228.80 > 10.10.35.69.58741: Flags [P.], seq 1:513, ack 501, win 501, length 512: HTTP: HTTP/1.1 200 OK
20 packets captured
20 packets received by filter
0 packets dropped by kernel
mirror@ Ubuntu22:~$
  1. 过滤指定IP地址的数据包
    在实际抓包过程中,我们常常只是需要抓取指定主机数据包的信息,可以通过host参数来筛选主机。
    sudo tcpdump -i ens160 host 10.10.35.69 -n -c 20
    
    如果要抓取指定的主机的指定端口,则用and 来连接host和port。
sudo tcpdump -i ens160 host 10.10.35.69 and port 80 -n -c 20
  1. 过滤指定网络的数据包
    在实际使用过程中我们可能不只是特定数据,而是一个指定网段。实现指令如下:
sudo tcpdump -i ens160 net 10.10.0.0/16 and port 80 -n -c 20
  1. 过滤指定抓包源地址或者目的地址
    在实际过程中,如果访问量很大,还可以通过指定源IP或者目的IP的方式来筛选抓包数据:
    通过src参数指定源IP地址:
    sudo tcpdump -i ens160 src 10.10.35.69 and port 80 -n -c 20
    
    通过dst参数指定目的IP地址:
sudo tcpdump -i ens160 dst 10.10.35.69 and port 80 -n -c 20

抓包数据保存到文件

如果我们抓包的数量和时间很长,可以通过-w参数将抓包保存下来。方法参考如下:

sudo tcpdump -i ens160 src 10.10.35.69 and port 80 -n -c 20 -w packet.pcap
mirror@Ubuntu22:~$ sudo tcpdump -i ens160 src 10.10.35.69 and port 80 -n -c 20 -w packet.pcap
tcpdump: listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
20 packets captured
274 packets received by filter
0 packets dropped by kernel
mirror@Ubuntu22:~$ ls
bandersnatch  mirrored-files  packet.pcap  route.sh
mirror@Ubuntu22:~$

以上方法可以帮助大家完成基本的抓包技能了。如果还需要更高阶的抓包方法,可以使用man tcpdump寻求帮助。得空我也再写一篇高阶的抓包方法。

推荐阅读

目录
相关文章
|
5月前
|
Linux
linux下用tcpdump抓包
linux下用tcpdump抓包
|
24天前
|
监控 Unix Linux
cpu相关指标(top、uptime、vmstat、mpstat、sar、pidstat、ps、dstat、perf、tcpdump、lscpu)等常见使用方法(二)
cpu相关指标(top、uptime、vmstat、mpstat、sar、pidstat、ps、dstat、perf、tcpdump、lscpu)等常见使用方法
|
3月前
|
机器学习/深度学习 Linux
tcpdump的抓包
tcpdump的抓包
23 0
|
编解码 网络协议 网络架构
计算机网络基础 和 tcp 三次握手四次挥手,tcpdump抓包分析 协议过滤 分析,连接状态,标志位详解
wireshark 软件过滤及转码使用 ,TCP tcpdump 连接状态,标志位详解
239 1
|
网络协议 Linux 容器
Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!
Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!这篇文章我总结得比较详尽,可以当字典查,建议收藏,不过别光顾着收藏,点赞什么的鼓励我一下,这能让我更有动力给大家输出更好的内容。
3326 0
|
网络协议 Linux Windows
使用tcpdump+wireshark抓包分析网络数据包
最近和学弟在调试一个GPRS通信模块,需求是通过GPRS模块通过http协议发送数据到服务器,但是http协议一直失败,服务器返回400,通过查询http状态码得知,http400错误是请求无效,因为GPRS模块没有实现http协议的封装,需要在TCP协议的基础上,手动拼装http格式的报文.
3818 0
|
Shell Android开发 Linux
Android通过tcpdump抓包
1 手机要有root权限 2 下载tcpdump android模拟器上linux里面有的会自带。 3 adb push c:\wherever_you_put\tcpdump /data/local/tcpdump 4 adb shell chmod...
958 0
|
1月前
|
运维 网络协议 安全
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
44 0