当前位置:首页 > 技术与方案 > 安全防范相关

如何使用Tcpdump监视网络

(2012-09-20 07:28:48)

Tcpdump通过将网络接口设置成混杂模式来截获经过它的每一个分组,供网管员进行入侵检测分析,从而达到监控网络的目的。tcpdump是每个网络管理员都必须掌握的经典工具,它支持包括Win32在内的几乎所有平台,和它类似的工具有Solaris 2.x上的snoop和AIX3.2.2上的iptrace。
Tcpdump的工作原理
tcpdump接收从底层过滤程序上传的分组,并按指定格式打印出来。如下图展示了BSD分组过滤器BPF向tcpdump传递分组的过程。BPF将以太网设备驱动程序设置为混杂模式,驱动程序每接收或发送一个分组,都会将分组的一个拷贝传给BPF。BPF根据上层用户进程设置的过滤规则对分组进行过滤,并上传满足条件的分组,其余分组被丢弃。看下面的例子:
$tcpdump -i le0 port 21
BPF只将通过le0网络接口的ftp数据分组上传给用户进程。事实上,tcpdump并未直接使用BPF,而是调用libpcap库函数,libpcap封装了不同平台下的分组过滤器。
Tcpdump的编译和安装
tcpdump和libpcap都可以从GNU的相关站点上下载,也可以从jq75.top263.net上下载。由于tcpdump使用了libpcap函数库,所以应该先安装libpcap。进入解压缩后的源代码目录,以root身份依次执行命令(./configure;make;make install)即可完成,执行make uninstall可以卸载libpcap函数库。在Solaris下安装时,若提示“lex insufficient”,需要安装另外两个GNU软件bison和flex。tcpdump的安装和libpcap的命令完全一样,make install后,tcpdump命令被复制到/usr/local/sbin下。
Tcpdump的参数选项
tcpdump是一个非常复杂的命令,要用它捕获到你真正感兴趣的分组,必须对它的选项和参数进行细致的研究。下面列出了tcpdump的完整格式:
tcpdump  [ -adeflnNOpqRStvxX ] [ -b protocol ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ][ -s snaplen ] [ -T type ][ -w file ] [ -u username ] [ expression ]
它的参数选项可以分为三大类:[ -adeflnNOpqRStvxX ]为无参数选项,[ expression ]为过滤表达式,其它为有参数表达式。下面对一些常用的选项进行介绍。
1.无参数选项
-e  指定在每一个输出行前面加上链路层的头部信息,如物理地址;
-l 缓冲tcpdump的第个输出行,在查看输出数据并重定向时使用;
-n  不把主机地址转换成主机名,免去了逆向DNS地址解析;
-nn 不把端口号转换成服务名,如不把7转换成echo,不把13转换成daytime;
-N 不打印FQDN,如只打印nic而不是nic.ddn.mil;
-p  不让接口进入混杂模式,缺省时让接口进入混杂模式;
-R 使用原始套接口,在同时使用多个接口时使用;
-S  打印绝对的TCP顺序号,而不是相对的;
2.有参数选项
-c count 指定在收到count个分组后退出tcpdump;
-r file 从二进制文件file中读取分组,缺省从网络接口上读取。file文件是通过-w file生成的,若减号(-)时,从stdin读取;
-s snaplen 截取分组的前snaplen个字节,而不是缺省的68个字节,除非你想获得更多的分组信息,否则不必显式指定snaplen; 
-u username 以username身份运行tcpdump,而不是缺省的root;
-w file 把分组写入文件供以后分析,而不是打印到stdout;file可以被-r再用,减号(-)代表stdout;
3.过滤表达式
过滤表达式指定了要捕获什么样的分组。若tcpdump命令带有过滤表达式,则只有满足表达式的分组才被捕获,若未带过滤表达式,则捕获网络上的所有分组。过滤表达式由若干个原语表达式通过and(&&), or(||), not(!)组合而成,每个原语表达式又由一个关键字和一个限定参数组成。在tcpdump -i le0 port 21命令中,port 21是过滤表达式,它由一个原语表达式port 21组成,其中port是关键字,21是限定参数。
使用tcpdump监测网络活动
1.捕获ARP地址解析分组:
$arp -a # 显示ARP缓存(h29 (211.68.68.29) at 00:00:e2:44:2a:c5)
$arp -d h29 # 删除ARP缓存中h29入口
$tcpdump -t -e arp host h29& # 捕获ether proto arp分组
$ping h29  # 在211.68.68.29/42上ping主机h29
在211.68.68.29/42主机上运行的tcpdump打印如下信息:
0:0:0:50:c7:53 Broadcast arp 60: arp who-has h29 tell h42
0:0:e2:44:2a:c5  0:0:0:50:c7:53 arp 60: arp reply h29 is-at 0:0:e2:44:2a:c5
第一行MAC地址为0:0:0:50:c7:53的主机h42广播一个“谁知道h29的MAC地址,请告诉h42”的ARP请求。第二行,MAC地址为0:0:e2:44:2a:c5的主机h29对ARP请求作出回应“h29的MAC地址是0:0:e2:44:2a:c5”。
2.捕获从其它主机发往本地主机的TCP会话分组,即设置了SYN和FIN的TCP分组
$tcpdump -t -n 'tcp[13] & 3 != 0 and not src and dst localhost'
tcp[13]&3!= 0表示TCP首部的第14个字节的最后两位(SYN和FIN)都为1。在211.68.68.42/26主机(运行着FTP服务器)上执行以上命令,从211.68.68.60/26主机上通过LeapFTP建立到211.68.68.42/26的连接时,tcpdump打印如下信息:
211.68.68.60.1543 > 211.68.68.42.21: S 1448951446:1448951446(0) win 16384 (DF)
211.68.68.42.21 > 211.68.68.60.1543: S 761867781:761867781(0) ack 1448951447 win 17520 (DF)
第一行表示从211.68.68.60/26的1543端口上给211.68.68.42/26主机的21号端口发送一个分组;S表示SYN;第一个1448951446表示起始序号,第二个1448951446表示终止序号,由于起始序号和终止序号相同,所有没有数据,(0)表示没有数据;win后面的值16384表示发送窗口大小;mss后面的值1460表示最大段大小;行尾的(DF)表示IP数据分组没有被分片。
第二行表示211.68.68.42/26主机从21号端口给211.68.68.60/26的1543端口发送一个SYN ack回应,1448951447数字表示是对211.68.68.60/26中1448951446分组的响应。当211.68.68.60/26主机关闭FTP连接时,tcpdump打印如下信息:
211.68.68.42.21 > 211.68.68.60.1571: F 1009:1009(0) ack 116 win 17520 (DF) [tos 0x10]
211.68.68.60.1571 > 211.68.68.42.21: F 116:116(0) ack 1010 win 16512 (DF)
F表示FIN,关闭连接双方的套接口对对对方的FIN分组进行确认。
3.捕获从vr0网络接口上通过的多播数据分组
对于IPv4的多播分组,以太网头部的三个字节总是01:00:5e,且使用D类(224.0.0.0到239.255.255.255)多播地址,所以tcpdump命令为:
$tcpdump -i vr0  ' ether[0] & 1 = 1 and ip[16]>=224 '
在211.68.68.60/26主机上ping代表所有主机的多播地址224.0.0.1时,tcpdump打印如下信息:
06:58:29.973506 211.68.68.60 > ALL-SYSTEMS.MCAST.NET: icmp: echo request
4.根据特征端口检测特洛伊木马
木马程序在宿主计算机上的监听特定的端口,为控制程序开了一个后门。控制程序通过给这些端口发送命令来达到操纵远程主机的目的。“冰河”是Win32平台下一个较流行的木马程序,它的特征端口是7626,通过如下命令可以检测到网关gw上是否有“冰河”的控制分组通过:
$tcpdump 'gateway gw and port 7626'
OICQ的服务器监听的端口是8000,通过如下命令可以检测到网关gw上是否有OICQ的会话分组通过(即本地局域网内是否有人在聊天):
$tcpdump 'gateway gw and port 8000'
可以使用-w file选项将tcpdump输出写到一个二进制文件out,其格式只有-r file选项才能识别:
$tcpdump -w out host belios and ( hot or ace )  #使用转义符屏蔽shell
若要在查看tcpdump输出的同时,重定向到文件tcpdump.out,可使用如下命令:
$tcpdump -l | tee tcpdump.out
总之,tcpdump的功能非常强大,通过合理地构造过滤表达式,就能捕获到你感兴趣的网络分组。
 

1作者:经 乾 


 

更多
关闭窗口 打印 
网站首页    -    联系我们    -   收藏本站    -    网站地图                                                               客户服务热线:0571-85023000
本网站所有网页信息已申请知识产权和著作权保护,版权归四海光纤公司所有,未经授权禁止任何人复制或镜像,违者必究。
公司主营:杭州光纤光缆视频会议系统,是专业的通信网络工程、视频会议系统建设专家

中华人民共和国备案号:浙ICP备10018243号