斗转星移,且看vSwitch如何玩转报文转发
一、 vSwitch虚拟交换机简介
虚拟交换机(vSwitch),作为H3Cloud云计算方案中CAS软件不可或缺的一部分,是负责主机上的虚拟机之间以及虚拟机与外部之间流量交换的重要部件。vSwitch主要用于实现本台主机上虚拟机的网络接入,转发效果与传统二层交换机类似,不提供三层转发功能。
在虚拟化和云计算环境中,虚拟机在虚拟化平台内部流量的转发无法直观进行监控。维护人员对于流量在虚拟机和物理主机的端口之间的走向也经常存在很多疑问与困惑。除了使用VEPA解决方案外,也可以针对性地在vSwitch上抓包分析。本文将重点介绍vSwitch上抓包分析的方法并分析vSwitch的报文转发原理。
二、 vSwitch转发原理
1. vSwitch上的端口角色
图1
如图1中所示,vSwitch中主要包含三种接口:
1)VNET口:用于连接虚拟机的下行接口,其数量与虚拟机的虚拟网卡数有关。一个虚拟机中的一个虚拟网卡对应vSwitch上的一个VNET口。值得注意的是VNET的端口号在同一台主机上是连续的,并不会因为vSwitch的不同而重复标号。
2)eth X 口:是编号为“X”的服务器主机上的物理端口,新建虚拟交换机时需要选择的上行接口,负责将vSwitch的上行流量从接口转发出去。
3)vswitchX 口:位于 vswitchX上的内核接口,与相应vSwitch同名,MAC地址与所绑定的物理接口相同。当新建vSwitch时,会自动生成同名的接口,直接连接到Linux内核中。
如图2,我们可以登录到CAS的后台通过命令ifconfig查看所有的接口信息,比如物理端口ethX、虚拟交换机的内核端口vswitchX、虚拟交换机连接虚拟机的VNET口的MAC地址,IP地址等详细信息。
图2
2. vSwitch的转发原理
由于vSwitch虚拟交换机是基于MAC地址进行二层转发的,我们也可以通过命令:ovs-appctl fdb/show vSwitchname对相应名称为vSwitchname的vSwitch的MAC地址表进行查看,同时也能通过输出的port字段了解相应端口的角色:
图3
其输出结果如图3所示:port 1指的是连接VM的上联口,从物理端口学习MAC。port 2及标号2以上的端口指vSwitch连接到VM的下联端口,从VNET端口学习MAC。比如port2对应的MAC地址为从VNET0口上学习到的MAC地址。LOCAL指vSwitch自身所相连的物理端口的MAC。而MAC地址与传统网络设备一致,通过vSwitch自行学习得到,MAC表老化时间为60s,到了时间MAC地址项就从表中删除了。
对于流量的转发,vSwitch还是按照二层交换机的转发原理进行转发,不过有以下几点注意事项:
1)从服务器外部进入的数据包,物理网口收到报文后,交给相连的vSwitch。vSwitch查看自身的mac表,通过对应的接口发送报文。如果MAC表中因为老化导致没有目的MAC地址记录,则进行广播。其流量走向如图4所示:蓝色流量为单播转发,红色为广播转发情况。
图4
2)对于VM发出的报文,先发送到vSwitch上,再根据转发机制查表转发或广播转发发送到相应的接口。流量走向如图5:蓝色代表查表直接转发,红色代表广播。
图5
3)对于内核发出的报文,先查看主机路由表,决定发送到哪个vSwitch,再根据转发机制由vSwitch将流量发送到相应的接口。对于内核接收到的报文,先查看路由表,如果收包和回包来回路径对称,则根据路由回包;如果收包和回包来回路径不对称,则直接忽略不回包。如图6中的例子,VMB连接在vswitch0上,配置为vSwitch0同一网段的地址。VMB上ping vswitch1的地址,流量经过vSwitch0的转发通过eth0到外部转发至eth1上,进入vSwitch1后转发给vSwitch1内核口,内核口回包时发现应该从vSwitch0口发送,来回路径不一致,于是不予回包。
图6
三、 后台抓包方法及分析
1. 针对vSwitch的常用抓包方法
在后台抓包分析可使用Linux tcpdump命令进行,以最常用的tcpdump –i ethX host hostip 为例子:“-i ethX”意思为抓包监控eth*上所有流量并输出显示;“host hostip”则具体为监控来自特定ip的虚拟机的流量。如图7,可以看到监控到地址为192.168.21.244的虚拟机正在接收来自192.168.21.200的虚拟机的ping包并回应。
图7
当然,此处的参数ethX也可灵活的输入vswitch0等内核接口,实现在该接口上抓包监控流量。
在掌握了最简单的抓包方式后,需要注意的是由于实际跑生产业务的虚拟机流量众多,分析起来不可能如实验环境这么简便。以下将介绍使用tcpdump命令抓包的几种更精细的用法。
1)tcpdump –i ethX src host hostip 使用“src”参数可以抓包监控到ethX物理端口上以hostip为源地址的所有报文,其输出如图8。当我们检测连通性时发现没有回包等问题时,我们可以通过此命令了解发包是否正常,为之后的排查提供思路。
图8
2)tcpdump –i ethX dst host hostip 使用“dst”参数可以抓包监控到ethX物理端口上以hostip为目的地址的所有报文,其输出如图9。与之前一条命令一致,用于分析是否有去往目的地址的回包。
图9
3)tcpdump host hostname使用此命令可直接通过主机名监控与主机相关的所有报文,常用于物理主机上的流量监控。如图10所示,对主机HZ-CAS03-CVK01流量进行监控,可以用于查看主机上转发流量是否正常。
图10
4)tcpdump –i ethX host hostip and \(hostip2\) 此命令在ethX上抓包分析hostip与hostip2之间的通信报文,其输出结果如图11所示。还可以在hostip2之后引入or参数增加其他ip,实现监控第一台机器与后面多台机器之间的流量监控,而忽略其他流量。
图11
5)tcpdump –i ethX host hostip and not hostip2此命令在ethX上抓包分析hostip与除了hostip2之外所有ip之间的通信报文,其输出结果如图12所示。一般用于排除特定机器转发特殊状况,先查看vSwitch本身是否转发正常,确认后再排除具体机器的设置是否存在问题。
图12
应用tcpdump命令进行流量分析,其功能是非常强大的,在tcpdump命令的使用中还可以结合具体流量类型进行抓包分析。
可以使用tcpdump后加协议名再用之前提到的-i参数指定端口,精确地对指定协议流量进行监控。其中可用的协议有:ip,tcp,udp,icmp等,对于tcp和udp协议后还可以加上port参数指定其端口号,监控特定流量。
2. 抓包输出流量分析
由于使用tcpdump抓包分析时,屏显输出内容较为有限可以使用命令参数-w将抓包的信息保存下来,再使用ethereal/wireshark抓包软件进行分析。
tcpdump -i ethX host hostip -w XXX.cap
可以在当前路径下得到一个名为XXX.cap的文件,导出后可以用抓包软件打开进行分析,如图13中即为一个已经在ethereal中打开的.cap文件。
图13
通过分析可以得知在此端口上发现了tcp校验失败,可以依此继续排查是否是操作系统应用层面发生了问题。
四、 总结
对于vSwitch来说,是一个运行在虚拟环境下的二层交换机。其转发规则与物理的二层交换机并无大差异,依照MAC表项进行转发。而较为特殊的是vSwitch中的内核口的概念,需要特别指出实际上CAS的虚拟交换机的地址是配置在内核口上而非物理端口上的。内核口的转发需要严格来回路径一致,否则会造成丢包。
在CAS后台的Linux操作系统中使用tcpdump命令来进行抓包分析,可以更加清晰的了解到流量在vSwitch内部的转发方式。tcpdump命令在分析虚拟机、物理机收发包流量分析,故障排除中也很有用处,其功能与网络设备故障定位时经常使用的wireshark抓包相差无几。