tcpdump是一个命令行实用程序,可用于捕获和检查进出系统的网络流量。 它是网络管理员中用于排除网络问题和安全测试的最常用工具。
尽管名称如此,使用tcpdump,您也可以捕获非TCP流量,例如UDP,ARP或ICMP。 捕获的数据包可以写入文件或标准输出。 tcpdump命令最强大的功能之一是它能够使用过滤器并仅捕获要分析的数据。
在本文中,我们将介绍如何在Linux中使用tcpdump命令的基础知识。
安装tcpdump
在大多数Linux发行版和macOS上默认安装了tcpdump。 要检查tcpdump命令在您的系统上是否可用:
[linuxidc@linux:~/www.linuxidc.com]$ tcpdump --version
输出应如下所示:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1 11 Sep 2018
如果您的系统上没有tcpdump,则上面的命令将显示“ 没有那个文件或目录”。 您可以使用发行版的软件包管理器轻松安装tcpdump。
[linuxidc@linux:~/www.linuxidc.com]$ tcpdump --version
bash: /usr/sbin/tcpdump: 没有那个文件或目录
在Ubuntu和Debian上安装tcpdump
$sudo apt update && sudo apt install tcpdump
$sudo yum install tcpdump
在Arch Linux上安装tcpdump
$sudo pacman -S tcpdump
使用tcpdump捕获数据包
tcpdump命令的常规语法如下:
tcpdump [选项] [过滤器表达式]
命令选项使您可以控制命令的行为。
过滤器表达式定义将捕获哪些数据包。
只有root或具有sudo特权的用户才能运行tcpdump。 如果您尝试以非特权用户身份运行该命令,则会收到一条错误消息:“您无权在该设备上进行捕获”。
tcpdump: ens33: You don't have permission to capture on that device
(socket: Operation not permitted)
最简单的用例是不带任何选项和过滤器的情况下调用tcpdump:
[linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump
输出如下:
[sudo] linuxidc 的密码:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
tcpdump将继续捕获数据包并写入标准输出,直到接收到中断信号为止。 使用Ctrl + C组合键发送中断信号并停止命令。
要获得更详细的输出,请传递-v选项,或传递-vv以获得更详细的输出:
[linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -vv
您可以使用-c选项指定要捕获的数据包数量。 例如,要仅捕获5个数据包,请输入:
[linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
21:08:14.575216 IP linux.42082 > 180.101.49.12.https: Flags [.], ack 470550152, win 30016, length 0
21:08:14.577139 IP 180.101.49.12.https > linux.42082: Flags [.], ack 1, win 64240, length 0
21:08:14.578127 IP linux.37565 > _gateway.domain: 52885+ [1au] PTR? 12.49.101.180.in-addr.arpa. (55)
21:08:14.583548 IP _gateway.domain > linux.37565: 52885 NXDomain 0/1/1 (114)
21:08:14.585411 IP linux.37565 > _gateway.domain: 52885+ PTR? 12.49.101.180.in-addr.arpa. (44)
5 packets captured
14 packets received by filter
5 packets dropped by kernel
捕获数据包后,tcpdump将停止。
如果未指定任何接口,则tcpdump使用它找到的第一个接口并转储通过该接口的所有数据包。
使用-D选项可以打印tcpdump可以从中收集数据包的所有可用网络接口的列表:
[linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -D
对于每个接口,该命令将打印接口名称,简短描述以及关联的索引(数字):