问题描述:
最近搭建了vCenter环境,并使用vCenter创建的VM搭建了一套openstack环境,在验证openstack的外网功能时,发现报文死活ping不通外网,抓包发现报文在vcenter的dvs处给丢掉了,这是非常奇怪的事情,仔细排查后,现vCenter竟然感知报文的mac对于不受vCenter管理的VM发出的报文直接忽视。
先上图:
解释如下:
1)ESX-B016是安装了VMWare ESX的主机,受vCenter管理和控制,我使用vCenter创建一个虚拟分布式交换机(dvs01),使用ESX-B016主机的eth2作为这个交换机的上行口(可能有人会问,为什么用eth2作为上行口,这个因为eth0和eth1被别人占用了:));ESX-B016 的eth2网卡连接到外部物理交换机switch1的g1口,然后通过交换机的g3口连接到了物理网关路由器Rrouter1上;物理网关路由器的IP为162.3.110.1。
2)使用vCenter在ESX-B016主机上创建了一个VM(虚拟机名称为OpenStack_VM),用来安装OpenStack环境,这个VM的网卡eth0连接到dvs01的端口组dVPort1上;
3) 在OpenStack环境上,我创建了租户网络(net1:192.168.0.0/24)、虚拟机(user_vm),路由器(R),将net1关联到router上,并创建了网络(ext1:162.3.0.0/16)作为外部网络
4) 创建的ext外部网络是vlan类型,vlanid设置为1000, dVPort1端口组为vlan中继,允许2-4094通过,同时g1设置为trunk口,g2设置为access口,只允许vlan 1000通过.
一起就绪后,我进入user_vm虚拟机中执行ping 162.3.110.1操作,理论上应该能够ping通网关,但是奇怪的是怎么也不通。
定位过程
好吧,只能祭出抓包的利器tcpdump,首先看一下报文的传输路线:user_vm -> br-int ->R -> snat -> br-int -> br-eth0 -> eth0 -> dvs01 -> uplink口(eth2)-> g1 –> g3 -> Router1,
1) 第一步我在User_VM执行ping 162.3.110.1
2) 首先确定ping报文是否发出去了,在user_vm虚拟机的eth0上抓包,发现能够抓到通往162.3.110.1的ICMP请求报文,但没有响应;
3) 在R上抓包,也能抓到通往162.3.110.1的ICMP请求报文,但没有响应;
4) 在eth0口抓包,同样能抓到通往162.3.110.1的ICMP请求报文,但没有响应,说明报文已经从openstack_VM虚拟机中发出去了,进入了dvs01分布式交换机;
5) 分布式交换机dvs01通过上行口送给了物理交换机switch1的g1口,我在switch1上执行displaymac-address | include GE0/0/1命令,监控所有经过g1口的报文,没有发现源mac地址为snat的外网口mac的任何报文(这里为何是外网口的源mac,不明白的同学可以仔细思考下),这说明报文没有如期送到switch1中,难道经过dvs01时凭空消失了?
解决办法:
经过查资料,发现原来的确是被dvs01丢失了,这是因为端口组的配置导致的,将OpenStack_VM对应的端口组配置修改如下即可解决问题:
根本原因在于,我们使用openstack创建的snat上面的外网口对dvs01来说是不被承认的, 如果将伪传输设置为拒绝的话, ESX会将正在传输的报文mac和所有适配上有效的mac进行比对,发现有不一致的报文会进行丢弃。这里何谓有效?肯定是ESX自己分配的mac地址是有效的,而openstack分配的mac地址ESX感知不到,也因此认为是无效的。
附加资料:
下面是VMware官方文档对混杂模式和伪传输的描述:
Promiscuous Mode(混杂模式):
混杂模式控制虚拟机是否可以查看 ESX 主机上其他节点的单播通信量。默认情况下,此选项设置为 [Reject(拒绝)],这意味着虚拟网络适配器在混杂模式下无法运行。在混杂模式中,虚拟网络适配器无需执行任何接收过滤,因此客户操作系统可接收线路上观察到的所有通信量。尽管混杂模式可以有效跟踪网络活动,但这种运行模式极不安全,因为无论某些数据包是否只能由特定的网络适配器接收,在混杂模式中所有适配器都可访问这类数据包。这意味着虚拟机中的管理员或 Root 用户可以查看传输至其他客户机或主机操作系统的通信量。
尽管最常用的混杂模式应当处于关闭状态,但如果正在运行网络入侵检测软件或数据包端口扫描器,那么也可将虚拟交换机配置为在混杂模式中运行。
Forged Transmits(伪传输):
伪传输将影响出站通信量。默认情况下,此选项设置为 [Accept(接受)],这意味着 ESX 主机不会将源 MAC 地址与有效 MAC 地址进行比较。如果将此选项设置为 [Reject(拒绝)],ESX 主机会将操作系统正在传输的源 MAC 地址与其适配器的有效 MAC 地址进行比较,查看它们是否匹配。如果地址不匹配,ESX 会丢弃此数据包。客户操作系统不会检测到其虚拟网络适配器无法使用模拟的 MAC 地址发送数据包。ESX 主机将在任何使用模拟地址传递数据包传输之前将其截获,因此,客户操作系统可能会假设数据包已被丢弃。版权声明:本文为博主原创文章,未经博主允许不得转载。
VCenter中嵌套openstack VM不能ping通外部网络问题解决办法
原文地址:http://blog.csdn.net/jiahaojie1984/article/details/47835787