tcpdump 高级过滤方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcpdump 高级过滤方式相关的知识,希望对你有一定的参考价值。

参考技术A

首先了解如何从包头过滤信息

操作符 : >, <, >=, <=, =, !=

​ 长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8 4),因此,一个IP包头的长度最长为“1111”,即15 4=60个字节。IP包头最小长度为20字节。

​ 16比特,以字节为单位描述IP包的总长度(包括头部和数据两部分),最大值为65535。第二行中标识符、标志和段偏移量通常联合使用,用于数据拆分时的分组和重组。

​ 对于上层发来的较大的数据包,往往需要拆分。路由器将一个大包进行拆分后,拆出来的所有部分被标上相同的值,该值即为标识符,用于告诉目的端哪些包属于同一个大包。

​ 长度3比特。该字段第一位不使用。第二位是DF(Don\'t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

​ 长度13比特,表示一个数据包在原先被拆分前的大包中的位置。接收端据此来还原和组装IP包。

​ 表示IP包的生存时间,长度8比特。长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。

​ 长度8比特,标识上一层即传输层在本次数据传输中所使用的协议。比如6代表TCP,17代表UDP等

​ 长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

​ 长度32比特,标识IP包的起源地址。

​ 长度32比特,表示IP包的目的地址。

​ 可变长字段,主要用于测试,由起源设备跟据需要改写。

​ 因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍

一般 的IP头是20字节,但IP头有选项设置,不能直接从偏移21字节处读取数据。IP头有个长度字段可以知道头长度是否大于20字节。

通常第一个字节的二进制值是:01000101,

分成两个部分:

如果第一字节第二部分的值大于5,那么表示头有IP选项。

下面介绍有过滤方法

**0100 0101 **: 第一字节的二进制
0000 1111 : 与操作
<=========
0000 0101 : 结果

正确的过滤方法:

或者

当发送端的MTU大于到目的路径链路上的MTU时就会被分片,分片信息在IP头的第七和第八字节:

Bit 0 : 保留,必须是0
Bit 1 : (DF) 0 = 可能分片, 1 = 不分片
Bit 2 : (MF) 0 = 最后的分片, 1 = 还有分片

Fragment Offset 字段只有在分片的时候才使用。

要抓带DF位标记的不分片的包,第七字节的值应该是:

01000000 = 64

最后分片包的开始3位是0,但是有Fragment Offset字段。

测试分片可以用下面的命令:

TTL字段在第九字节,并且正好是完整的一个字节,TTL最大值是255,二进制为11111111。

可以用下面的命令验证一下:

首先还是需要知道TCP基本结构

16位源端口号和16位目的端口号。

32位序号

​ 一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。

32位确认号

​ 用来响应TCP报文段,给收到的TCP报文段的序号加1,三握时还要携带自己的序号。

4位头部长度

​ 标识该TCP头部有多少个4字节,共表示最长15*4=60字节。同IP头部。

6位保留

​ 6位标志。URG(紧急指针是否有效)ACK(表示确认号是否有效)PSH(提示接收端应用程序应该立即从TCP接收缓冲区读走数据)RST(表示要求对方重新建立连接)SYN(表示请求建立一个连接)FIN(表示通知对方本端要关闭连接)

16位窗口大小

​ TCP流量控制的一个手段,用来告诉对端TCP缓冲区还能容纳多少字节。

16位校验和

​ 由发送端填充,接收端对报文段执行CRC算法以检验TCP报文段在传输中是否损坏。

16位紧急指针

​ 一个正的偏移量,它和序号段的值相加表示最后一个紧急数据的下一字节的序号。

标志位字段(U、A、P、R、S、F)

占6比特。各比特的含义如下:

TCP标记定义在TCP头的第十四个字节

tcpdump考虑了一些数字恐惧症者的需求,提供了部分常用的字段偏移名字:

ICMP类型值有

icmp-echoreply , icmp-unreach , icmp-sourcequench , icmp-redirect , icmp-echo , icmp-routeradvert , icmp-routersolicit , icmp-timxceed , icmp-paramprob , icmp-tstamp , icmp-tstampreply , icmp-ireq , icmp-ireqreply , icmp-maskreq , icmp-maskreply

TCP标记值

tcp-fin , tcp-syn , tcp-rst , tcp-push , tcp-push , tcp-ack , tcp-urg

这样上面按照TCP标记位抓包的就可以写直观的表达式了:

抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。

"GET "的十六进制是47455420

"SSH-"的十六进制是0x5353482D

tcpdump 协议过滤哪些协议

tcpdump 协议过滤
作为业界标准的捕获工具,tcpdump提供了强大而又灵活的包过滤功能。作为tcpdump基础的libpcap包捕获引擎支持标准的包过滤规则,如基于5重包头的过滤(如基于源/目的IP地址/端口和IP协议类型)。

tcpdump/libpcap的包过滤规则也支持更多通用分组表达式,在这些表达式中,包中的任意字节范围都可以使用关系或二进制操作符进行检查。对于字节范围表达,你可以使用以下格式:
proto [ expr : size ]

“proto”可以是熟知的协议之一(如ip,arp,tcp,udp,icmp,ipv6),“expr”表示与指定的协议头开头相关的字节偏移量。有我们熟知的直接偏移量如tcpflags,也有取值常量如tcp-syn,tcp-ack或者tcp-fin。“size”是可选的,表示从字节偏移量开始检查的字节数量。
使用这种格式,你可以像下面这样过滤TCP SYN,ACK或FIN包。
参考技术A 抓包命令tcpdumptcp-Aport22-wa.cap将报文内容存在a.cap里面。a.cap文件是2进制的,需要用ethreal工具专门读取。

以上是关于tcpdump 高级过滤方式的主要内容,如果未能解决你的问题,请参考以下文章

tcpdump 使用实例

tcpdump 正则过滤

tcpdump非常实用的抓包实例

tcpdump非常实用的抓包实例

tcpdump

tcpdump 协议过滤哪些协议