转载自:http://blog.csdn.net/zrzlj/article/details/6076219/linux
1. Wireshark与tcpdump介绍编程
Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我通常只在Windows平台下使用Wireshark,若是是Linux的话,我直接用tcpdump了,由于我工做环境中的Linux通常只有字符界面,且通常而言Linux都自带的tcpdump,或者用tcpdump抓包之后用Wireshark打开分析。windows
在Windows平台下,Wireshark经过WinPcap进行抓包,封装的很好,使用起来很方便,能够很容易的制定抓包过滤器或者显示过滤器,具体在下面介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。浏览器
tcpdump是基于Unix系统的命令行式的数据包嗅探工具。若是要使用tcpdump抓取其余主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何通过它的数据包,无论这个数据包是否是发给它或者是它发出的,点击【http://en.wikipedia.org/wiki/Promiscuous_mode】获取更多有关混杂模式的资料。通常而言,Unix不会让普通用户设置混杂模式,由于这样能够看到别人的信息,好比telnet的用户名和密码,这样会引发一些安全上的问题,因此只有root用户能够开启混杂模式,开启混杂模式的命令是:ifconfig eth0 promisc, eth0是你要打开混杂模式的网卡。确定有人要问若是在windows下要不要打开混杂模式,windows下网卡没有什么混杂模式不混杂模式,在于应用程序自己,如使用Wireshark抓包的时候能够经过设置为在混杂模式下抓包(这就是为何该死的ARP欺骗病毒能够猖狂的缘由)。tcpdump固然也能够指定抓包过滤器,并且其过滤器语言很是著名,叫作Berkeley包过滤,简称BPF语言。安全
2. 简单的例子服务器
咱们经过访问www.google.com.hk这个网址来看看抓包结果。网络
2.1 tcpdumptcp
前面说过通常状况下Linux都自带了tcpdump,可是若是发生了小几率事件,发现没有tcpdump的话,能够到http://www.tcpdump.org下载源代码,编译安装。编程语言
使用root用户登陆,运行tcpdump命令就能够开始抓包。这里说明一下,若是使用SSH登陆到远程Linux,而后直接运行tcpdump,会发现抓到大量的数据包,速度快的都看不清楚,这是由于tcpdump抓到的包发送给远程的终端显示,同时又抓了这个包,再显示,再抓取,形成了循环抓取。固然,这样抓包没有任何意义,除了证实你的网络是通的。工具
由于没有打开网卡的混杂模式,因此若是本机没有任何进程访问网络,是抓不到包的,若是在字符界面下,用wget http://www.google.com.hk 访问网址,若是有GUI,能够打开firefox浏览器访问http://www.google.com.hk。
默认状况下,tcpdump会选择第一块网卡,也就是eth0,进行抓包,每行显示一个抓取的数据包,如:
0.003183 192.168.21.137 72.14.203.147 TCP 38039 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=36941509 TSER=0 WS=6
0.011707 72.14.203.147 192.168.21.137 TCP http > 38039 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460
0.011770 192.168.21.137 72.14.203.147 TCP 38039 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
以上三个数据包就是著名的TCP三次握手的数据包,其中38039是客户端的TCP端口,http的默认端口是80,若是tcpdump在/etc/services中发现端口对应的服务名称,那么会自动的转为名字,因此这里会显示为http。表示客户端的38039端口和服务器端的http端口进行TCP三次握手。
前面提到tcpdump默认选择第一块网卡进行抓包,咱们可使用-i参数指定经过哪个网卡抓包,如(#表示我输入的命令,Linux下root用户的提示符就是#):
# tcpdump –i eth1
或者
#tcpdump –i any
若是想知道咱们能够经过哪几个网卡抓包,可使用-D参数,如:
# tcpdump –D
1.eth0
2.any
3.lo
由于个人机器上只有一个网卡,所以只有eth0,若是有多块网卡活动的话,会有eth1,eth2依次下去。any的意思是经过任意一块网卡进行抓包,lo是回环接口。(关于TCP三次握手和回环接口等网络问题,请参考《TCP/IP协议详解》)。
默认状况下,tcpdump抓包结果显示在屏幕(严格点,专业点应该说是标准输出)上,显然这不利于进一步的数据分析,所以咱们须要将抓包结果存放在文件中。但是使用-w命令将结果保存在文件中,如:
#tcpdump –w google.cap
这句命令将抓包结果存放在google.cap文件中,结束之后能够用Wireshark打开查看。同事,tcpdump出了抓包,还可使用-r参数制定抓包数据文件,结合过滤器对抓包数据分析,如:
#tcpdump –r google.cap http
这句命令的意思是让tcpdump读取google.cap文件,把其中http协议的数据包都给过滤出来。关于过滤器在下面详细介绍。
2.2 Wireshark
我在windows系统中使用Wireshark的,首先熟悉一下界面,图1是使用Wireshark打开google.cap文件的界面,
图1 Wireshark界面
图1中标注出三快区域,R1区域用来显示简单的数据包信息,咱们用tcpdump抓包的时候,默认状况下也是显示成这样的;R2区域用来显示选中的数据包的详细信息,细心一点会发现他是按照TCP/IP四层结构显示的,第一行是数据链路层的信息,第二行是网络层信息(IP协议),第三行是传输层信息(TCP协议),第四行是应用层信息(HTTP协议),能够展开每一行用来观察具体的内容;R3区域是用来显示此数据包的真实面目。咱们在R1和R2区域看到的信息都是Wireshark整理之后给咱们看的,抓包的真实数据其实是一堆二进制序列,用ultraedit打开google.cap文件能够看到就是一些数字,如图2所示。
图2 抓包文件长的样子
使用Wireshark抓包很是容易,直接点击按钮(工具栏第三个按钮)(工具栏第一个按钮)就开始抓包了,会发现只要一点击这个按钮,马上就显示抓到包了,这是由于Wireshark默认在混杂模式下抓包,只要通过网卡的数据包都抓取下来(固然这台机器要连在网络中,若是没有数据流过固然没有包可抓),点击按钮中止这次抓包。
若是机器上安装了多块网卡,Wireshark默认选择第一张网卡抓包,若是等抓包完成了,这是发现选错了网卡是一件极度郁闷的事情。点击按钮能够在抓包以前选择抓哪张网卡。
图3 选择网卡
我机器上只有一张网卡,另外两个是安装Vmware时的虚拟网卡,能够看到虽然Packets上面已经有数据了,实际上须要点击Start才开始抓包。
解决了选择网卡的问题之后,考虑若是过滤抓包内容,点击菜单栏上的” Capture” > “Options”能够看到制定抓包规则的界面,如图4所示。
图4 制定抓包规则
图4能够看到Caputre packets in promiscuous mode,默认是选中的,表示Wireshark默认在混杂模式下抓包。一样能够选择经过哪张网卡抓包,不过这些都不是重点,最重要的是Caupture Fileter这里,点击该按钮,能够看到弹出一些预约义好的过滤器。好比选择“HTTP TCP port(80)”,下面Filter string: tcp port http就是过滤器的表示。表示抓tcp协议的,端口为80的数据包(http协议的默认端口是80)。
3. 过滤器(BPF语言)的使用
主要介绍一下在tcpdump中的过滤器使用,由于懂了这个就能够驾轻就熟的使用wireshark了。
从最简单的开始,BPF语言主要有一个标志或者数字和限定词组成,限定词有三种:
第一种:指定类型
host, 定义抓取哪一个IP地址(也能够给它mac地址,格式是00:00:00:00:00:00)的数据包,好比我想抓有关192.168.0.148这个IP地址的数据包,那么就写成tcpdump host 192.168.0.148, host是限定词,192.168.0.148就是标志。这条命令会抓取从发出或者向192.168.0.148发送的数据包。
net, 定义抓取某个网络的数据包,给出网络号就好了,它根据给的网络号字节数是1,2,3来判断A类地址,B类地址或者C类地址,好比tcpdump net 10.1.1 ,它就认为这是一个C类地址。
port,指定端口,好比tcpdump host and port 22, 这是抓端口为22的数据包,不论是TCP仍是UDP的,这里我稍微早一点的给出了逻辑操做,and J,若是只想抓TCP的,那么能够写tcpdump host 192.168.0.148 and tcp port 22。
portrange,顾名思义,这个是指定端口范围的,用连字符”-”指定范围,好比tcpdump port 1025-8080
第二种:指定方向
咱们以前的命令都是说“这条命令会抓取从192.168.0.148发出或者向192.168.0.148发送”,因此,若是指向抓从发出的数据包可使用限定词src, 命令:tcpdump src host 192.168.0.148,反过来,想抓发向192.168.0.148的数据包,使用限定词dst,命令:tcpdump dst host 192.168.0.148。
第三种:指定协议
咱们知道网络协议有N种。。。我列一下经常使用的几种,其余的能够去google一下J
ether和fddi, 以太网协议
tr, TR协议
ip, IP协议
ip6, IPv6协议
arp, ARP协议
好了,最后还须要注意的是逻辑运算,and, or, not(与,或,非),上面已经有一个例子了, 这里就再也不罗嗦了,和普通的编程语言没有什么不一样。
除此以外,还有更加牛X的功能,好比指定TCP中的某个标识位是什么,这种应用我通常不多用,再也不罗嗦了。