百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Linux tcpdump抓包命令详解(含安装教程)

bigegpt 2024-08-05 11:47 2 浏览

请关注本头条号,每天坚持更新原创干货技术文章。

如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

1. 前言

对网络工程师和系统工程师而言,如何使用tcpdump命令分析网络流量是一个必须熟悉掌握的任务。tcpdump 是一个运行在命令行下的强大嗅探工具,我们一般俗称抓包工具或者软件。如果你对Windows上的wireshark软件熟悉,那么你可以很快对tcpdump上手,区别在于Windows wireshark使用的是图形界面,而tcpdump是命令行界面。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。

tcpdump 是一个在BSD许可证下发布的自由软件。tcpdump 适用于大多数的类Unix系统 操作系统:包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在这些系统中,tcpdump 需要使用libpcap这个捕捉数据的库。其在Windows下的版本称为WinDump;它需要WinPcap驱动,相当于在Linux平台下的libpcap.

2. Linux安装tcpdump

Ubuntu 安装tcpdump

oucanrong@zcwyou:~$ sudo apt install -y tcpdump

CentOS安装tcpdump

[root@centos7 ~]# yum -y install tcpdump

Running transaction

正在安装 : 14:libpcap-1.5.3-11.el7.x86_64 1/2

正在安装 : 14:tcpdump-4.9.2-3.el7.x86_64 2/2

验证中 : 14:tcpdump-4.9.2-3.el7.x86_64 1/2

验证中 : 14:libpcap-1.5.3-11.el7.x86_64 2/2

已安装:

tcpdump.x86_64 14:4.9.2-3.el7

作为依赖被安装:

libpcap.x86_64 14:1.5.3-11.el7

完毕!

CentOS安装tcpdump

tcpdump 依赖于 libpcap,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。

检查tcpdump运行的位置

[root@centos7 ~]# which tcpdump

/usr/sbin/tcpdump

现在已经可以正常使用tcpdump了。

3. 试试使用tcpdump抓包

如果你没有使用root身份登录系统,请使用sudo获取root权限。

比如Ubuntu系统,一般使用普通账号登录,需要加sudo

查看可以被tcpdump使用的网络接口:

oucanrong@zcwyou:~$ sudo tcpdump -D

[sudo] oucanrong 的密码:

1.vmnet1 [Up, Running]

2.vmnet8 [Up, Running]

3.enp0s25 [Up, Running]

4.any (Pseudo-device that captures on all interfaces) [Up, Running]

5.lo [Up, Running, Loopback]

6.wlp3s0 [Up]

7.bluetooth0 (Bluetooth adapter number 0)

8.nflog (Linux netfilter log (NFLOG) interface)

9.nfqueue (Linux netfilter queue (NFQUEUE) interface)

10.usbmon1 (USB bus number 1)

11.usbmon2 (USB bus number 2)

12.usbmon3 (USB bus number 3)

13.usbmon4 (USB bus number 4)

如果使用root身份登录,不需要加sudo

[root@centos7 ~]# tcpdump -D

1.bluetooth0 (Bluetooth adapter number 0)

2.nflog (Linux netfilter log (NFLOG) interface)

3.nfqueue (Linux netfilter queue (NFQUEUE) interface)

4.usbmon1 (USB bus number 1)

5.ens33

6.any (Pseudo-device that captures on all interfaces)

7.lo [Loopback]

查看可以被tcpdump使用的网络接口

tcpdump对任意接口进行抓包:

[root@centos7 ~]# tcpdump -i any

tcpdump对任意接口进行抓包

tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。

在上面的示例中,由于我是通过 ssh 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。

4. 使用-c选项限制 tcpdump 抓包的数量

抓取5个包后自动停止

[root@centos7 ~]# tcpdump -i any -c 5

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

18:07:53.506327 IP centos7.ssh > zcwyou.59564: Flags [P.], seq 2122710787:2122710983, ack 2546646634, win 314, options [nop,nop,TS val 990878 ecr 4069694757], length 196

18:07:53.506506 IP zcwyou.59564 > centos7.ssh: Flags [.], ack 196, win 1444, options [nop,nop,TS val 4069694779 ecr 990878], length 0

18:07:53.506974 ARP, Request who-has gateway tell centos7, length 28

18:07:53.507127 ARP, Reply gateway is-at 00:50:56:ed:46:5b (oui Unknown), length 46

18:07:53.507134 IP centos7.49437 > gateway.domain: 24983+ PTR? 1.87.16.172.in-addr.arpa. (42)

5 packets captured

12 packets received by filter

0 packets dropped by kernel

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

5. 指定抓取特定IP和特定端口

只抓取端口为22的流量,抓取5个后停止

[root@centos7 ~]# tcpdump -i any -c5 port 22

抓取网络接口ens33,IP地址为172.16.87.137,端口22的流量。

[root@centos7 ~]# tcpdump -i ens33 host 172.16.87.137 and port 22

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

值 标志类型 描述

S SYN Connection Start

F FIN Connection Finish

P PUSH Data push

R RST Connection reset

. ACK Acknowledgment

使用!符号排除特定条件,

比如:不抓取目标端口是22的数据包

dst port ! 22

比如:不抓取目标端口是80的数据包

src port ! 80

6. 根据协议过滤

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

[root@centos7 ~]# tcpdump -i any -c5 icmp

在某台电脑上ping这台Linux服务器

oucanrong@zcwyou:~$ ping centos7

使用TCPdump抓取 ICMP 报文

抓取任意接口,IP地址为172.16.87.137,抓取5个包后自动停止。

-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn host 172.16.87.137

