Virtual Network—tcpdump抓包高阶用法
前言
tcpdump 是网络抓包的常用工具,基本的使用都已经很熟悉了,本篇主要记录tcpdump 的高阶用法,旨在应用于vxlan、gre、ipip等类型封装报文,大流量场景下精确抓包过滤条件,保证环境安全 等场景;
封装报文的抓包过滤
在现在SDN 定义网络大行其道的今天,各种overlay 虚拟网络下,报文的封装,外层、内层报文已经是非常常见的场景了,这对我们抓包就提出了要求,在一般云网络运维场景下,外层报文都是物理机(宿主机)的ip地址,实际通信的源/目的地址 都是被封装到了内层报文中,这样在使用tcpdump 进行过滤抓包的时候,如果选择使用外层报文ip 进行过滤,则会抓取到近乎全部的流量,对于大流量节点,这个行为是不可接受的,很容易对服务器产生过大压力,影响性能。
目前比较常见的封装报文的技术有VxLAN和隧道(gre、ipip等),其中vxlan是通过udp协议进行封装的,隧道方式是通过ip层封装的;具体的封装原理和报文样式 这里就不描述了,不同场景和产品的封装的内部还是会有所区别,这里只是着重记录tcpdump 应该如果直接过滤内层报文,即过滤包头信息;
首先了解如何从包头过滤信息
proto[x:y] : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、4字节(第一字节从0开始排)
proto[x:y] & z = 0 : proto[x:y]和z的与操作为0
proto[x:y] & z !=0 : proto[x:y]和z的与操作不为0
proto[x:y] & z = z : proto[x:y]和z的与操作为z
proto[x:y] = z : proto[x:y]等于z
操作符 : >, <, >=, <=, =, !=
操作值都是16进制
那么对于gre隧道模式下,gre隧道是通过IP层进行的报文封装,那么从ip层过滤信息,就可以写成ip[30:4]
即代表ip层第31位起,向后4 byte,这里的值都是16进制,就可以写为:ip[30:4]=0xAC100009
这里0xAC1