前言
tcpdump
是一个最基本重要的网络分析工具, 掌握好这个工具, 对于学习tcp/ip协议也是很有帮助的. 理解了tcp/ip协议栈的知识, 分析调优网络的能力才会更高. 所以使用tcpdump
相比其它的工具, 更能帮我们理解协议.
用简单的话来定义tcpdump
,就是:dump the traffic on a network
,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump
可以将网络中传送的数据包的“头”完全截获 下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not
等逻辑语句来帮助你去掉无用的信息。
了解如何使用Tcpdump来捕获感兴趣的数据包是一项必须掌控的基本功。
tcpdump 安装
可到“”下载最新的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./configuremake make install复制代码
该库已安装完毕,下面执行下面的命令来编译并安装Tcpdump:
tar -zxvf tcpdump-4.9.2.tar.gz cd tcpdump-4.9.2 ./configuremakemake 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
下载地址:
使用
使用方法:
打开我们之前保存的文件。一些常用的使用方法:
参考:
然后我们就可以愉快的抓包了。