Linux中的Tcpdump命令

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

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

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

正在安装 tcpdump

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

tcpdump --version

输出应如下所示:

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

如果 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 使用第一个接口,它找到并转储通过该接口的所有数据包。

使用 -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

您可以使用重定向操作符将其重定向到文件中,而不是在屏幕上显示输出。 >>>

sudo tcpdump -n -i any > file.out

您还可以观看数据,同时使用 tee 命令:

sudo tcpdump -n -l | tee file.out

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

了解 tcpdump 输出编号

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,在哪里 frac 自午夜以来只有几分之一秒。

  • IP -分组协议。 在这种情况下,IP表示Internet协议版本4(IPv4)。

  • 192.168.1.185.22 -源IP地址和端口,以点号(.)。

  • 192.168.1.150.37445 -目标IP地址和端口,以点号(.)。

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

    • [.] -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 筛选器#

什么时候 tcpdump 在没有过滤器的情况下调用,会捕获所有流量并产生大量输出,这使得查找和分析目标数据包非常困难。

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

tcpdump 使用Berkeley数据包筛选器(BPF)语法使用各种加工参数(例如协议,源IP地址和目标IP地址和端口等)过滤捕获的数据包。

在本文中,我们将介绍一些最常见的过滤器。 有关所有可用过滤器的列表,请查看pcap-filter联机帮助页。

按协议编号过滤

要将捕获限制为特定协议,请将该协议指定为过滤器。 例如,要仅捕获UDP通信,可以使用:

sudo tcpdump -n udp

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

sudo tcpdump -n proto 17

有关编号的更多信息,请检查IP协议编号列表。

按主机过滤

要仅捕获与特定主机有关的数据包,请使用 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

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

sudo tcpdump -n portrange 110-150

按来源和目的地过滤

您还可以使用are过滤基于源或目标端口或主机的数据包 srcdstsrc and dstsrc 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||),以及 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和十六进制格式打印数据包的内容。

-A 选项告诉 tcpdump 以ASCII格式打印每个数据包,然后 -x 在十六进制中:

sudo tcpdump -n -A

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

sudo tcpdump -n -X

读取和写入捕获到文件#

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

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

sudo tcpdump -n -w data.pcap

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

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

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

sudo tcpdump -r data.pcap

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

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

长时间捕获数据包时,可以启用文件轮换。 tcpdump 允许您创建的新文件或以指定的时间间隔或固定大小旋转转储文件。 以下命令最多可创建十个200MB文件,名为 file.pcap0file.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网站。

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

tcpdump终端

Sidebar