Linux 中的 Tcpdump 命令

2023-11-18

tcpdump是一个命令行实用程序,可用于捕获和检查进出系统的网络流量。它是网络管理员最常用的工具,用于解决网络问题和安全测试。

尽管它的名字,与tcpdump,您还可以捕获非 TCP 流量,例如 UDP、ARP 或 ICMP。捕获的数据包可以写入文件或标准输出。最强大的功能之一tcpdump命令的特点是它能够使用过滤器并仅捕获您想要分析的数据。

在本文中,我们将介绍如何使用tcpdumpLinux 中的命令。

安装中tcpdump #

tcpdump默认安装在大多数 Linux 发行版和 macOS 上。检查是否tcpdump命令在您的系统类型上可用:

tcpdump --version

输出应如下所示:

tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b  26 Feb 2019

If tcpdump如果您的系统上不存在,则上面的命令将打印“tcpdump:命令未找到”。您可以轻松安装tcpdump使用发行版的包管理器。

安装中tcpdump在 Ubuntu 和 Debian 上#

sudo apt update && sudo apt install tcpdump

安装中tcpdump在 CentOS 和 Fedora 上#

sudo yum install tcpdump

安装中tcpdump在 Arch Linux 上#

sudo pacman -S tcpdump

捕获数据包tcpdump #

的一般语法为tcpdump命令如下:

tcpdump [options] [expression]
  • 命令options允许您控制命令的行为。
  • 过滤器expression定义将捕获哪些数据包。

仅 root 或具有以下权限的用户sudo权限可以运行tcpdump。如果您尝试以非特权用户身份运行该命令,您将收到一条错误消息:“您无权在该设备上进行捕获”。

最简单的用例是调用tcpdump没有任何选项和过滤器:

sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

... Long output suppressed

23116 packets captured
23300 packets received by filter
184 packets dropped by kernel

tcpdump将继续捕获数据包并写入标准输出,直到收到中断信号。使用Ctrl+C组合键发送中断信号并停止命令。

要获得更详细的输出,请传递-v选项,或-vv对于更详细的输出:

sudo tcpdump -vv

您可以使用以下命令指定要捕获的数据包数量-c选项。例如,要仅捕获十个数据包,您可以输入:

sudo tcpdump -c 10

捕获数据包后,tcpdump会停止。

当没有指定接口时,tcpdump使用它找到的第一个接口并转储通过该接口的所有数据包。

Use the -D打印 tcpdump 可以从中收集数据包的所有可用网络接口列表的选项:

sudo tcpdump -D

对于每个接口,该命令打印接口名称、简短描述和关联的索引(编号):

1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

上面的输出表明ens3是找到的第一个接口tcpdump当没有为命令提供接口时使用。第二个界面any是一种特殊设备,可让您捕获所有活动接口。

要指定要捕获流量的接口,请使用以下命令调用命令-i选项后跟接口名称或关联索引。例如,要捕获来自所有接口的所有数据包,您可以指定any界面:

sudo tcpdump -i any

默认情况下,tcpdump对 IP 地址执行反向 DNS 解析并将端口号转换为名称。使用-n禁用翻译的选项:

sudo tcpdump -n

跳过 DNS 查找可避免生成 DNS 流量并使输出更具可读性。建议每次调用时都使用此选项tcpdump.

您可以使用重定向运算符将输出重定向到文件,而不是在屏幕上显示输出> and >>:

sudo tcpdump -n -i any > file.out

您还可以使用以下命令在保存到文件时观看数据tee命令:

sudo tcpdump -n -l | tee file.out

The -l上面命令中的选项告诉tcpdump使输出行缓冲。如果不使用此选项,则生成新行时不会将输出写入屏幕上。

了解tcpdump Output #

tcpdump在新行上输出每个捕获的数据包的信息。每行都包含一个时间戳和有关该数据包的信息,具体取决于协议。

TCP协议行的典型格式如下:

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

