linux 下抓包工具tcpdump


Linux作为网络服务器,特别是作为路由器和防火墙时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——tcpdump。

显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数

tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
-n     不把网络地址转换成名字;
-nn      不进行端口名称的转换。
-t        在输出的每一行不打印时间戳
-vv    输出详细的报文信息;
-c     在收到指定的包的数目后,tcpdump就会停止
-e    在输出行打印出数据链路层的头部信息
-r    从指定的文件中读取包(这些包一般通过-w选项产生)
-w    直接将包写入文件中,并不分析和打印出来

tcpdump -i eth0 -n
tcpdump -i eth0 -nn -t -vv -c 500
tcpdump -i eth0  tcp -c 20  -t -nn -e

tcpdump  支持正则表达式
tcpdump利用正则作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。

表达式中的关键字
第一种是关于类型的关键字,主要包括host(默认),net,port
第二种是确定传输方向的关键字,主要包括src,dst ,dst or src(默认), dst and src
第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型,默认是监听所有协议,Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ';与运算是'and','&&';或运算是'or' ,'||';
这些关键字可以组合起来构成强大的组合条件来满足人们的需要
下面举例说明
tcpdump host 192.168.2.101 -c 50 -nn -t
tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
tcpdump tcp port 23 host 210.27.48.1

相关内容