前言
作为网络开发人员来说Wireshark是最为流行的网络分析工具,可以捕捉网络中的数据报文,提供关于网络协议上的各种信息,一般在PC上的Windows、Linux等平台上应用。在嵌入式linux系统中由于硬件资源的限制,并且多数设备也不具备图形界面,无法使用Wireshark,但Linux下具有tcpdump这个强大的网络数据采集工具,通常我们可以使用tcpdump和Wireshark两者相结合的方式进行抓包分析。
tcpdump是基于Unix系统的命令行式的数据包嗅探工具(sniffer),可以抓取传输在网卡上的数据报文。从网络安全方面考虑,只有具备root权限的用户才可以执行tcpdump命令来获取网络上任何经过它的数据报文,即网卡的混杂模式,而普通用户无法看到网络上的数据报文。tcpdump可以使用BPF语言指定抓包过滤器以获取所需的数据报文,捕获后的数据报文存储为.cap格式,可直接用wireshark打开查看。
本文主要介绍如何使用tcpdump抓取数据报文,以及结合Wireshark进行数据分析的方法。
tcpdump安装
在LEDE发行版的配置界面中选择tcpdump选项,编译后会在bin/packages/mipsel_24kc/base
路径下生成tcpdump_4.9.2-1_mipsel_24kc.ipk、libpcap_1.8.1-1_mipsel_24kc.ipk,
其中 libpcap为tcpdump的依赖库,将ipk包添加至设备文件系统目录下进行安装。
opkg install libpcap_1.8.1-1_mipsel_24kc.ipk
opkg install tcpdump_4.9.2-1_mipsel_24kc.ipk
tcpdump语法
输入命令tcpdump开始捕获经过第一个网口的所有数据报文,在控制台上输出简要的信息,可增加-v或-vv后缀显示完整的报文信息,可针对网络协议、主机地址、端口等关键字以及and、or、not等逻辑语句过滤无用的报文信息。
tcpdump采用命令行方式,它的命令格式如下所示,包含了多种选项,如-c为收到指定数量的报文后停止捕获;-w为直接将捕获到的报文存储为路径下的文件;-expression为BPF语法编写的用于过滤报文的正则表达式(libpcap库中支持伯克利包过滤Berkeley Packet Filter语法),如果一个报文满足表达式的条件则会被捕获,如果未给出任何条件,则网络上所有的报文都会被捕获,如指明关键字 host 192.168.1.1则表明捕获192.168.1.1主机的报文。
主要选项说明:
-A:以ASCII编码打印每个报文(不包括链路层的头)
-a:将网络地址和广播地址转变成名字
-c:收到指定数量报文后停止捕获
-C:用于判断-w选项将报文写入的文件的大小是否超过该值,超过则新建文件(文件名后缀为1、2、3依次增加)
-d:将匹配信息包的代码以人们能够理解的汇编格式给出
-dd:将匹配信息包的代码以c语言程序段的格式给出
-ddd:将匹配信息包的代码以十进制的形式给出
-D:列出当前主机的所有网卡编号和名称,与选项-i配合使用
-e:在输出行打印出数据链路层的头部信息
-f:将外部的Internet地址以数字的形式打印出来
-F:从指定的文件中读取表达式,忽略其它的表达式
-i:监听指定网卡上的数据流,未指定则使用最小编号的网卡,选项-D查看设备网卡,linux 2.2 内核及之后的版本支持any网卡,用于指代任意网卡
-l:未使用-w选项,则将报文打印到标准输出终端(默认)
-n:显示ip地址,而不是主机名
-N:不列出域名
-O:不将数据包编码最佳化
-p:不让网络界面进入混杂模式
-Q:显示输入|输出|输入输出报文
-q:快速输出,仅列出少数的传输协议信息
-r:从指定的文件中读取包(这些包一般通过-w选项产生)
-s:指定抓包显示一行的宽度,-s0表示可按包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,由于ethernet MTU为1500字节,使用默认参数会导致包数据丢失
-S:用绝对而非相对数值列出TCP关联数
-t:在输出的每一行不打印时间戳
-tt:在输出的每一行显示未经格式化的时间戳记
-T:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议)
-v:输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv:输出详细的报文信息
-x/-xx/-X/-XX:以十六进制显示包内容
-w:不打印报文,直接写入文件中
-expression:过滤报文的表达式,包括类型关键字(host、net、port),传输方向关键字(src 、dst),协议关键字(fddi、ip、arp、rarp、tcp、udp),逻辑运算关键字(not、!、and、&&、or、||),以及gateway、broadcast、less、greater等。便于更直观显示,可在命令中将表达式以单引号包含,如tcpdump
-i eth0 'tcp and net 192.168.1.1 or host 192.168.1.100'
tcpdump应用
1)抓取eth0上主机192.168.1.100报文,抓到100个包后退出
tcpdump -i eth0 host 192.168.1.100 -c 100 -n
2)抓取eth0上主机192.168.1.1报文,抓到100个包后退出
tcpdump -i eth0 host 192.168.1.1 -c 100 -n
3)抓取主机192.168.1.1和除了主机192.168.1.100之外所有主机通信的数据包:
tcpdump -i eth0 host 192.168.1.1 and ! 192.168.1.100 -c 100 -n
4)抓取eth0上80端口的TCP报文,抓到100个包后退出
tcpdump -i eth0 port 80 and tcp -c 100 -n
5)抓取eth0上主机192.168.1.1接收的所有报文,抓到100个包后退出
tcpdump -i eth0 dst host 192.168.1.1 -c 100 -n
6)抓取eth0上网络192.168.1.100发送,主机192.168.1.1 接收的所有报文,抓到100个包后退出
tcpdump -i eth0 src net 192.168.1.100 and dst host 192.168.1.1 -c 100 -n
7)默认情况下tcpdump抓包结果显示在控制台,为了进一步进行数据分析,可使用-w命令将抓包结果存放在文件中,用Wireshark打开查看。
tcpdump -w /tmp/wireopen.cap
8)抓取eth0上所有tcp、udp、icmp包,此处使用or关联过滤条件
tcpdump -i eth0 tcp or udp or icmp
9)抓取设备上所有网卡的报文,可使用-D选项查看设备支持的网卡,any为虚拟设备表示捕获所有的网卡报文
tcpdump -D
tcpdump -i any
4、 Wireshark查看
将存储在linux文件系统下的.cap文件通过winscp工具下载到本地,通过Wireshark工具可打开查看。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。