tcpdump
是一个网络抓包工具,用于捕获网络数据包并分析网络流量。它允许用户实时监视和分析经过系统网络接口的数据包,用于网络故障排除、协议分析和安全审计等场景。
tcpdump
依赖 libpcap
软件包。
与它功能类似的工具有 wireshark
,不同的是,wireshark
有图形化界面,而 tcpdump
则只有命令行。
注意:运行 tcpdump
命令,需要使用 sudo
来获取超级用户权限或直接使用 root
用户执行命令。
安装 Tcpdump
安装 Tcpdump
- 打开终端(命令行窗口)。
- 使用以下命令更新软件包列表:
sudo apt update
- 安装
tcpdump
:sudo apt install tcpdump
- 验证安装:
tcpdump --version
,如果有显示tcpdump
的版本信息,证明它已经成功安装在你的系统上。
编译安装 Tcpdump
编译安装 tcpdump
可以在某些情况下提供更灵活的选项和更新的版本。以下是基本的步骤:
下载
tcpdump
源代码:wget https://www.tcpdump.org/release/tcpdump-<version>.tar.gz
请用实际的版本号替换
<version>
,你可以从 tcpdump 的官方网站 获取最新的版本号。
解压源代码:
tar -zxvf tcpdump-<version>.tar.gz cd tcpdump-<version>
安装必要的构建工具:
sudo apt-get install flex bison byacc libpcap-dev
在其他发行版上使用适当的包管理器来安装这些工具。
配置并编译:
./configure make
如果
configure
命令失败,可能需要安装一些缺失的依赖项。根据错误消息,使用包管理器安装缺少的库。
安装:
sudo make install
这会将编译好的二进制文件安装到系统中。
检查安装:
tcpdump -v
这应该显示
tcpdump
的版本信息,证明它已经成功安装。
请注意,编译安装软件可能会在系统上引入一些不同的依赖关系和配置。确保你的系统满足 tcpdump
的编译要求,并且在进行此操作之前备份系统或记录更改,以便在需要时进行还原。
常用选项
抓包选项:
-c
<数据包数目> 指定要抓取的包数量-i
<网卡接口> 指定tcpdump需要监听的接口,默认会抓取第一个网络接口;-n
对地址以数字方式显示,否则显示为主机名,也就是说-n
选项不做主机名解析;-nn
除了-n
的作用外,还把端口显示为数值,否则显示端口服务名;-P
指定要抓取的包是流入还是流出的包,可以给定的值为in
、out
和inout
,默认为inout
;-s
<数据包长度> 设置tcpdump的数据包抓取长度为len,如果不设置默认为65535
字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断。
输出选项:
-e
输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。-q
快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。-X
输出包的头部数据,会以16进制和ASCII两种方式同时输出。-XX
输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。-v
当分析和打印的时候,产生详细的输出。-vv
产生比-v
更详细的输出。-vvv
产生比-vv
更详细的输出
其它功能选项:
-D
列出可用于抓包的接口,将会列出接口的数值编号和接口名,它们都可以用于-i
后。-F
从文件中读取抓包的表达式,若使用该选项,则命令行中给定的其它表达式都将失效。-w
将抓包数据输出到文件中而不是标准输出,这里可以同时配合-G time
选项使得输出文件每time秒就自动切换到另一个文件。可通过-r
选项载入这些文件以进行分析和打印。-r
从给定的数据包文件中读取数据。使用-
表示从标准输入中读取。
过滤规则
IP地址过滤
tcpdump host 192.168.88.210
过滤IP地址
tcpdump src host 192.168.88.210
过滤源IP地址
tcpdump dst host 192.168.88.210
过滤目的IP地址
网段过滤
tcpdump net 192.168.88.0/24
根据网段进行过滤
tcpdump src net 192.168.88
根据源网段进行过滤
tcpdump dst net 192.168.88
根据目的网段进行过滤
端口过滤
tcpdump port 80
过滤特定端口
tcpdump src port 80
过滤源端口
tcpdump dst port 80
过滤目的端口
tcpdump portrange 8000-8080
过滤一个端口范围
协议过滤
tcpdump icmp
过滤icmp协议
tcpdump tcp
过滤tcp协议
tcpdump udp
过滤udp协议
tcpdump arp
过滤arp协议
tcpdump rarp
过滤rarp协议
tcpdump dns
过滤dns协议
tcpdump http
过滤http协议
tcpdump ether
过滤以太网协议
tcpdump wlan
过滤无线局域网协议
使用案例
以下是一些 tcpdump
的常见用法示例:
捕获所有网络流量:
sudo tcpdump -i <interface> 例: tcpdump -i eth0
用你的网络接口替换
<interface>
,例如eth0
或wlan0
。
指定抓包数量:
sudo tcpdump -i <interface> -c <count> 例:抓取100个包后停止 sudo tcpdump -i eth0 -c 100
这将捕获指定数量的数据包后停止。
保存捕获的数据包到文件:
sudo tcpdump -i <interface> -w <filename> 例:将抓取到的数据包保存到 /root/ 目录下的 testfile.pacp 文件里 sudo tcpdump -i eth0 -w /root/testfile.pacp
这将把捕获的数据包保存到指定的文件中。
显示捕获的数据包的十六进制和ASCII格式:
sudo tcpdump -X -i <interface> 例: sudo tcpdump -X -i eth0
过滤特定主机的流量:
sudo tcpdump -i <interface> host <hostname> 例: sudo tcpdump -i eth0 host 192.168.88.210
替换
<hostname>
为你想要过滤的主机名。
过滤特定端口的流量:
sudo tcpdump -i <interface> port <port> 例:抓取端口号为 8088 的数据包 sudo tcpdump -i eth0 port 8088
替换
<port>
为你想要过滤的端口号。
过滤源或目标IP地址:
sudo tcpdump -i <interface> src <source_ip> 例: 抓取源IP地址为 192.168.88.210 的数据包 sudo tcpdump -i eth0 src 192.168.88.210
或
sudo tcpdump -i <interface> dst <destination_ip> 例:抓取目标IP地址为 192.168.88.210 的数据包 sudo tcpdump -i eth0 dst 192.168.88.210
替换
<source_ip>
或<destination_ip>
为相应的IP地址。
过滤特定协议:
sudo tcpdump -i <interface> icmp 例:只抓取ICMP协议的数据包 sudo tcpdump -i eth0 icmp
或
sudo tcpdump -i <interface> tcp 例:只抓取TCP协议的数据包 sudo tcpdump -i eth0 tcp
替换
icmp
或tcp
为你想要过滤的协议。还支持http
、arp
、rarp
、dns
、udp
等协议。
过滤特定网络范围的流量:
sudo tcpdump -i <interface> net <network> 例:只抓取网段 192.168.88.0/24 的数据包 sudo tcpdump -i eth0 net 192.168.88.0/24
替换
<network>
为你想要过滤的网络地址。
显示捕获的数据包的详细信息:
sudo tcpdump -tttt -i <interface> 例: sudo tcpdump -tttt -i eth0
这将显示每个数据包的详细时间戳。
从 testfile.pacp 记录中读取tcp协议的数据包
sudo tcpdump -i <interface> <protocol> <option> -r <file.pacp> 例: sudo tcpdump -i eth0 tcp -vnn -r /root/testfile.pacp 输出内容结构: 21:26:49.013621 IP 192.168.88.1.15605 > 192.168.88.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
从上面的输出来看,可以总结出:
- 第一列:时分秒毫秒 21:26:49.013621
- 第二列:网络协议 IP
- 第三列:发送方的ip地址+端口号,其中 192.168.88.1 是 ip,而15605 是端口号
- 第四列:箭头 >, 表示数据流向
- 第五列:接收方的ip地址+端口号,其中 192.168.88.2 是 ip,而5920 是端口号
- 第六列:冒号
- 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面
使用逻辑关系过滤数据包
与 and && 或 or || 非 not ! 例:抓取源IP地址为 192.168.88.210 且 目的端口号是22的数据包(与) sudo tcpdump -i eth0 src host 192.168.88.210 and dst port 22 例:抓取源IP地址为 192.168.88.210 或 目的端口号是22的数据包(或) sudo tcpdump -i eth0 src host 192.168.88.210 or port 22 例:抓取源IP地址为 192.168.88.210 端口号不是22的数据包(非) sudo tcpdump -i eth0 src host 192.168.88.210 not port 22
这些只是一些 tcpdump
的基本用法示例。根据你的需求,你可以通过组合不同的过滤选项和标志来执行更复杂的分析。请记住,使用 tcpdump
需要具有足够的权限,通常需要使用 sudo
权限或管理员账号 root
。