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
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网站。
如果您有任何问题或反馈,请随时发表评论。