tcpdump(dump the traffic on a network)是一款在Unix下一款比较实用的一款用于分析数据包的工具,它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句、布尔表达式对报文的报头匹配,在Linux系统下如果未安装可以通过yum来安装,不过要注意的是在使用需要相应的权限:
对于SunOS的nit或bpf界面:要运行tcpdump,必须有
/dev/nit
或
/dev/bpf
*的读访问权限;
对于Solaris的dlpi:必须有网络仿真设备(networkpseudodevice),如
/dev/le
的读访问权限;
对于HP-UX的dlpi、IRIX的snoop、Linux:必须是root,或者把它安装成root的设置uid程序;
对于Ultrix和DigitalUNIX:一旦超级用户使用promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump;
对于BSD:必须有
/dev/bpf
*的读访问权限。
而tcpdump的常用选项参数如下:
-A 数据包内容以ASCII显示,通常用来抓取网页的数据包数据.
-a 试着把网络和广播地址转换成名称.
-c 监听数据包数,如果没有带这个参数tcpdump会不断的监听,当收到count报文后退出.
-d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出.
-
dd
把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出.
-ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出.
-e 显示数据链路层的数据包.
-f 用数字显示网际网络地址.
-F 指定内含表达方式的文件.
-i 监听的网络接口.
-l 使用标准输出列的缓冲区.
-n 不把主机的网络地址转换成ip
-N 不列出域名.
-O 不将数据包编码最佳化,这个选项只有当你怀疑优化器有bug时才有用.
-p 不让网络界面进入混杂模式.
-q 快速输出,仅列出少数的传输协议信息.
-r 从指定的文件读取数据包数据.
-s 设置每个数据包的大小.
-T 强制将表达方式所指定的数据包转译成设置的数据包类型.目前已知的类型有:rpc(远程过程调用RemoteProcedureCall),rtp
(实时应用协议Real-TimeApplicationsprotocol),rtcp(实时应用控制协议Real-TimeApplicationscontrol protocol), vat (可视音频工具
VisualAudioTool),和wb(分布式白板distributedWhiteBoard).
-S 用绝对而非相对数值列出TCP关联数.
-t 禁止显示时戳标志.
-tt 显示未格式化的时戳标志.
-
v
详细显示指令执行过程.例如,显示IP数据报中的生存周期和服务类型.
-vv 更详细显示指令执行过程.例如,显示NFS应答报文的附加域.
-w 把数据包数据写入指定的文件.
-x 以16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.
expression表达式:
用来选择要转储的数据报.如果没有指定expression,就转储网络的全部报文.否则,只转储相对expression为逻辑为真的数据包报文.
expression由一个或多个原语(primitive)组成.原语通常由一个标识(
id
,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:
type
类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,`hostfoo
',`net128.3'
,`port20'.如果不指定类型修饰子,就使用缺省的host.
dir
方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识). 可以使用的方向有src,dst,srcordst和src and dst.
例如,`srcfoo
',`dstnet128.3'
,`srcordstport
ftp
-data
'. 如果不指定方向修饰子,就使用缺省的srcordst. 对于`null'
链路层(就是说象slip之类的点到点协议),用inbound和outbound修饰子指定所需的传输方向.
proto 协议修饰子要求匹配指定的协议.可以使用的协议有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp 和 udp.
例如,`ethersrcfoo
',`arpnet128.3'
,`tcpport21
'. 如果不指定协议修饰子,就使用所有符合类型的协议.例如,`srcfoo'
指`(ip或arp或rarp)srcfoo
'(注意后者不符合语法),`netbar'
指`(ip或arp或rarp)netbar
', `port53'
指`(tcp或udp)
port53'.
更复杂的过滤器表达式可以通过and,or和not连接原语来组建.例如,`host foo and not port
ftp
and not port
ftp
-data'.
允许的原语有:
dsthosthost
如果报文中IP的目的地址域是host,则逻辑为真.host既可以是地址,也可以是主机名.
srchosthost
如果报文中IP的源地址域是host,则逻辑为真.
hosthost
如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:iphosthost
它等价于:
etherprotoipandhosthost
如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.
etherdstehost
如果报文的以太目的地址是ehost,则逻辑为真.Ehost既可以是名字(
/etc/ethers
里有),也可以是数字
ethersrcehost
如果报文的以太源地址是ehost,则逻辑为真.
etherhostehost
如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.
gatewayhost
如果报文把host当做网关,则逻辑为真.
dstnetnet
如果报文的IP目的地址属于网络号net,则逻辑为真.
srcnetnet
如果报文的IP源地址属于网络号net,则逻辑为真.
netnet
如果报文的IP源地址或目的地址属于网络号net,则逻辑为真.
netnetmaskmask
如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.
netnet
/len
如果IP地址匹配指定网络掩码的net,则逻辑为真.
dstportport
如果报文是ip
/tcp
或ip
/udp
,并且目的端口是port,则逻辑为真.
srcportport
如果报文的源端口号是port,则逻辑为真.
portport
如果报文的源端口或目的端口是port,则逻辑为真.
less
length
如果报文的长度小于等于length,则逻辑为真.它等同于:len<=length.
greaterlength
如果报文的长度大于等于length,则逻辑为真.它等同于:len>=length.
ipprotoprotocol
如果报文是IP数据报,其内容的协议类型是protocol,则逻辑为真.
etherbroadcast
如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.
ipbroadcast
如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.
ethermulticast
如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可选的.
ipmulticast
如果报文是IP多目传送报文,则逻辑为真.
总之tcpdump的使用还是可以满足日常的数据包分析使用的,如下以下一些例子:
监听来自eth0网卡且通信协议为ssh(缺省22端口)来源于192.168.2.100的数据包数据
[root@localhost~]
#tcpdump-ieth0-nn'port22andsrchost192.168.2.100'
截获主机192.168.1.100和主机192.168.2.100或192.168.0.100的通信
[root@localhost~]
#tcpdumphost192.168.1.100and(192.168.1.100or192.168.0.100)
截取本机的udp协议的ntp(缺省123端口)
[root@localhost~]
#tcpdumpudpport123
总之,在日常可以使用tcpdump来对各种数据包进行分析,在这里就不做过多的说明,需要更多tcpdump的使用可以看相关的man帮助手册,当然是用tcpdump对七层上数据没有做比较彻底的解码,所以平时也可把抓取的数据包写入文件后使用wireshark来进行进一步的分析
:http://www.linuxidc.com/Linux/2018-01/150038.htm
</=length.