前言
tcpdump是一个最基本重要的网络分析工具, 掌握好这个工具, 对于学习tcp/ip协议也是很有帮助的. 理解了tcp/ip协议栈的知识, 分析调优网络的能力才会更高. 所以使用tcpdump相比其它的工具, 更能帮我们理解协议.
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获
下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
了解如何使用Tcpdump来捕获感兴趣的数据包是一项必须掌控的基本功。
tcpdump 安装
可到“www.tcpdump.org”下载最新的Tcpdump源码包。
注意⚠️:
因tcpdump的运行需要pcap的支持,所以最好先行安装pcap软件包,另外还要注意软件的版本问题,建议按照网站上匹配的软件包tcpdump和pcap一同下载。

我们以最新版本tcpdump-4.9.2,libpcap-1.9.0为例:
在编译Tcpdump之前,应先确定pcap库(libpcap)已安装完毕。这个库是编译Tcpdump时所必需的。
安装过程非常简单:
tar -zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make
make install
该库已安装完毕,下面执行下面的命令来编译并安装Tcpdump:
tar -zxvf tcpdump-4.9.2.tar.gz
cd tcpdump-4.9.2
./configure
make
make install
Tcpdump的命令行选项
Tcpdump是个命令行方式的网络嗅探器。他通过使用命令选项来过滤网卡截获的数据包,假如不进行过滤,过多数量的包会使网络管理员很难理清头绪。Tcpdump的命令格式如下:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 数量 ] [ -C 文档尺寸 ] [ -F 文档名 ] [ -i 网络接口 ] [ -m 文档名 ] [ -r 文档名 ] [ -s 长度 ] [ -T 类型 ] [ -w 文档名 ] [ -E algo:secret ] [ 表达式 ]
表1 Tcpdump常用命令行选项
| 命令行 | 描述 |
|---|---|
| -a | 将网络地址和广播地址转变成容易识别的名字 |
| -d | 将已截获的数据包的代码以人容易理解的格式输出; |
| -dd | 将已截获的数据包的代码以C程式的格式输出; |
| -ddd | 将已截获的数据包的代码以十进制格式输出; |
| -e | 输出数据链路层的头部信息; |
| -f | 将internet地址以数字形式输出; |
| -l | 将标准输出变为行缓冲方式; |
| -n | 不将网络地址转换成易识别的主机名,只以数字形式列出主机地址(如IP地址),这样能够避免DNS查询; |
| -t | 不输出时间戳; |
| -v | 输出较周详的信息,例如IP包中的TTL和服务类型信息; |
| -vv | 输出详尽的报文信息; |
| -c | 在捕获指定个数的数据包后退出; |
| -F | 从指定的文档中读取过滤规则,忽略命令行中指定的其他过滤规则; |
| -i | 指定监听的网络接口; |
| -r | 从指定的文档中读取数据包(该文档一般通过-w选项产生); |
| -w | 将截获的数据包直接写入指定的文档中,不对其进行分析和输出; |
| -T | 将截获的数据包直接解释为指定类型的报文,现在支持的类型有cnfp、rpc、rtp、snmp、vat和wb。 |
表1给出了一些常用的Tcpdump命令行选项,使用这些选项能够过滤出真正感兴趣的数据包。
默认启动
sudo tcpdump
普通情况下,直接启动 tcpdump将监视第一个网络接口上所有流过的数据包。
监视指定网络接口的数据包
查看网卡名称:

tcpdump -i lo0
指定ip
例如截获所有192.168.131.131 的主机收到的和发出的所有的数据包
tcpdump host 192.168.131.131 -i lo0 (必须加上网卡名称)
抓取数据,保存为pcap文件(可用wireshark软件打开)
tcpdump tcp -i lo0 -t -s 0 -c 100 -w /tmp/target.pcap
监听指定的主机
tcpdump -i eth0 -nn 'host 192.168.168.2'
这样的话,192.168.168.2这台主机接收到的包和发送的包都会被抓取.
tcpdump -i eth0 -nn 'src host 192.168.168.2'
这样只有192.168.168.2这台主机发送的包才会被抓取。
tcpdump -i eth0 -nn 'dst host 192.168.168.2'
这样只有192.168.168.2这台主机接收到的包才会被抓取。
监听指定端口
tcpdump -i eth0 -nnA 'port 80'
上例是用来监听主机的80端口收到和发送的所有数据包,结合-A参数,在web开发中,真是非常有用。
监听指定主机和端口
tcpdump -i eth0 -nnA 'port 80 and src host 192.168.168.2'
多个条件可以用and,or连接。上例表示监听192.168.168.2主机通过80端口发送的数据包。
抓取特定目标ip和端口的包
tcpdump host 192.168.168.2 and tcp port 8000
使用tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
Wireshark
下载地址:www.wireshark.org/download/
使用
使用方法:jingyan.baidu.com/article/156…


一些常用的使用方法:常用语法规则
参考: 各种工具使用手册
然后我们就可以愉快的抓包了。