让我们逐个字段解释以下行:

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
  • 15:47:24.248737- 捕获数据包的时间戳为本地时间,使用以下格式:hours:minutes:seconds.frac, where frac是自午夜以来的几分之一秒。

  • IP- 数据包协议。在这种情况下,IP 表示互联网协议版本 4 (IPv4)。

  • 192.168.1.185.22- 源IP地址和端口,用点分隔(.).

  • 192.168.1.150.37445- 目标IP地址和端口,用点分隔(.).

  • Flags [P.]- TCP 标志字段。在这个例子中,[P.]意思是Push Acknowledgment packet,用于确认前一个数据包并发送数据。其他典型标志字段值如下:

    • [.] - ACK(确认)
    • [S] - SYN(开始连接)
    • [P] - PSH(推送数据)
    • [F] - FIN(完成连接)
    • [R] - RST(重置连接)
    • [S.] - SYN-ACK(SynAcK 数据包)
  • seq 201747193:201747301- 序列号位于first:last符号。它显示数据包中包含的数据数量。除了数据流中的第一个数据包中这些数字是绝对的之外,所有后续数据包都使用相对字节位置。在这个例子中,数字是201747193:201747301,表示该数据包包含数据流的字节201747193至201747301。使用-S打印绝对序列号的选项。

  • ack 1226568763确认号是该连接另一端期望的下一个数据的序列号。

  • win 402- 窗口号是接收缓冲区中的可用字节数。

  • options [nop,nop,TS val 1051794587 ecr 2679218230]- TCP 选项。nop,或“无操作”是用于使 TCP 标头成为 4 字节倍数的填充。TS val是 TCP 时间戳,并且ecr代表回显回复。参观IANA 文档有关 TCP 选项的更多信息。

  • length 108- 有效负载数据的长度

tcpdump过滤器#

When tcpdump在没有过滤器的情况下调用,它会捕获所有流量并产生大量输出,这使得查找和分析感兴趣的数据包变得非常困难。

过滤器是最强大的功能之一tcpdump命令。因为它们允许您仅捕获那些与表达式匹配的数据包。例如,在排除与 Web 服务器相关的问题时,您可以使用过滤器仅获取 HTTP 流量。

tcpdump使用伯克利数据包过滤器 (BPF)使用各种处理参数(例如协议、源和目标 IP 地址和端口等)过滤捕获的数据包。

在本文中,我们将了解一些最常见的过滤器。有关所有可用过滤器的列表,请检查pcap滤波器联机帮助页。

按协议过滤#

要将捕获限制为特定协议,请将该协议指定为过滤器。例如,要仅捕获 UDP 流量,您可以运行:

sudo tcpdump -n udp

定义协议的另一种方法是使用proto限定符,后跟协议号。以下命令将过滤协议号 17 并产生与上面相同的结果:

sudo tcpdump -n proto 17

有关数字的更多信息,请查看IP协议号 list.

按主机过滤#

要仅捕获与特定主机相关的数据包,请使用host预选赛:

sudo tcpdump -n host 192.168.1.185

主机可以是 IP 地址或名称。

您还可以使用以下命令将输出过滤到给定的 IP 范围net预选赛。例如,仅转储与以下内容相关的数据包:10.10.0.0/16你会使用:

sudo tcpdump -n net 10.10

按端口过滤#

要将捕获限制为仅捕获来自或发送到特定端口的数据包,请使用port预选赛。下面的命令使用此命令捕获与 SSH(端口 22)服务相关的数据包:

sudo tcpdump -n port 23

The portrange限定符允许您捕获一系列端口中的流量:

sudo tcpdump -n portrange 110-150

按来源和目的地过滤#

您还可以使用以下命令根据源或目标端口或主机过滤数据包src, dst, src and dst, and src or dst预选赛。

以下命令捕获来自 IP 192.168.1.185 的主机的传入数据包:

sudo tcpdump -n src host 192.168.1.185

要查找从任何源到端口 80 的流量,您可以使用:

sudo tcpdump -n dst port 80

复杂过滤器#

过滤器可以使用组合and (&&), or (||), and not (!) 运算符。

例如,要捕获来自源 IP 地址 192.168.1.185 的所有 HTTP 流量,您可以使用以下命令:

sudo tcpdump -n src 192.168.1.185 and tcp port 80

您还可以使用括号来分组和创建更复杂的过滤器:

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

为了避免使用特殊字符时出现解析错误,请将过滤器括在单引号内。

下面是另一个示例命令,用于捕获来自源 IP 地址 192.168.1.185 的除 SSH 之外的所有流量:

sudo tcpdump -n src 192.168.1.185 and not dst port 22

数据包检查#

默认情况下tcpdump,仅捕获数据包标头。但是,有时您可能需要检查数据包的内容。

