Linux tcpdump命令
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表示"数据包捕获",是此文件格式的约定。