什么是 tcpdump 命令?
Tcpdump 是一个强大的网络监控工具,它允许用户有效地过滤网络上的数据包和流量。您可以获得有关 TCP/IP 和网络上传输的数据包的详细信息。Tcpdump 是一个命令行实用程序,这意味着您可以在没有显示的 Linux 服务器上运行它。
系统管理员还可以将 tcpdump 实用程序与cron集成,以便自动执行各种任务,例如日志记录。由于其众多功能使其非常通用,因此 tcpdump 既可以用作故障排除工具,也可以用作安全工具。
如何在 Linux 上安装 tcpdump
虽然大多数时候您会发现 tcpdump 预装在您的系统上,但某些 Linux 发行版并未随附该软件包。因此,您可能必须在系统上手动安装该实用程序。
您可以使用which命令检查系统上是否安装了 tcpdump 。
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ which tcpdump
- 1.
- 2.
如果输出显示目录路径 ( /usr/bin/tcpdump ),则您的系统已安装该软件包。但是,如果没有,您可以使用系统上的默认包管理器轻松完成。
要在基于 Debian 的发行版(例如 Ubuntu)上安装 tcpdump:
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo apt-get install tcpdump
- 1.
- 2.
在基于 Arch 的系统上,运行:
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo pacman -S tcpdump
- 1.
- 2.
要在 Fedora、CentOS 和 RHEL 上安装 tcpdump 实用程序,请发出以下命令:
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo dnf install tcpdump
- 1.
- 2.
请注意,tcpdump 包需要libcap作为依赖项,因此请确保您也将其安装在系统上。
在 Linux 上捕获网络数据包的 Tcpdump 示例
现在您已经在 Linux 机器上成功安装了 tcpdump,是时候监控一些数据包了。由于 tcpdump 需要超级用户权限才能执行大多数操作,因此您必须将sudo添加到您的命令中。
1.列出所有网络接口
要检查哪些网络接口可用于捕获,请在 tcpdump 命令中使用-D标志。
tcpdump -D
- 1.
将--list-interfaces标志作为参数传递将返回相同的输出。
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo tcpdump --list-interfaces
- 1.
- 2.
输出将是系统上存在的所有网络接口的列表。
获得网络接口列表后,是时候通过捕获系统上的数据包来监控网络了。尽管您可以指定要使用的接口,但any参数命令 tcpdump 使用任何活动接口捕获网络数据包。
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo tcpdump --interface any
- 1.
- 2.
系统将显示以下输出。
2. tcpdump 输出格式
从第三行开始,输出的每一行表示 tcpdump 捕获的特定数据包。这是单个数据包的输出的样子。
16:23:44.545056 eth0 Out IP linuxmi.40016 > 120.253.255.102.https: Flags [P.], seq 1007723650:1007723689, ack 1485464298, win 62780, length 39
请记住,并非所有数据包都以这种方式捕获,但这是大多数数据包遵循的一般格式。
输出包含以下信息。
- 接收数据包的时间戳
- 接口名称
- 包流
- 网络协议名称
- IP 地址和端口详细信息
- TCP 标志
- 数据包中数据的序号
- 确认数据
- 窗口大小
- 数据包长度
第一个字段 ( 16:23:44.545056 ) 显示系统发送或接收数据包时的时间戳。记录的时间是从您系统的本地时间中提取的。
第二个和第三个字段表示使用的接口和数据包的流向。在上面的代码片段中,eth0是无线接口的名称,Out是数据包流。
第四个字段包括与网络协议名称有关的信息。通常,您会发现两种协议- IP和IP6,其中 IP 表示 IPV4,IP6 表示 IPV6。
下一个字段包含 IP 地址或源和目标系统的名称。IP 地址后跟端口号。
输出中的第六个字段由 TCP 标志组成。tcpdump 输出中使用了各种标志。
标志名称 |
值 |
描述 |
SYN |
S |
连接开始 |
FIN |
F |
连接完成 |
PUSH |
O |
数据被推送 |
RST |
R |
连接已重置 |
ACK |
. |
确认 |
输出还可以包含多个 TCP 标志的组合。例如,FLAG [f.]代表一个 FIN-ACK 包。
在输出片段中进一步移动,下一个字段包含数据包中数据的序列号 ( seq 1007723650:1007723689 )。第一个数据包总是有一个正整数值,随后的数据包使用相对序列号来改善数据流。
下一个字段包含确认号(ack 1485464298)或简单的确认号。在发送方机器中捕获的数据包有 1485464298 作为确认号。在接收端,Ack 号是下一个数据包的值。
输出中的第九个字段包含窗口大小(win 62780),即接收缓冲区中可用的字节数。窗口大小后面还有几个其他字段,包括最大段大小 (MSS)。
最后一个字段(length 39)包含 tcpdump 捕获的整个数据包的长度。
3.限制抓包数
第一次运行 tcpdump 命令时,您可能会注意到系统会继续捕获网络数据包,直到您传递中断信号。您可以通过使用-c标志预先指定要捕获的数据包计数来覆盖此默认行为。
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo tcpdump --interface any -c 3
- 1.
- 2.
上述命令将从任何活动的网络接口捕获3个数据包。
4.根据字段过滤数据包
当您对问题进行故障排除时,在终端上获取大量文本输出并不会使其变得更容易。这就是 tcpdump 中的过滤功能发挥作用的地方。您可以根据主机、协议、端口号等各种字段过滤数据包。
要仅捕获 TCP 数据包,请键入:
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo tcpdump --interface any -c 5 tcp
- 1.
- 2.
同样,如果要使用端口号过滤输出:
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ sudo tcpdump --interface any -c 5 port 50
- 1.
- 2.
上述命令只会检索通过指定端口传输的数据包。
要获取特定主机的数据包详细信息:
tcpdump --interface any -c 5 host 112.123.13.145
- 1.
如果要过滤特定主机发送或接收的数据包,请在命令中使用src或dst参数。
tcpdump --interface any -c 5 src 112.123.13.145
tcpdump --interface any -c 5 dst 112.123.13.145
- 1.
- 2.
您还可以使用逻辑运算符and和or将两个或多个表达式组合在一起。例如,要获取属于源 IP 112.123.13.145的数据包并使用端口80:
tcpdump --interface any -c 10 src 112.123.13.145 and port 80
- 1.
可以使用括号将复杂表达式组合在一起,如下所示:
tcpdump --interface any -c 10 "(src 112.123.13.145 or src 234.231.23.
234) and (port 45 or port 80)"
- 1.
- 2.
5.查看包的内容
您可以在 tcpdump 命令中使用-A和-x标志来分析网络数据包的内容。-A 标志代表ASCII格式,-x表示十六进制格式。
查看系统捕获的下一个网络数据包的内容:
tcpdump --interface any -c 1 -A
tcpdump --interface any -c 1 -x
- 1.
- 2.
6. 将捕获数据保存到文件
如果您想保存捕获数据以供参考,tcpdump 可以帮助您。只需使用默认命令传递-w标志即可将输出写入文件而不是在屏幕上显示。
tcpdump --interface any -c 10 -w data.pcap
- 1.
.pcap文件扩展名代表数据包捕获数据。您还可以使用-v标志以详细模式发出上述命令。
tcpdump --interface any -c 10 -w data.pcap -v
- 1.
要使用 tcpdump 读取.pcap文件,请使用-r标志,后跟文件路径。-r代表读取。
tcpdump -r data.pcap
- 1.
您还可以从文件中保存的数据包数据中过滤网络数据包。
tcpdump -r data.pcap port 80
- 1.
在 Linux 上监控网络流量
如果您被分配了管理 Linux 服务器的任务,那么 tcpdump 命令是一个很好的工具,可以包含在您的武器库中。您可以通过实时捕获网络上传输的数据包轻松解决与网络相关的问题。
但在此之前,您的设备必须连接到互联网。对于 Linux 初学者来说,即使通过命令行连接 Wi-Fi 也可能有点挑战。但是,如果您使用正确的工具,那就轻而易举了。