tcpdump 正则过滤

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 &

你可能感兴趣的:(tcpdump 正则过滤)