使用TCPdump抓取特定IP流量

抓取特定端口的流量:

[root@centos7 ~]# tcpdump -i any -c5 -nn port 80

使用src选项指定源IP地址192.168.77.98:

-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.77.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

使用dst选项指定目标IP地址192.168.88.88:

[root@centos7 ~]# tcpdump -i any -c5 -nn dst 192.168.88.88

7. 根据多条件抓取待定数据包

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

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

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

抓取端口为源IP为192.168.188.8或者123.123.123.123,抓取5个包后停止,

[root@centos7 ~]# tcpdump -i any -c5 -nn "port 80 and (src 192.168.188.8 or src 123.123.123.123)"

8. 显示数据包的详细信息

在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。tcpdump 提供了两个选项可以查看数据包内容,-X 以十六进制打印出数据报文内容,-A 打印数据报文的 ASCII 值。

[root@centos7 ~]# tcpdump -i any -c10 -nn -A port 80

9. 保存抓包内容

tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以结合Linux计划任务在指定时间抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。

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

抓取任意接口的流量,端口为80,抓取10个包后自动停止,保存文件为sample.pcap。

[root@centos7 ~]# tcpdump -i any -c10 -nn -w sample.pcap port 80

为什么要保存后缀名为.pcap,是因为它于wireshark兼容,也就是说,你可以使用wireshark图形界面版的软件打开它。

10. 查看抓包文件的内容

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

查看sample.pcap

[root@centos7 ~]# tcpdump -nn -r sample.pcap

这里不需要管理员权限 sudo 了,因为此刻并不是在网络接口处抓包。

根据特定条件查看抓包内容,比如只查看源IP为1.2.3.4的流量

[root@centos7 ~]# tcpdump -nn -r webserver.pcap src 1.2.3.4

当然,你可以在Windows上使用wireshark打开.pcap文件,也可以在Linux图形化界面上安装GUI版的wireshark

CentOS Gnome环境安装图形化的wireshark

[root@centos7 ~]# yum -y install wireshark-gnome

Ubuntu安装图形化的wireshark

oucanrong@zcwyou:~$ sudo apt install wireshark-gtk -y

11. 总结

相信以上教程已经可以帮助你使用强大的 tcpdump 抓包工具了。更多的内容请参考 tcpdump 网站以及它的帮助文件。

tcpdump 官网:

http://www.tcpdump.org/

tcpdump 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 Wireshark。

Wireshark官网地址:

https://www.wireshark.org/

你可以使用 tcpdump命令行在没有 GUI 界面的远程机器上抓包,然后下载到其他机器上使用 Wireshark 中分析数据包。

本文已同步至博客站:

https://www.linuxrumen.com/cyml/742.html

点击了解更多,快速查看更多的技术文章列表。

相关推荐

程序员请收好:10个非常有用的 Visual Studio Code 插件

一个插件列表,可以让你的程序员生活变得轻松许多。作者|Daan译者|Elle出品|CSDN(ID:CSDNnews)以下为译文:无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人...

PADS在WIN10系统中菜单显示不全的解决方法

决定由AD转PADS,打开发现菜单显示不正常,如下图所示:这个是由于系统的默认字体不合适导致,修改一下系统默认字体即可,修改方法如下:打开开始菜单-->所有程序-->Windows系统--...

一文讲解Web前端开发基础环境配置

先从基本的HTML语言开始学习。一个网页的所有内容都是基于HTML,为了学好HTML,不使用任何集成工具,而用一个文本编辑器,直接从最简单的HTML开始编写HTML。先在网上下载notepad++文...

TCP/IP协议栈在Linux内核中的运行时序分析

本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。1Linux概述  1.1Linux操作系统架构简介Linux操作系统总体上由Linux...

从 Angular Route 中提前获取数据

#头条创作挑战赛#介绍提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用resolver,在AngularApp中应用re...

边做游戏边划水: 基于浅水方程的水面交互、河道交互模拟方法

以下文章来源于腾讯游戏学堂,作者Byreave篇一:基于浅水方程的水面交互本文主要介绍一种基于浅水方程的水体交互算法,在基本保持水体交互效果的前提下,实现了一种极简的水面模拟和物体交互方法。真实感的...

Nacos介绍及使用

一、Nacos介绍Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS...

Spring 中@Autowired,@Resource,@Inject 注解实现原理

使用案例前置条件:现在有一个Vehicle接口,它有两个实现类Bus和Car,现在还有一个类VehicleService需要注入一个Vehicle类型的Bean:publicinte...

一文带你搞懂Vue3 底层源码

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

一线开发大牛带你深度解析探讨模板解释器,解释器的生成

解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...

Nacos源码—9.Nacos升级gRPC分析五

大纲10.gRPC客户端初始化分析11.gRPC客户端的心跳机制(健康检查)12.gRPC服务端如何处理客户端的建立连接请求13.gRPC服务端如何映射各种请求与对应的Handler处理类14.gRP...

聊聊Spring AI的Tool Calling

序本文主要研究一下SpringAI的ToolCallingToolCallbackorg/springframework/ai/tool/ToolCallback.javapublicinter...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

在MySQL登录时出现Access denied for user ~~ (using password: YES)

Windows~~~在MySQL登录时出现Accessdeniedforuser‘root‘@‘localhost‘(usingpassword:YES),并修改MySQL密码目录适用...

mysql 8.0多实例批量部署script

背景最近一个项目上,客户需要把阿里云的rdsformysql数据库同步至线下,用作数据的灾备,需要在线下的服务器上部署mysql8.0多实例,为了加快部署的速度,写了一个脚本。解决方案#!/bi...