Linux tcpdump 命令详解

一、命令简介

tcpdump 是一个强大的命令行网络嗅探工具,用于捕获和分析经过计算机网络接口的数据包。它支持几乎所有类型的网络协议,包括 Ethernet、IPv4、IPv6、TCP、UDP 等,可以用来实时捕获网络流量,帮助网络管理员诊断网络问题或进行安全分析。

tcpdump 通常用于排查网络故障、监控网络活动、分析网络性能以及捕获潜在的安全威胁。它能够以原始数据包的形式显示网络流量,或者使用一些过滤规则筛选感兴趣的数据。

二、命令语法

tcpdump 的基本语法如下:

tcpdump [选项] [表达式]
  • 选项:指定捕获或显示数据包时使用的参数。

  • 表达式:指定捕获的数据包过滤条件,可以按协议、IP 地址、端口号等过滤网络流量。

三、命令选项

tcpdump 支持很多选项,用于定制捕获和显示的数据包,常用选项如下:

选项作用
-i <接口>指定要监听的网络接口,如 eth0、wlan0。默认会监听所有接口。
-c <数量>捕获指定数量的数据包后停止。
-w <文件名>将捕获的数据包写入到指定文件中,通常为 .pcap 文件格式。
-r <文件名>从指定的 .pcap 文件中读取数据包进行分析。
-n禁止 DNS 解析,显示 IP 地址而不是主机名。
-v显示详细输出信息(-vv 或 -vvv 进一步增加详细程度)。
-X以十六进制和 ASCII 格式打印数据包内容。
-s <长度>设置捕获的最大数据包长度,默认是 262144 字节。
-p禁用混杂模式,即只捕获发送到本机的数据包。
-tt显示绝对时间戳,而不是相对时间。
-A以 ASCII 格式打印数据包的内容。
-l使输出流缓冲区为行缓冲,适合实时显示。
-q使输出简洁,减少输出的信息量。
-e显示数据链路层头部信息。
-T <协议>设置输出的解析协议类型,例如 -T dns 或 -T tcp。
-F <文件>从指定的文件中加载过滤表达式。

四、过滤表达式

tcpdump 支持强大的过滤表达式,可以根据各种条件筛选数据包。常见的过滤表达式包括:

过滤条件作用
host <IP>捕获与指定 IP 地址相关的数据包(可以是源 IP 或目的 IP)。
src <IP>捕获源 IP 地址为指定 IP 的数据包。
dst <IP>捕获目标 IP 地址为指定 IP 的数据包。
port <端口号>捕获指定端口号的数据包,支持 TCP 和 UDP 协议。
tcp只捕获 TCP 协议的数据包。
udp只捕获 UDP 协议的数据包。
icmp只捕获 ICMP 协议(如 Ping 请求)数据包。
net <网络地址>捕获指定网络的所有数据包。
and、or、not用于组合多个过滤条件。

示例过滤表达式:

  • 捕获所有与 IP 地址 192.168.1.100 相关的数据包:

    tcpdump host 192.168.1.100
    
  • 捕获源 IP 地址为 192.168.1.100 的所有数据包:

    tcpdump src 192.168.1.100
    
  • 捕获目标端口为 80(HTTP)的 TCP 数据包:

    tcpdump tcp port 80
    
  • 捕获来自 192.168.1.100 且目标端口为 443(HTTPS)的 TCP 数据包:

    tcpdump src 192.168.1.100 and tcp dst port 443
    
  • 捕获 UDP 数据包:

    tcpdump udp
    

五、常见用法

1. 捕获网络接口上的所有数据包

要捕获当前系统上的所有数据包,可以指定网络接口(如 eth0 或 wlan0):

sudo tcpdump -i eth0

该命令会实时显示捕获的所有数据包。

2. 捕获指定数量的数据包

可以使用 -c 选项指定捕获的最大数据包数:

sudo tcpdump -i eth0 -c 10

此命令捕获 10 个数据包后停止。

3. 将捕获的数据包保存到文件

可以将捕获的数据包保存到 .pcap 文件中,以便后续分析:

sudo tcpdump -i eth0 -w capture.pcap

该命令会将捕获的所有数据包写入 capture.pcap 文件。

4. 从文件中读取并分析数据包

使用 -r 选项从之前保存的 .pcap 文件中读取数据包并进行分析:

sudo tcpdump -r capture.pcap

该命令会从文件中读取数据包并显示其内容。

5. 捕获指定端口的数据包

可以捕获与指定端口相关的网络流量。例如,捕获所有通过端口 80(HTTP)的 TCP 数据包:

sudo tcpdump -i eth0 tcp port 80

该命令只捕获 TCP 端口为 80 的数据包。

6. 显示数据包内容

使用 -X 选项可以以十六进制和 ASCII 格式显示数据包的内容:

sudo tcpdump -i eth0 -X

该命令会打印每个数据包的十六进制和 ASCII 内容。

7. 捕获 ICMP 数据包

要捕获 ICMP 协议的数据包(例如 Ping 请求和响应),可以使用:

sudo tcpdump -i eth0 icmp

该命令仅捕获 ICMP 数据包。

8. 捕获指定网络的数据包

可以捕获来自或到达指定子网的数据包。例如,捕获来自 192.168.1.0/24 网络的数据包:

sudo tcpdump -i eth0 net 192.168.1.0/24

六、常见问题及解决方案

1. tcpdump: No suitable device found 错误

如果出现该错误,说明系统没有识别到指定的网络接口。你可以使用以下命令查看所有可用的网络接口:

ifconfig

或者:

ip link show

确保指定的接口正确并存在。

2. tcpdump: permission denied 错误

该错误通常是由于没有足够的权限捕获网络流量。tcpdump 需要管理员权限才能访问网络接口。使用 sudo 运行命令:

sudo tcpdump -i eth0

3. 输出信息过多

当捕获的数据包数量很大时,输出信息可能会非常庞大。可以使用 -c 选项限制捕获的数据包数量,或者使用 -w 将数据包保存到文件中,再后续分析。

七、总结

功能命令
捕获所有数据包sudo tcpdump -i eth0
捕获指定数量的数据包sudo tcpdump -i eth0 -c 10
保存数据包到文件sudo tcpdump -i eth0 -w capture.pcap
从文件读取并分析数据包sudo tcpdump -r capture.pcap
捕获特定端口的数据包sudo tcpdump -i eth0 tcp port 80
捕获 ICMP 数据包sudo tcpdump -i eth0 icmp
捕获特定网络的数据包sudo tcpdump -i eth0 net 192.168.1.0/24
显示十六进制和 ASCII 内容sudo tcpdump -i eth0 -X

tcpdump 是网络分析和故障排查的重要工具,适用于网络管理员、开发人员、系统

这里是封面:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