tcpdump采用命令行方式,它的命令格式为:
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ]
功能选项说明:
-a 将网络地址和广播地址转变成名字
-d 将匹配数据包的内容以易理解的汇编格式输出
-dd 将匹配数据包的内容以语言程序段的格式输出
-ddd将匹配数据包的内容以十进制形式输出
-e在输出行打印出数据链路层的头部信息
-f 将外部的internet以十进制数字形式打印输出
-l使标准输出变为缓冲行形式
-n不把地址(主机地址、端口)的数字形式转换成名字
-t在输出的每一行不打印时间戳
-vv输出详细的报文信息
-v输出较详细的信息
-c指定要接收的数据包的数量接收到的数量达到后就会停止接收
-F从指定的文件中读取表达式忽略其他的表达式
-i指定要监听的网络接口
-r从指定的文件中读取数据包这些包是通过选项保存得到的
-w直接将数据包写入指定的文件中不分析和打印输出
-T将监听到的包直接解释为指定类型的报文,常用的类型有远程过程调用和简单网络管理协议
-s指定抓取数据的长度,采用了默认长度为68或96字节,-s0则表示没有长度的限制。如果没有这个设置,通常会抓包会显示Packet size limited during capture,这样数据包会被截断,是不全的。
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。实际上,tcpdump的表达式主要包括三种类型的关键字
包类型关键字
主要包括host,net,port,其中host用于表示网络上一台主机,net 用于表达式一个网络地址,port用于指定端口号,若表达式缺省若没有类型,默认类型为host。
如想要截获所有192.168.90.16与本机的交互数据包,只需在本机上执行如下命令
[root@test24267 ~]# tcpdump host 192.168.90.16 | more
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
4 packets captured
5 packets received by filter
0 packets dropped by kernel
Linux系统中,tcpdump默认收集从系统接口列表中搜寻到的编号(eth*)最小的已配置好的接口上的发送接收数据包。若没有找到,则会报错:
tcpdump: NFLOG link-layer type filtering not implemented
传输方向的关键字
主要包括src,dst,src or dst,src and dst,这些关键字指明了传输的方向,默认为src or dst。如
[root@test24267 ~]# tcpdump src 192.168.90.16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:36:14.221553 IP 192.168.90.16.50982 > localhost.ssh: . ack 1966953710 win 255
10:36:14.430570 IP 192.168.90.16.50982 > localhost.ssh: . ack 133 win 254
10:36:14.435741 IP 192.168.90.16.50982 > localhost.ssh: P 0:52(52) ack 249 win 254
10:36:14.644771 IP 192.168.90.16.50982 > localhost.ssh: . ack 381 win 253
10:36:14.863178 IP 192.168.90.16.50982 > localhost.ssh: . ack 497 win 253
可以看到只抓取了源为192.168.90.16的单向的数据包。
协议关键字
包括fddi,ip,arp,rarp,tcp,udp,imcp等,默认监听所有协议的信息包。fddi是分布式光纤数据接口网络上所使用的网络协议。
除了这三种类型的关键字外,还有其他重要的关键字,如:gateway,broadcast,less,greater,还有三种逻辑运算,取非运算是'not'、'!',与运算符是'and'、'&&'、或运算符是'or'、'||',这些关键字可以组合起来构成强大的组合条件来满足我们的需求。
下面举几个例子来说明。
想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
在正则表达式中括号需要使用转义字符\来表达。
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp and port 23 and host 210.27.48.1
Telnet使用tcp协议,应用层为23端口。
获取主机210.27.48.1接收或发出的icmp包
#tcpdump -i eth0 icmp and host 210.27.48.1
ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。
抓取网口eth0上源mac地址或目的mac地址为00:21:85:6C9:A3的所有数据包,
#tcpdump -i eth0 ether src or dst 00:21:85:6C9:A3
注意,这里的mac地址格式必须以':'分隔。
我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0 gateway Gatewayname
捕获有TCP标记的包
1、捕获所有的SYN包:tcpdump 'tcp[13] & 2 !=0'
[root@localhost ~]# tcpdump 'tcp[13] & 2 !=0' -i em1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes
20:06:52.103251 IP 10.255.255.93.52312 > 10.255.242.67.6379: Flags [S], seq 158892324, win 14600, options [mss 1460,sackOK,TS val 614181197 ecr 0,nop,wscale 7], length 0
20:06:52.103450 IP 10.255.242.67.6379 > 10.255.255.93.52312: Flags [S.], seq 795652737, ack 158892325, win 5792, options [mss 1460,sackOK,TS val 1354263797 ecr 614181197,nop,wscale 7], length 0
#捕获所有的ACK包
tcpdump 'tcp[13] &16 !=0'
#捕获所有的SYN-ACK包
tcpdump 'tcp[13] = 18'
#捕获所有的FIN包
tcpdump 'tcp[13] &1 !=0'
#捕获所有的RST包
tcpdump 'tcp[13] &4 !=0'
#抓取端口大于1024的tcp数据包
tcpdump –i eth* ‘tcp[0:2]>1024’
这些命令可以与其他过滤项组合使用。
后台抓包,控制台退出也不会影响:
nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap &