VCenter中嵌套openstack VM不能ping通外部网络问题解决办法

问题描述:

最近搭建了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 主机将在任何使用模拟地址传递数据包传输之前将其截获,因此,客户操作系统可能会假设数据包已被丢弃。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-13 09:08:50

VCenter中嵌套openstack VM不能ping通外部网络问题解决办法的相关文章

VCenter中嵌套openstack VM不能ping通外部网络问题解决的方法

问题描写叙述: 近期搭建了vCenter环境,并使用vCenter创建的VM搭建了一套openstack环境.在验证openstack的外网功能时.发现报文死活ping不通外网,抓包发现报文在vcenter的dvs处给丢掉了,这是很奇怪的事情.细致排查后.现vCenter居然感知报文的mac对于不受vCenter管理的VM发出的报文直接忽视. 先上图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400

Centos7配置静态IP后无法ping通外部网络的问题(无法上网)

打开ifcfg-ens33配置文件,注意下面标记部分 建议: (1)ifcfg-ens33 DNS 配置 DNS1=8.8.8.8 DNS2=8.8.4.4 (2)配置DNS解析才能够识别外部的IP域名: # 查看是否有DNS配置 cat /etc/resolv.conf # 添加DNS配置 vim /etc/resolv.conf # 填入DNS服务器 nameserver 8.8.8.8 nameserver 8.8.4.4(建议使用) 原文地址:https://www.cnblogs.co

openstack 主机无法ping通instance,无法ssh到instance

https://docs.openstack.org/zh_CN/user-guide/cli-nova-configure-access-security-for-instances.html 好不容易安装好了OpenStack,发现无法ping通instance,无法ssh到instance: 最后折腾了半天发现是security group的问题: Neutron 默认的安全组规则会禁止掉所有从外面访问 instance 的流量. 本节我们会修改安全组的配置,允许 ping 和 ssh i

解决在Vmare workstation中,Linux虚拟机无法ping通网关的问题

前言: 我之前用的是桥接模式配置,ip地址可以ping通,网关怎么都ping不通.我们不妨转换一个思路,把桥接模式改成NAT模式. (1) 修改Linux虚拟机网络适配器模式为NAT模式 (2) 修改虚拟网络编辑器 查看DHCP设置,192.168.31.128---192.168.31.254 (3) 修改Linux的网卡配置文件 BOOTPROTO=DHCP IPADDR=192.168.31.129 NETMASK=255.255.255.0 GATWAY=192.168.31.1 (4)

VMware 上Ubuntu虚拟机(15.1) ping不通物理主机(win10),但windows可以ping通虚拟机的问题解决方法

VMware 上Ubuntu虚拟机(15.1)  ping不通物理主机win10,而windows却可以ping通linux 捣鼓了半天... 网上也没有个简单方便快捷的方法,最后还是勉强ping通,方法如下: 方法: 在网络适配器地方,选择自定义,再选择VMnet8,如图, (当然,前提是在VMware workstation -> 编辑 -> 虚拟网络编辑器的地方将NAT模式的子网ip,子网掩码等等配置的与windows主机上的一致,然而,我想说的是,一般情况下,已经是一致的了,主要是:选

android ScrollView中嵌套GridView,ListView只显示一行的解决办法

注:本文是由网上大神分享的解决方案汇集而成 方法一: 重写ListView.GridView: 重写ListView: 1 public class MyListView extends ListView { 2 3 public MyListView(Context context) { 4 // TODO Auto-generated method stub 5 super(context); 6 } 7 8 public MyListView(Context context, Attrib

本地主机无法ping通虚拟机主机解决办法

今天想打开虚拟机,用xshell连接时,突然连接超时打不开,然后尝试ping虚拟机IP,发现无法ping通,此时百度一波问题解决... 1.首先查看本地IP情况 2.查看虚拟机网络适配器配置情况 3.确保虚拟机和本地在同一网段,配置好以后,重启虚拟网络编辑器,发现此时看能ping通虚拟机主机,并可以通过ssh连接! 原文地址:https://blog.51cto.com/13054614/2400070

ScrollView中嵌套GridView,ListView只显示一行的解决办法

转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView,里面的内容是固定的,底层系统很容易计算出控件要占用的宽高,当外面嵌套一层ScrollView后,就能做上下或左右滑动,但能滑动多少系统不知道,这时就需要你给计算出一个滑动区域给ScrollView.而这个数值就是通过GridView和ListView中的内容总的宽高之和.有更精确的理解欢迎赐教.解决

windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 问题解决办法

windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 我再QtCreator中想导入一个外部库时,他提示不匹配 出现这种问题是因为QtCreator 和 MinGW 其中一个是32位 ,而另一个是64位, 将两者统一后便不会出现该问题!!! 原文地址:https://www.cnblogs.com/zz-1120-wtenlb/p/12602379.html