随着云计算、虚拟化相关技术的发展,传统的网络早已无法满足于规模大、灵活性要求高的云数据中心的需求,于是便有了 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
其中数字 39 由 8(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
在实验环境下的抓包测试截图如下
如果需要更细的过滤条件来进行精细过滤抓包,参考上述示例即可编写对应的抓包命令。
参考:
相关阅读:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。