Linux tcpdump命令介绍
tcpdump是一个用于捕获和分析网络流量的命令行工具。它是网络管理员用于排除网络问题和安全测试的最常用的工具之一。使用tcpdump,你不仅可以捕获TCP协议的流量,还可以捕获非TCP协议的流量,如UDP,ARP或ICMP。捕获的数据包可以写入文件或标准输出。tcpdump命令的最强大的特性之一是它可以使用过滤器,只捕获你感兴趣的数据。¹²
Linux tcpdump命令适用的Linux版本
tcpdump在大多数Linux发行版和macOS上默认安装。要检查你的系统上是否有tcpdump命令,可以输入:
tcpdump --version
输出应该类似于这样:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
如果你的系统上没有tcpdump,上面的命令会打印“tcpdump: command not found”。你可以使用你的系统的包管理器来轻松地安装tcpdump。
在Ubuntu,Debian和Linux Mint上安装tcpdump:
[linux@bashcommandnotfound.cn ~]$ sudo apt update && sudo apt install tcpdump
在CentOS,Fedora,AlmaLinux和Red Hat上安装tcpdump:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install tcpdump
在Arch Linux和Manjaro上安装tcpdump:
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S tcpdump
Linux tcpdump命令的基本语法
tcpdump命令的一般语法如下:
tcpdump [options] [expression]
命令选项可以控制命令的行为。过滤表达式定义了哪些数据包会被捕获。只有root用户或具有sudo权限的用户才能运行tcpdump。如果你以非特权用户运行命令,你会得到一个错误,说:“You don’t have permission to capture on that device”。
Linux tcpdump命令的常用选项说明
tcpdump命令有很多选项,这里只列出一些最常用的选项:
选项 | 描述 |
---|---|
-D | 列出tcpdump可以使用的网络接口 |
-i | 指定要捕获流量的网络接口 |
-c | 指定要捕获的数据包的数量 |
-n | 不解析主机名和端口号,只显示IP地址和数字 |
-v | 显示更详细的输出,可以使用-vv或-vvv来增加详细程度 |
-w | 将捕获的数据包写入文件 |
-r | 从文件中读取数据包 |
-q | 以简洁的格式显示输出 |
-A | 以ASCII码格式显示数据包的内容 |
-X | 以ASCII码和十六进制格式显示数据包的内容 |
-s | 指定要捕获的每个数据包的大小,单位是字节 |
-t | 不显示时间戳 |
-tt | 显示绝对时间戳 |
-ttt | 显示相对时间戳 |
-e | 显示以太网头部信息 |
-E | 指定加密算法和密钥来解密IPsec流量 |
Linux tcpdump命令的实例
下面是一些使用tcpdump命令的实例:
- 捕获ens3接口上的所有数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3
- 捕获ens3接口上的前10个数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 -c 10
- 捕获ens3接口上的所有TCP数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 tcp
- 捕获ens3接口上目标或源IP地址为192.168.1.10的数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 host 192.168.1.10
- 捕获ens3接口上目标IP地址为192.168.1.10,源IP地址为192.168.1.20的数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 src 192.168.1.20 and dst 192.168.1.10
- 捕获ens3接口上目标或源端口为80的数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 port 80
- 捕获ens3接口上目标端口为80,源端口为22的数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 src port 22 and dst port 80
- 捕获ens3接口上目标或源端口在1到1024之间的数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 portrange 1-1024
- 捕获ens3接口上的所有ICMP数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 icmp
- 捕获ens3接口上的所有ARP数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 arp
- 捕获ens3接口上的所有广播数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 broadcast
- 捕获ens3接口上的所有多播数据包:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 multicast
- 捕获ens3接口上的所有数据包,并将它们写入文件:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 -w capture.pcap
- 从文件中读取数据包,并显示它们的内容:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -r capture.pcap -X
- 捕获ens3接口上的所有数据包,并以简洁的格式显示输出:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 -q
- 捕获ens3接口上的所有数据包,并以ASCII码格式显示数据包的内容:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 -A
Linux tcpdump命令的注意事项
- 在使用tcpdump命令时,要注意你的终端的缓冲区大小,如果捕获的数据包太多,可能会导致终端无法显示完整的输出。你可以使用-w选项将数据包写入文件,然后用-r选项从文件中读取数据包,或者使用其他工具来分析数据包,如Wireshark。
- 在使用tcpdump命令时,要注意你的网络接口的模式,如果你的网络接口是混杂模式,那么你可以捕获所有经过该接口的数据包,包括不是发给你的数据包。如果你的网络接口是非混杂模式,那么你只能捕获发给你的数据包。你可以使用ifconfig命令来查看或设置你的网络接口的模式。
- 在使用tcpdump命令时,要注意你的过滤表达式的逻辑,如果你的过滤表达式有多个条件,你需要使用括号来分组,否则可能会得到意想不到的结果。例如,如果你想捕获目标端口为80或443,且源端口为22的数据包,你需要使用括号来分组,否则可能会得到意想不到的结果。例如,如果你想捕获目标端口为80或443,且源端口为22的数据包,你应该使用这样的表达式:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 '(dst port 80 or dst port 443) and src port 22'
而不是这样的表达式:
[linux@bashcommandnotfound.cn ~]$ sudo tcpdump -i ens3 dst port 80 or dst port 443 and src port 22
因为后者的逻辑是捕获目标端口为80,或者目标端口为443且源端口为22的数据包,这可能不是你想要的结果。
- 在使用tcpdump命令时,要注意你的网络流量的安全性,如果你捕获的数据包包含敏感信息,如密码,信用卡号等,你应该使用加密算法和密钥来保护你的数据包,或者使用-E选项来解密IPsec流量。你也应该避免将你的数据包文件分享给不可信的人或机构,以防止数据泄露。
如果你在使用tcpdump命令时遇到了“bash: tcpdump: command not found”的错误,说明你的系统上没有安装tcpdump命令,你可以根据你的系统的包管理器来安装tcpdump命令,如上文所述。
评论区