在 Linux 中使用 tcpdump 抓取数据包
监控通过网络传输的所有这些数据包的过程称为嗅探。网络管理员通常使用嗅探器来排查故障和监控网络流量。攻击者使用这些嗅探器来捕获和监控数据包,以窃取敏感的用户帐户信息,例如密码、用户名和位置。
网络数据包是分组并在分组交换网络(如互联网)等计算机网络上传输的基本数据单元。
您还可以使用捕获通过网络接口传输的所有数据包的软件来监控和拦截网络上的流量。您也可以使用硬件工具来完成同样的操作,因为嗅探器既可以作为软件也可以作为硬件提供。在本指南中,我们将了解如何在 Linux 中使用 tcpdump 处理嗅探数据包。
在 Linux 中使用 tcpdump 抓取数据包
Tcpdump 是一种数据包分析和嗅探工具,Linux 系统管理员使用它来排查连接问题。有时,您也可以将此工具用于安全目的。此工具主要分析、过滤和捕获通过您的系统传输的网络流量,例如 IP/TCP 数据包。
它将捕获的信息收集到 .pcap 文件扩展名中,您只能在命令工具或 Wireshark 的帮助下打开它。tcpdump 在各种 Linux 发行版中作为预安装的实用程序提供。但是,您可以通过以下命令安装它:
sudo apt install tcpdump (for Ubuntu/Debian-based distros) yum install tcpdump (for RedHat-based Linux distros) sudo pacman -S tcpdump (for Arch Linux)
您还可以从其帮助页面获取有关 tcpdump 命令的简要信息:
~$: tcpdump --h
现在让我们看看一些您可以在 tcpdump 中尝试的不同选项的示例,以捕获网络数据包。
显示所有可用的网络接口
使用 tcpdump 命令中的 -D 选项将列出系统中可用的网络接口。
~$: sudo tcpdump -D [sudo] password for prateek: 1.enp0s3 [Up, Running, Connected] 2.any (Pseudo-device that captures on all interfaces) [Up, Running] 3.lo [Up, Running, Loopback] 4.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless] 5.nflog (Linux netfilter log (NFLOG) interface) [none] 6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none] 7.dbus-system (D-Bus system bus) [none] 8.dbus-session D-Bus session bus none
从上面的输出中,您可以看到每个网络接口的状态。Tcpdump 创建了一个名为“any”的伪设备,而不是实际的网络接口。因此,通过侦听此伪设备,该工具可以捕获通过所有接口传输的数据包。
嗅探网络接口
您可以使用以下命令捕获当前网络接口:
~$: sudo tcpdump
使用 tcpdump 的各种选项嗅探数据包
您可以通过多种不同的方式和格式捕获网络接口,列表如下:
如果您想**从特定的网络接口捕获数据包**,请使用 -i 选项:
~$: sudo tcpdump -i <network_interface>
类似地,使用 tcpdump 命令中的 -c 选项来**捕获特定数量的数据包**:
~$: sudo tcpdump -c <number of packets> -i <network_interface>
例如,让我们通过 tcpdump 命令从“lo”接口捕获 2 个数据包:
~$: sudo tcpdump -c 2 -i lo
在接口名称之后,您可以使用“tcp.”**仅捕获 tcp 数据包**。
~$: sudo tcpdump -i <network_interface> tcp
让我们捕获“lo”网络的 tcp 数据包:
~$: sudo tcpdump -i lo tcp
tcpdump 命令中的 -XX 标志**以十六进制和 ASCII 格式打印值**。
~$: sudo tcpdump -XX -i <network_interface>
在命令中添加 -A 以**仅以 ASCII 格式打印数据包**。
~$: sudo tcpdump -A -i <network_interface>
显示时间戳信息
Tcpdump 在每个数据包转储输出的第一列中添加一个时间戳,以指示捕获数据包的时间。使用此命令,您可以使用 -t 标志来支持时间戳输出的格式化。
~$: sudo tcpdump -t
使用上述命令时,它不会打印任何时间戳信息。
您还可以**以纪元时间打印时间戳**。在计算中,它是计算机的时间戳和时钟确定值的相对时间和日期。1970 年 1 月 1 日 00:00:00 UTC 称为 Unix 纪元。
这些纪元用作单个数字,便于计算,以维护时间参考。使用 -tt 选项命令,您可以以纪元时间打印时间戳:
~$: sudo tcpdump -tt
您还可以**以增量时间格式打印时间戳的输出**。增量时间是完成上一帧所花费的时间。您可以使用 tcpdump 命令中的 -ttt 标志以增量时间打印输出。
~$: sudo tcpdump -ttt
使用 -tttt 标志打印带有日期的时间戳
~$: sudo tcpdump -tttt
在特定接口上捕获 IP 地址数据包
您可以将 -u 选项与命令一起添加,以如下所示显示特定接口上的 IP 地址数据包:
~$: sudo tcpdump -n -i <network_interface>
例如,我们捕获“lo”网络上的 IP 地址数据包。
~$: sudo tcpdump -n -i lo
捕获并将数据包保存到文件
您可以保存 IP/TCP 数据包并在将来分析它们。使用 tcpdump 命令,您可以使用 -w 选项将这些数据包保存到文件中。请记住,这些文件的扩展名应始终为 .pcap,它代表**数据包捕获**。
~$: sudo tcpdump -w <file_name.pcap> -i <network_interface>
在这种情况下,我们将“enp0s3”接口数据包保存到名为“prateek.pcap”的文件中。(~$: sudo tcpdump -w <file_name.pcap> -i <network_interface>)
~$: sudo tcpdump -w prateek.pcap -i enp0s3 [sudo] password for prateek: tcpdump: listening on ep0s3, link-type EN10MB (Ethernet), snapshot length 262144 bytes
此外,您可以通过 -c 选项限制或设置每个文件的大小:
~$: sudo tcpdump -w prateek.pcap -i enp0s3 -C 3
这里 3 代表 3MB,即当“prateek.pcap”文件大小达到 3MB 时,tcpdump 将为每增加 3MB 创建更多此类文件,例如 prateek pcap1、prateek.pcap2 等。
读取从保存的文件中捕获的数据包
我们可以使用 -r 标志读取保存捕获数据包的文件,如下所示。
~$: sudo tcpdump -r <file_name.pcap> -i <network_interface>
在上面的示例中,我们保存了“prateek.pcap”文件。我们可以使用“-r”选项读取此文件中的数据包,如下所示:
~$: sudo tcpdump -r prateek.pcap -i enp0s3
结论
在本指南中,我们了解了如何在 Linux 中使用 tcpdump 嗅探数据包。您可以使用不同的标志显示数据包和文件,在本指南中我们给出了许多示例。
本指南将帮助您使用 tcpdump 捕获和分析 TCP/IP 数据包。此外,如果您想了解有关 tcpdump 命令的其他选项的更多信息,请使用 -h 选项。