在vxlan网络中使用tcpdump精确过滤抓包

随着云计算、虚拟化相关技术的发展,传统的网络早已无法满足于规模大、灵活性要求高的云数据中心的需求,于是便有了 overlay 网络的概念,overlay 网络中被广泛应用的就是 vxlan 技术。VXLAN 是一种新型的二层网络虚拟化技术,它可以在 IP 网络上封装以太网帧,实现不同二层网络之间的互通。VXLAN 协议属于云计算虚拟化网络的非常重要的一部分,现在大多数云计算虚拟化网络都是基于此协议实现数据中心互联和虚拟机迁移。

在一般云网络运维场景下,外层报文的三层头都是物理机(宿主机)的 ip 地址,虚拟机实际通信的源/目的 ip 地址都是被封装到了内层报文中,这样在使用 tcpdump 进行抓包诊断的时候,如果使用外层报文 ip 作为过滤条件进行抓包,则会抓取到隧道中近乎全部的流量,在大流量节点上这样抓包很容易对服务器产生过大压力,影响业务程序的性能,这个行为是不可接受的。于是我们需要以内层报文的字段数据作为过滤条件进行精确抓包。

参考 pcap-filter 的手册文档,可以使用 proto [ expr : size ] 的方式来表示数据包中的数据。例如,表达式 ip[0] & 0xf != 5 捕获所有带有选项的 IPv4 数据包。表达式 ip[2:2] > 1400 捕获 ip total length 大于 1400 的报文。

带 vxlan 封装的报文格式如下图:

在网络运维过程中,ping 测试是运维人员的常用手段之一,如果 ping 不通则可用 tcpdump 抓包判断报文是否到达通信链路中的目标节点,对于内层是 ICMP 报文的 vxlan 报文可使用如下命令进行过滤抓包:

tcpdump 'udp[39]=1' -nv -i bond1

其中数字 398(sizeof udp) + 8(sizeof vxlan) + 14(sizeof eth) + 10(pos of protocol in ip header) - 1(start from 0) 计算得来,这里假设内层报文不带 vlan 标签

同理,对于内层报文源 ip 地址为 172.10.5.33 的报文可使用如下命令进行过滤抓包:

tcpdump 'udp[42:4]=0xac0a0521' -nv -i bond1

这里需要将 ip 地址转换为四字节十六进制数。

对于内层报文源或者目的 ip 地址为 172.10.5.33 的报文可使用如下命令进行过滤抓包:

tcpdump 'udp[42:4]=0xac0a0521' or 'udp[46:4]=0xac0a0521' -nv -i bond1

对于内层报文中通信两端 ip 地址为 172.16.10.7 和 3.5.5.5 的报文可使用如下命令进行过滤抓包:

sip='0xac100a07' ; dip='0x03050505'
tcpdump \(\("udp[42:4]=${sip}" and "udp[46:4]=${dip}"\) or \("udp[46:4]=${sip}" and "udp[42:4]=${dip}"\)\) -nv -i vnet2

在实验环境下的抓包测试截图如下

在上述过滤条件的基础上增加过滤 TCP 报文,则抓包命令如下

sip='0xac100a07' ; dip='0x03050505'
tcpdump 'udp[39]=6' and \(\("udp[42:4]=${sip}" and "udp[46:4]=${dip}"\) or \("udp[46:4]=${sip}" and "udp[42:4]=${dip}"\)\) -nv -i vnet2

在实验环境下的抓包测试截图如下

如果需要更细的过滤条件来进行精细过滤抓包,参考上述示例即可编写对应的抓包命令。


参考:

PS:

本文首发于公众号: 程序熵, 更多有用文章请点击关注 code-shang

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值