Linux抓包工具tcpdump
TCPdump
TCPdump,全称dump the traffic on anetwork,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。
tcpdump可以支持的功能:
- 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析
- 2、支持网络层、传输层协议等协议捕获过滤;
- 3、数据发送和接收的主机、网卡和端口等各种过滤捕获数据规则
- 4、提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息
- 5、结合wireshark工具分析捕获的报文
tcpdump 的常用参数
tcpdump 这个工具有非常丰富的参数,可以提供不同的功能,满足多样的抓包需求
基本命令
1 |
|
常见选项
-i <interface>
:指定网络接口(例如,eth0
,wlan0
)。-n
:不解析主机名和服务名,只显示 IP 地址和端口号。-nn
:不解析主机名和服务名,只显示 IP 地址和数字端口号。-v
:详细输出。-vv
:更详细的输出。-vvv
:非常详细的输出。-c <count>
:捕获指定数量的数据包。-s <snaplen>
:指定捕获数据包的最大长度(默认为 65535 字节)。-w <file>
:将捕获的数据包保存到文件中。-r <file>
:从文件读取数据包进行分析。-X
:以十六进制和 ASCII 格式显示数据包内容。
过滤表达式
host <hostname>
:捕获指定主机的流量。net <network>
:捕获指定网络的流量。port <port>
:捕获指定端口的流量。src <address>
:捕获来自指定源地址的流量。dst <address>
:捕获发往指定目标地址的流量。tcp
:捕获 TCP 流量。udp
:捕获 UDP 流量。icmp
:捕获 ICMP 流量。
例如:
1 |
|
不加任何参数
1 |
|
默认输入 tcpdump 这个命令,回车操作之后,它将监视第一个网络接口上所有流过的数据包,一般是 eth0,如下图所示:
第一列:报文的时间
第二列:网络协议 IP
第三列:发送方的ip地址、端口号、域名
第四列:箭头 >, 表示数据流向
第五列:接收方的ip地址、端口号、域名
第六列:冒号
第七列:数据包内容,报文头的摘要信息,有ttl、报文类型、标识值、序列、包的大小等信息
监视指定网络接口的数据包
1 |
|
一般情况下,我们可能关心的数据并不是 eth0 的接口,这时就需要指定端口进行数据包的捕获。在 tcpdump 后面加一个 -i 的参数,后面跟具体需要捕获的接口名称,就可以抓取经过这个具体接口的所有数据包。
可以使用ifconfig获取所有网络接口的信息
监视指定主机的数据包
1 |
|
如果你非常明确关心的是哪个主机的收发报文,那么就可以直接过滤这个主机的数据包。 host 后面加主机的 IP 地址,就可以只抓取这个主机的所有数据包,其他主机的数据包就会被过滤掉。

如果需要捕获该主机与特定某主机的交互数据包,可以用逻辑运算符来表示:
1 |
|
这就表示只有主机 175.8.50.137 和 主机 100.27.48.1 的交互数据报文才会被捕获到。
监视指定协议和端口的数据包
1 |
|
加上具体某个协议的某个端口,就可以更加精确的捕获对应的业务的数据报文了。如上,就会只抓取 TCP 协议的 22 端口的数据报,也就是 SSH 协议的数据报文:
显示协议头和包内容
1 |
|
加-X 参数,可以把协议头和包内容都原原本本的显示出来(tcpdump 会以 16 进制和 ASCII 的形式显示),这在进行协议分析时是绝对的利器。

控制捕获的数据包数量
1 |
|
-c 参数,即 Count 的含义,设置希望 tcpdump 帮我们抓几个包。
保存捕获到的数据包
1 |
|
参数-w 直接将包写入文件中,存储到磁盘上,为后续使用。如下图所示,就是将捕获到的数据保存到 test.cap 的文件里:

当然,这个保存的保存可以通过 xftp 传出到本地,然后用 wireshark 工具可以打开
将流量进行回放
1 |
|
参数-r 可以实现“流量回放”的功能,就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。比如下图所示:就是将上面捕获保存的流量包 test.cap 进行回放: