tcpdump
是一个强大的命令行网络分析工具,广泛用于捕获网络上传输的数据包。是分析网络流量情况,排查网络问题、分析协议的交互以及网络安全监控的常用工具
基础使用
安装 tcpdump
在大多数 Linux 发行版中,tcpdump
已经预装。如果没有,可以通过包管理器安装:
-
在 Debian/Ubuntu 系统上:
bashsudo apt-get install tcpdump
-
在 CentOS/RHEL 系统上:
bashsudo yum install tcpdump
-
在 macOS 上,
tcpdump
通常已预装,如果需要更新或重新安装,可以使用 Homebrew:bashbrew install tcpdump
基本命令
-
捕获所有接口的数据包:
bashsudo tcpdump
这会显示所有接口上的数据包,通常输出会非常快,不易阅读。
-
指定网络接口抓包:
bashsudo tcpdump -i eth0
用
-i
选项指定接口(如eth0
)。如果不确定接口名称,可以用ip addr
命令查看。 -
保存捕获的数据包到文件:
bashsudo tcpdump -w myfile.pcap
使用
-w
选项将捕获的数据保存到文件中,方便后续使用 Wireshark 等工具进行分析。 -
从文件中读取数据包:
bashtcpdump -r myfile.pcap
使用
-r
选项从文件中读取数据包。
进阶使用
过滤表达式
tcpdump
强大之处在于其过滤表达式,可以精确指定需要捕获的数据包类型:
-
捕获特定主机的数据包:
bashsudo tcpdump host 192.168.1.1
只捕获所有发送到或来自 IP 地址为
192.168.1.1
的数据包。 -
捕获特定协议的数据包:
bashsudo tcpdump icmp
这条命令捕获所有 ICMP 数据包,例如 ping 请求。
-
组合条件:
bashsudo tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
这个复杂的表达式用来捕获所有 TCP 端口为 80 且含有数据(非 SYN、FIN 等控制包)的数据包。
-
排除特定主机的流量:
bashsudo tcpdump not host 192.168.1.1
捕获所有不是发送到或来自
192.168.1.1
的数据包。
性能优化
-
限制捕获的数据包数量:
bashsudo tcpdump -c 100
使用
-c
选项限制捕获的数据包数量,这里设置为 100。 -
使用缓冲区来提高捕获效率:
bashsudo tcpdump -B 4096
使用
-B
选项增大内核缓冲区的大小(以千字节为单位),这里设置为 4096 KB,有助于在高流量环境下不丢包。
示例应用场景
-
网络故障排查 :
bashsudo tcpdump -i eth0 -nn 'tcp port 443'
捕获所有通过
eth0
接口的 HTTPS 流量,不解析主机名
和服务名(使用 -nn
),有助于快速定位与 HTTPS 服务相关的问题。
-
安全监控 :
bashsudo tcpdump -i eth0 'src host 192.168.1.1 and not dst net 192.168.1.0/24'
捕获从 IP
192.168.1.1
发出且不是发往本地网络的所有数据包,用于检测可能的数据泄露或不寻常的外发连接。