tcpdump允许您以 ASCII 和 HEX 格式打印数据包的内容。

The -A选项告诉tcpdump以 ASCII 格式打印每个数据包并-x in HEX:

sudo tcpdump -n -A

要以十六进制和 ASCII 形式显示数据包的内容,请使用-X option:

sudo tcpdump -n -X

读取捕获并将其写入文件#

另一个有用的功能tcpdump是将数据包写入文件。当您捕获大量数据包或捕获数据包以供以后分析时,这非常方便。

要开始写入文件,请使用-w选项后跟输出捕获文件:

sudo tcpdump -n -w data.pcap

上面的命令会将捕获保存到名为的文件中data.pcap。您可以根据需要命名该文件,但通常的约定是使用.pcap扩展(数据包捕获)。

当。。。的时候-w使用选项时,输出不会显示在屏幕上。tcpdump写入原始数据包并创建无法使用常规文本编辑器读取的二进制文件。

要检查文件的内容,请调用tcpdump-r option:

sudo tcpdump -r data.pcap

如果你想跑步tcpdump in the 背景,添加 & 符号 (&) 在命令末尾。

还可以使用其他数据包分析工具(例如 Wireshark)检查捕获文件。

当长时间抓包时,可以启用文件轮换。tcpdump允许您创建新文件并按指定的时间间隔或固定大小轮换转储文件。以下命令将创建最多 10 个 200MB 的文件,名为file.pcap0, file.pcap1等:在覆盖旧文件之前。

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

一旦生成十个文件,旧文件将被覆盖。

请注意,您应该只运行tcpdump仅在故障排除期间。

如果你想开始tcpdump在特定时间,您可以使用cronjob . tcpdump没有在给定时间后退出的选项。您可以使用timeout命令停止tcpdump一段时间后。例如,要在 5 分钟后退出,您可以使用:

sudo timeout 300 tcpdump -n -w data.pcap

结论#

tcpdump是一个用于分析和排除网络相关问题的命令行工具。

本文向您介绍了以下基础知识tcpdump用法和语法。如需更深入的文档,请访问tcpdump网站。

如果您有任何问题或反馈,请随时发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中的 Tcpdump 命令 的相关文章

随机推荐

  • 检查阿姆斯特朗数的 C 程序

    阿姆斯特朗数是一个 n 位数字 等于其各位数字的 n 次方之和 例如 153 是阿姆斯特朗数 因为它有 3 位 1 3 5 3 3 3 等于 153 在本文中 我们将编写一个 C 程序来检查给定的数字是否是阿姆斯特朗数 我们会将问题分解为可
  • 如何使用 sgdisk 将 GPT 分区表复制到另一个磁盘

    什么是GPT分区 GPT GUID 分区表 是物理硬盘上分区表布局的标准 使用全局唯一标识符 GUID GPT 是 EFI 标准的一部分 定义分区表的布局 GPT 对于在大于 2TB 的磁盘上创建文件系统非常有用 对于较小尺寸的磁盘 通常我
  • 如何在 Windows 10 上安装 Node.js

    Node js 是一个开源的 JavaScript 运行时环境 它允许在 Web 浏览器之外运行 JavaScript 本教程将帮助您在 Windows 系统上安装 Node js 在 Windows 上安装节点 以下是在 Windows
  • 检查阿姆斯特朗数的 Java 程序

    在编程世界中 通常会实现许多不同的任务和算法来测试程序员对某些概念的理解 其中一项任务是检查阿姆斯特朗数字 在我们深入实际的编程部分之前 了解阿姆斯特朗数是什么很重要 什么是阿姆斯特朗数 An 阿姆斯特朗数是一个数字 它等于它自己的数字的总
  • 如何在 Linux 中使用 Chage 命令

    Linux 系统管理员经常需要管理用户帐户及其密码 chage 命令是一个强大的工具 有助于管理 Linux 中的用户密码过期和老化信息 在本文中 我们将指导您在 Linux 中使用 chage 命令 其各种选项以及如何有效使用它们的示例
  • 如何在 CentOS 8 上安装 Roundcube Webmail

    Roundcube 是一种用 PHP 编程语言编写的流行 Webmail 界面 您可以通过 Roundcube Web 界面上的 POP IMAP 访问在 Linux 服务器上创建的邮箱 本教程将帮助您在 CentOS 8 上安装 Roun
  • 如何在 Ubuntu 18.04 Bionic 上重置 Gnome 桌面

    本教程帮助您在 Ubuntu 18 04 LTS Linux 系统上将 Gnome 桌面设置重置为其原始状态 登录到您的 Ubuntu 18 04 Bionic Desktop 系统并按照下面给出的说明进行操作 之后重新启动系统以完成这些步
  • Linux 用户管理:系统管理员的实用方法

    用户管理是 Linux 系统管理的一个重要方面 因为它允许管理员创建 修改和删除用户帐户 管理权限以及控制对系统资源的访问 本文为系统管理员介绍了一种实用的 Linux 用户管理方法 通过了解用户管理的基础知识 您可以确保更安全且组织良好的
  • 了解 Linux 中的僵尸进程

    在操作系统领域 僵尸 一词通常会让人想起不死生物 即被困在生与死之间的生物 令人惊讶的是 Linux 操作系统中也存在类似的现象 僵尸进程潜伏在其中 困扰着系统管理员和开发人员 尽管它们可能并不渴望大脑 但如果不加以控制 这些僵尸进程可能会
  • 如何在 Ubuntu 22.04|20.04|18.04 上安装 Oracle Java 17

    Java 17 是 Java SE 平台的最新长期支持版本 由于这是 LTS 版本 因此将支持到 2024 年 9 月 Java 17 进行了多项改进和错误修复 工作站用户应考虑升级到此版本 此外 生产用户可以在检查所有应用程序兼容性检查后
  • 如何在 Ubuntu 20.04 上使用 PHP-FPM 安装 Apache

    PHP FPM FastCGI 进程管理器 是 PHP FastCGI 的替代实现 它提供了一些附加功能 例如对站点有用的自适应进程生成 本教程将帮助您在 Ubuntu 20 04 系统上使用 PHP FPM FastCGI 安装 Apac
  • phpMyAdmin 的 4 个最佳替代品

    phpMyAdmin is the most popular web interface for managing MySQL databases But there are many other tools available which
  • 如何在 RHEL 和 CentOS Stream 9 上安装 MySQL 8.0

    MySQL 是一种开源关系数据库管理系统 广泛用于存储和组织数据 Red Hat Enterprise Linux RHEL 和 CentOS Stream 是许多开发人员和系统管理员使用的两种流行的 Linux 发行版 在本文中 我们将讨
  • 设置 Git 提交用户名和电子邮件:初学者指南

    Git 是一个强大的分布式版本控制系统 被开发人员广泛用来管理他们的代码 Git 的重要方面之一是配置您的提交用户名和电子邮件 因为它有助于在与其他开发人员协作时建立您的身份 在本文中 我们将介绍设置 Git 提交用户名和电子邮件的不同方法
  • 如何从 Git 存储库中删除最后 5 次提交

    从 Git 存储库中删除最后几次提交是一个相对简单的过程 只需几个简单的命令即可完成 在本指南中 我们将解释如何从 git 存储库中删除最后几次提交 并讨论为什么这可能是必要的 我们还将提供从存储库中删除最后几次提交的分步说明 以及此过程中
  • 使用 Ubuntu 20.04 LTS (Focal Fossa) 进行初始服务器设置

    在本教程中 我们假设您已经全新安装了 Ubuntu Ubuntu 20 04 LTS Focal Fossa 服务器 我们建议您的服务器使用 Ubuntu 的 LTS 版本 例如 Ubuntu 20 04 LTS Focal Fossa 现
  • 如何在 Debian 10 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 允许您安装 更新 配置和删除 npm 包 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 本教程介绍了如何安装Yar
  • 如何在 Debian 10 Linux 上安装 Tomcat 9

    Apache Tomcat 是一个基于 JAVA 的开源应用服务器 它实现了 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术 它是当今世界上使用最广泛的应用程序和 We
  • 如何在 Debian 9 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 运行 Debian 虚拟机时不存在交换分区 因此唯一的选
  • Linux 中的 Tcpdump 命令

    tcpdump是一个命令行实用程序 可用于捕获和检查进出系统的网络流量 它是网络管理员最常用的工具 用于解决网络问题和安全测试 尽管它的名字 与tcpdump 您还可以捕获非 TCP 流量 例如 UDP ARP 或 ICMP 捕获的数据包可