tcpdump 是linux系统中提供的一个命令行工具,可以将网络中传送的数据包完全截获下来,提供网络数据分析
前言
tcpdump 是一个有名的命令行数据包分析工具。我们可以使用 tcpdump 命令捕获实时 TCP/IP 数据包,这些数据包也可以保存到文件中。之后这些捕获的数据包可以通过 tcpdump 命令进行分析。tcpdump 命令在网络层面进行故障排除时变得非常方便。
tcpdump 在大多数 Linux 发行版中都能用,对于基于 Debian 的Linux,可以使用 apt 命令安装它。
1 |
|
在基于 RPM 的 Linux 操作系统上,可以使用下面的 yum 命令安装 tcpdump。
1 |
|
当我们在没用任何选项的情况下运行 tcpdump 命令时,它将捕获所有接口的数据包。因此,要停止或取消 tcpdump 命令,请键入 ctrl+c。在本教程中,我们将使用不同的实例来讨论如何捕获和分析数据包。
示例:1)从特定接口捕获数据包
当我们在没用任何选项的情况下运行 tcpdump 命令时,它将捕获所有接口上的数据包,因此,要从特定接口捕获数据包,请使用选项 -i,后跟接口名称。
语法:
1 |
|
假设我想从接口 enp0s3 捕获数据包。
输出将如下所示,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
示例:2)从特定接口捕获特定数量数据包
假设我们想从特定接口(如 enp0s3)捕获 12 个数据包,这可以使用选项 -c {数量} -I {接口名称} 轻松实现。
1 |
|
上面的命令将生成如下所示的输出,
N-Number-Packsets-tcpdump-interface
示例:3)显示 tcpdump 的所有可用接口
使用 -D 选项显示 tcpdump 命令的所有可用接口,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
我正在我的一个 openstack 计算节点上运行 tcpdump 命令,这就是为什么在输出中你会看到数字接口、标签接口、网桥和 vxlan 接口。
示例:4)捕获带有可读时间戳的数据包(-tttt 选项)
默认情况下,在 tcpdump 命令输出中,不显示可读性好的时间戳,如果您想将可读性好的时间戳与每个捕获的数据包相关联,那么使用 -tttt 选项,示例如下所示,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
示例:5)捕获数据包并将其保存到文件(-w 选项)
使用 tcpdump 命令中的 -w 选项将捕获的 TCP/IP 数据包保存到一个文件中,以便我们可以在将来分析这些数据包以供进一步分析。
语法:
1 |
|
注意:文件扩展名必须为 .pcap。
假设我要把 enp0s3 接口捕获到的包保存到文件名为 enp0s3-26082018.pcap。
1 |
|
上述命令将生成如下所示的输出,
1 2 3 4 5 6 7 8 |
|
捕获并保存大小大于 N 字节的数据包。
1 |
|
捕获并保存大小小于 N 字节的数据包。
1 |
|
示例:6)从保存的文件中读取数据包(-r 选项)
在上面的例子中,我们已经将捕获的数据包保存到文件中,我们可以使用选项 -r 从文件中读取这些数据包,例子如下所示,
1 |
|
用可读性高的时间戳读取包内容,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
示例:7)仅捕获特定接口上的 IP 地址数据包(-n 选项)
使用 tcpdump 命令中的 -n 选项,我们能只捕获特定接口上的 IP 地址数据包,示例如下所示,
1 |
|
上述命令输出如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
您还可以使用 tcpdump 命令中的 -c 和 -N 选项捕获 N 个 IP 地址包,
1 |
|
示例:8)仅捕获特定接口上的 TCP 数据包
在 tcpdump 命令中,我们能使用 tcp 选项来只捕获 TCP 数据包,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
示例:9)从特定接口上的特定端口捕获数据包
使用 tcpdump 命令,我们可以从特定接口 enp0s3 上的特定端口(例如 22)捕获数据包。
语法:
1 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
示例:10)在特定接口上捕获来自特定来源 IP 的数据包
在 tcpdump 命令中,使用 src 关键字后跟 IP 地址,我们可以捕获来自特定来源 IP 的数据包,
语法:
# tcpdump -n -i {接口名} src {IP 地址}
例子如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
示例:11)在特定接口上捕获来自特定目的 IP 的数据包
语法:
# tcpdump -n -i {接口名} dst {IP 地址}
1 2 3 4 5 6 7 8 9 10 |
|
示例:12)捕获两台主机之间的 TCP 数据包通信
假设我想捕获两台主机 169.144.0.1 和 169.144.0.20 之间的 TCP 数据包,示例如下所示,
1 |
|
使用 tcpdump 命令只捕获两台主机之间的 SSH 数据包流,
1 |
|
示例:13)捕获两台主机之间(来回)的 UDP 网络数据包
语法:
# tcpdump -w -s -i udp and \(host and host \)
1 |
|
示例:14)捕获十六进制和 ASCII 格式的数据包
使用 tcpdump 命令,我们可以以 ASCII 和十六进制格式捕获 TCP/IP 数据包,
要使用 -A 选项捕获 ASCII 格式的数据包,示例如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
要同时以十六进制和 ASCII 格式捕获数据包,请使用 -XX 选项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|