前言作为网络开发者,Wireshark是最流行的网络分析工具,可以抓取网络中的数据包,提供网络协议的各种信息,一般在平台上使用例如PC上的Windows和Linux。在嵌入式linux系统中,由于硬件资源的限制,而且大部分设备没有图形界面,无法使用Wireshark,而tcpdump是Linux下强大的网络数据采集工具。通常我们可以使用tcpdump和Wireshark结合的方式来抓包分析。tcpdump是一个基于Unix系统的命令行包嗅探工具(sniffer),可以抓取网卡上传输的数据包。从网络安全的角度来看,只有root权限的用户才能执行tcpdump命令来获取网络上经过它的任何数据包,即网卡的混杂模式,普通用户是看不到网卡上的数据包的。网络。tcpdump可以使用BPF语言指定一个抓包过滤器来获取需要的数据包,抓取到的数据包以.cap格式存储,可以直接用wireshark打开查看。本文主要介绍如何使用tcpdump抓取数据包,以及结合Wireshark进行数据分析的方法。在LEDE发布版本的配置界面选择tcpdump选项安装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包添加到设备文件系统安装目录。opkginstalllibpcap_1.8.1-1_mipsel_24kc.ipkopkginstalltcpdump_4.9.2-1_mipsel_24kc.ipktcpdump语法输入命令tcpdump开始抓取所有通过第一个网口的数据包,并在控制台输出简要信息,可以加-v或-vvsuffix显示完整的消息信息,可以过滤网络协议、主机地址、端口等关键字和and、or、not等逻辑语句的无用消息信息。tcpdump使用命令行方式,其命令格式如下,其中包含多种选项,如-c表示接收到指定数量的数据包后停止捕获;-w将捕获的数据包直接存储为路径文件下的文件;-expression是用BPF语法写的用于过滤数据包的正则表达式(libpcap库中支持BerkeleyPacketFilter语法),如果数据包满足表达式的条件,则捕获,如果不给定任何条件,则所有数据包网络上的都会被抓包,比如指定关键字host192.168.1.1,表示抓包192.168.1.1主机的包。主要选项说明:-A:以ASCII码打印每条消息(不包括链路层的包头)-a:将网络地址和广播地址转换成名称-c:接收到指定数量的消息后停止捕获-C:用于判断-w选项写入的文件大小是否超过这个值,如果超过这个值,则新建一个文件(文件名的后缀为1、2、3会依次递增)-d:匹配信息包的代码将以人类可读的方式给出可理解的汇编格式-dd:匹配信息包的代码以c语言程序段的格式给出-ddd:匹配信息包的code以十进制形式给出-D:列出当前主机的所有网卡号和名称,与选项-i配合使用-e:在输出行打印出数据链路层的包头信息-f:以数字形式打印出外部互联网地址-F:从指定文件模式中读取表达式,忽略其他表达式-i:监听指定网卡上的数据流,如果不指定,则使用指定网卡上的数据流最小数字,选项-D查看设备网卡,linux2.2内核及以后版本支持任意网卡,用于指代任意网卡-l:如果不使用-w选项,将信息打印到标准输出终端(默认)-n:显示ip地址而不是主机名-N:不列出域名-O:不对数据包进行最佳编码-p:不让网络接口进入混杂模式-Q:显示input|output|输入输出数据包-q:快速输出,只列出几个传输协议信息数据包一般由-w选项生成)-s:指定抓包的线宽,-s0表示显示完整的数据包根据数据包长度,经常和-A一起使用,默认拦截长度是60字节,由于以太网MTU是1500字节,使用默认参数会导致数据包丢失-S:列出数据包的个数使用绝对值而不是相对值的TCP关联-t:不在每行输出上打印时间戳-tt:在每行输出上显示未识别的格式化时间戳-T:直接将监视的数据包解释为指定类型的消息,常见types有rpc(remoteprocedurecall)和snmp(simplenetworkmanagementprotocol)-v:输出稍微详细一点的信息,比如ip包中可以包含ttl和服务类型信息-vv:输出详细的报文信息-x/-xx/-X/-XX:以16进制显示包内容-w:不打印消息,直接写入文件-expression:过滤消息的表达式,包括type关键字(host,net,port),传输方向关键字(src、dst)、协议关键字(fddi、ip、arp、rarp、tcp、udp)、逻辑运算关键字(not、!、and、&&、or、||)、gateway、broadcast、less、greater等方便更直观的展示。可以在命令中将表达式用单引号括起来,例如tcpdump-ieth0'tcpandnet192.168.1.1orhost192.168.1.100'tcpdumpapplication1)抓取eth0上的主机192.168。1.100个包,抓到100个包后退出tcpdump-ieth0host192.168.1.100-c100-n2)从eth0上的主机抓取192.168.1.1包,抓到100个包后退出tcpdump-ieth0host192.168。1.1-c100-n3)抓取主机192.168.1.1和除主机192.168.1.100以外的所有主机通信的数据包:tcpdump-ieth0host192.168.1.1and!192.168.1.100-c100-n4)在80端口抓取eth0TCP数据包,捕获100个数据包后退出tcpdump-ieth0port80andtcp-c100-n5)在eth0上捕获主机192.168.1.1收到的所有数据包,之后退出capturing100packetstcpdump-ieth0dsthost192.168.1.1-c100-n6)捕获eth0上network192.168.1.100发送,host192.168.1.1接收的所有数据包,捕获100个数据包后退出tcpdump-ieth0srcnet192.168.1.100anddsthost192.168.1.1-c100-n7)默认情况下,控制台会显示tcpdump的抓包结果。进一步的数据分析,可以使用-w命令将抓包结果保存到文件中,然后用Wireshark打开查看。tcpdump-w/tmp/wireopen.cap8)抓取eth0上所有的tcp、udp、icmp包,这里使用或者关联过滤条件tcpdump-ieth0tcporudporicmp9)抓取设备上所有网卡的包,可以使用-D选项查看设备支持的网卡,any是一个虚拟设备,捕获所有网卡数据包。tcpdump-Dtcpdump-iany4.用Wireshark查看通过winscp工具将linux文件系统中存放的.cap文件下载到本地,用Wireshark工具打开可以查看。
