美文网首页
tcpdump 正则过滤

tcpdump 正则过滤

作者: mysimplebook | 来源:发表于2020-01-17 20:09 被阅读0次

    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 正则过滤

          本文链接:https://www.haomeiwen.com/subject/iwrhzctx.html