Linux tcpdump命令

时间:2020-02-23 14:40:00  来源:igfitidea点击:

tcpdump是一个命令行实用程序,它使我们可以捕获和分析通过系统的网络流量。
根据筛选选项,我们可以使用此工具有效地帮助解决任何类型的网络问题。
它是sysadmin工程师用于这些功能的非常常用的工具。

在本教程中,我们将分析一些使用tcpdump的方法,但不是全部。
这是因为此命令中涉及太多的过滤选项,因此无法涵盖所有过滤选项。
我们将仅在此处查看一些常用选项。
您可以在手册页上找到其余内容。

安装tcpdump命令

您可以通过键入以下命令来检查系统是否具有tcpdump命令:

tcpdump --version

如果输出显示未安装,则可以使用系统的程序包管理器直接获取。

注意:由于我们将捕获数据包,因此需要提升的权限。
(需要sudo)。
结果,所有tcpdump命令都将以sudo前缀。

列出用于数据包捕获的接口

在主动捕获数据包之前,我们将查看tcpdump的可用接口。

我们可以使用-D(显示)选项列出接口。

sudo tcpdump -D

Tcpdump列表接口

您将获得计算机上所有可用接口的列表。
这将因系统而异,因此,除了典型的网络接口之外,由于Docker服务正在运行,因此我还有其他接口,如Docker。

特殊接口any允许在任何活动接口中捕获。

现在我们知道了机器上可用的接口,让我们开始捕获数据包!

使用tcpdump捕获数据包

通过运行以下命令捕获任何接口中的所有数据包:

sudo tcpdump -i any

这将指定接口为任何接口,这是前面提到的特殊接口。

tcpdump继续捕获数据包,直到收到中断信号为止。
您可以通过按Ctrl + C来中断捕获。

输出将列出所有捕获的数据包,直到收到中断信号以终止" tcpdump"为止。

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
10:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108
10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36
10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116
10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36
...
...
^C
264 packets captured
361 packets received by filter
91 packets dropped by kernel

如您所见,tcpdump已捕获264个数据包。
例如,由于我使用ssh连接到该服务器,因此tcpdump捕获了所有这些数据包。

数据包捕获的限制数量

要限制捕获的数据包数量并停止" tcpdump",请使用" -c"(捕获限制)选项:

sudo tcpdump -i any -c 2

这将导致tcpdump命令在2个数据包后自动停止捕获。
在这种情况下,我们不一定需要使用中断信号来手动终止它。

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
10:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108
10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36
2 packets captured
16 packets received by filter
8 packets dropped by kernel

如果存在网络问题,此选项在监视网络连接以解决任何问题时非常有用。

禁用名称和端口解析

默认情况下,tcpdump命令将IP地址和端口解析为名称(例如vultr.com.ssh,它从IP地址和端口进行名称解析)。

解决网络问题时,通常更容易使用IP地址和端口号。
我们可以通过使用选项-n和端口分辨率与-nn来禁用名称解析。

sudo tcpdump -i any -c 2 -nn

上面的命令在禁用端口解析的同时捕获任何接口上的2个数据包。

因此,输出现在将停止任何名称解析,仅返回IP地址和端口号。

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
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36
2 packets captured
8 packets received by filter
0 packets dropped by kernel

其中让我们检查输出的一行。

11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108

这是典型的TCP数据包捕获。
其他协议数据包和格式可以在tcpdump命令手册页中参考。

第一个字段11:00:36.459922代表根据本地时钟接收的数据包的时间戳。

接下来," IP"代表网络层协议,在这种情况下为" IPv4"。
对于" IPv6"数据包,该值为" IP6"。

下一个字段111.11.111.11.22是源IP地址和端口。
随后是目标IP地址和端口,由123.45.678.90.48006表示。

现在我们知道基本的输出格式了,让我们分析一下tcpdump的一些过滤选项。

过滤数据包

tcpdump命令最强大的功能之一就是它能够使用各种参数(例如源IP地址和目标IP地址,端口,协议等)过滤捕获的数据包的功能。
让我们来看一些最常见的参数。

根据协议过滤

要基于协议过滤数据包,我们需要在命令中指定协议。

仅捕获ICMP数据包,我们可以基于ICMP协议进行过滤。

sudo tcpdump -i any -c 5 icmp

由于ping命令使用的是ICMP数据包,因此我们可以分析来自另一台计算机的ping导致的传入数据包。

让我们ping我们当前的计算机并捕获传入的ping数据包。

在另一台计算机上打开终端会话,然后键入

ping IP_ADDRESS_MACHINE_1

现在,在我们的tcpdump终端会话中,我们现在可以看到它捕获了那些ICMP ping应答包。

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
11:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64
11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64
11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64
11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64
11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64
5 packets captured
6 packets received by filter
0 packets dropped by kernel

其中123.45.678.90是将ping发送到我们的tcpdump系统的机器(机器2)的IP地址,而111.11.111.11是包过滤机器(机器1)的IP地址。

由于我使用的是ssh发送ping请求,因此存在到vultr.com的域解析(但没有名称解析)。

根据主机过滤

为了将捕获限制为仅与特定主机相关的数据包,我们可以使用"主机"过滤器

sudo tcpdump -i any -c5 -nn host 192.168.1.2

在此示例中,tcpdump仅捕获并显示往返于主机192.168.1.2的数据包。

根据端口过滤

要根据所需的服务或者端口过滤数据包,请使用"端口"过滤器。
例如,使用以下命令捕获与ssh会话相关的数据包(端口22过滤):

sudo tcpdump -i any -c5 -nn port 22

根据源IP /主机名进行过滤

您还可以根据源或者目标IP地址或者主机名过滤数据包。
例如,从主机192.168.1.2捕获数据包

sudo tcpdump -i any -c 5 -nn src 192.168.1.2

我们也可以使用dst来过滤目标IP /主机名。

sudo tcpdump -i any -c 5 -nn src 172.168.1.2

保存数据包捕获

我们可以将数据包捕获的结果保存到文件中以供以后分析。

要将数据包保存到文件中而不是在屏幕上显示,请使用选项-w:

sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22

该命令将输出保存在名为" sample.pcap"的文件中。
扩展名.pcap表示"数据包捕获",是此文件格式的约定。