参考: http://roclinux.cn/?p=2511
需要在root用户下使用,非root用户可用sudo。
tcpdump -i eth1 -nn -X port 8080 -c 1
-i:i 是interface的含义,是指我们有义务告诉tcpdump希望它去监听哪一个网卡。用ifconfig可以看到,一般不是eth0就是eth1。
-nn:是当tcpdump遇到协议号或端口号时,不要将这些号码转换成对应的协议名称或者端口名称。比如:21转化成FTP。
-X:让tcpdump把协议头和包的内容都显示出来,tcpdump会以16进制和ASCII两种形式显示,方便协议分析。
port 8080:让tcpdump监听我们关心的某个目的端口或源端口为8080的数据包,忽略其他端口。
-c:即为count,设置tcp抓包的数目,在这里设置为1,tcpdump只会抓一个数据包。
下面是示例:
上面是最普通的用法,下面介绍一些常用选项:
tcpdump可以分为三大部分内容,第一是选项,第二是过滤表达式,第三是输出信息
选项:
-e:增加以太网帧头部信息输出
示例:
如果没有加-e参数输出是这样的:
加上-e参数后:
好吧,不只是变长了。其实增加了许多以太网协议的信息。
为了理解增加的信息,我们可以来看一下以太网协议的头格式:
struct sniff_ethernet {
u_char ether_dhost[ETHER_ADDR_LEN]; /* 目的主机的地址 */
u_char ether_shost[ETHER_ADDR_LEN]; /* 源主机的地址 */
u_short ether_type; /* IP? ARP? RARP? etc */
};
-e选项的输出中,出现了oui Unknow的字样,其实OUI,及Organizationally unique identifer,是”组织唯一标识符“,在任何一块网卡(NIC)中烧录的6字节MAC地址中,前3个
字节体现了OUI,表明了NIC的制造组织。通常情况下,该标识符是唯一的。
-l:使得输出变为行缓冲
-l,不是-i,它的作用就是将”tcpdump“的输出变为”行缓冲“的方式,这样可以确保tcpdump遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于利用管道或重定向的方式进行后续处理。在linux系统中,它的标准I/O提供了全缓冲、行缓冲、无缓冲三种缓冲方式。标准错误不带缓冲,比如cerr之于cout,终端设备常为行缓冲,二其他情况默认都是全缓冲的。
在使用tcpdump时,对于tcpdump输出的内容,提取每一行的第一个域,即”时间域“并输出出来,为后续统计所用。这时就需要使用-l将默认的全缓冲变为行缓冲。
-t:输出时不打印时间戳
-v:输出更详细的信息
加了-v选项后,会有tos值,ttl值,id值,总长度,校验值等。
-F:指定过滤表达式所在的文件
tcpdump -i eth1 -nn -X port 8080 -c 1
其中port 8080就是过滤表达式,用于设置满足的抓包条件。
但是当这个过滤条件坟场复杂,或者想将一个过滤表达式多次使用,可以把过滤表达式存入一个文本文件中,就可以用-f选项。
举例,port 8080
-w:将流量保存到文件中
网络流量分析有一个共同的需求,那就是流量保存和流量回放。流量保存就是把抓到的网络包能存储到磁盘上,保存下来,
为后续使用。流量回放,就是把历史上某一时间段的流量,重新模拟回放出来,用于流量分析。
-w选项保存的都是二进制文件,我们是看不懂的。那么怎么看呢?看下面这个选项。
-r:读取raw packet文件
这个选项实际上就是靠文件中的内容对流量进行了回访,就好像回到之前重新开始抓包。
由于是按照raw packet存储的,所以完全可以通过-e -l等选项和过滤表达式对条件进行控制。
这样,我们之前用-w保存的文件就被还原出来了。