问题描写叙述:

近期搭建了vCenter环境,并使用vCenter创建的VM搭建了一套openstack环境。在验证openstack的外网功能时。发现报文死活ping不通外网,抓包发现报文在vcenter的dvs处给丢掉了,这是很奇怪的事情。细致排查后。现vCenter居然感知报文的mac对于不受vCenter管理的VM发出的报文直接忽视。

先上图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

解释例如以下:

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的port组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。 dVPort1port组为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丢失了。这是由于port组的配置导致的,将OpenStack_VM相应的port组配置改动例如以下就可以解决这个问题:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

根本原因在于,我们使用openstack创建的snat上面的外网口对dvs01来说是不被承认的, 假设将伪传输设置为拒绝的话, ESX会将正在传输的报文mac和全部适配上有效的mac进行比对,发现有不一致的报文会进行丢弃。

这里何谓有效?肯定是ESX自己分配的mac地址是有效的,而openstack分配的mac地址ESX感知不到,也因此觉得是无效的。

附加资料:

以下是VMware官方文档对混杂模式和伪传输的描写叙述:

Promiscuous Mode(混杂模式):

混杂模式控制虚拟机能否够查看 ESX 主机上其它节点的单播通信量。

默认情况下,此选项设置为 [Reject(拒绝)],这意味着虚拟网络适配器在混杂模式下无法执行。在混杂模式中,虚拟网络适配器无需执行不论什么接收过滤。因此客户操作系统可接收线路上观察到的全部通信量。

虽然混杂模式能够有效跟踪网络活动,但这样的执行模式极不安全,由于不管某些数据包是否仅仅能由特定的网络适配器接收,在混杂模式中全部适配器都可訪问这类数据包。

这意味着虚拟机中的管理员或 Root 用户能够查看传输至其它客户机或主机操作系统的通信量。

虽然最经常使用的混杂模式应当处于关闭状态,但假设正在执行网络入侵检測软件或数据包port扫描器。那么也可将虚拟交换机配置为在混杂模式中执行。

Forged Transmits(伪传输):  

伪传输将影响出站通信量。默认情况下,此选项设置为 [Accept(接受)],这意味着 ESX 主机不会将源 MAC 地址与有效 MAC 地址进行比較。假设将此选项设置为 [Reject(拒绝)],ESX 主机会将操作系统正在传输的源 MAC 地址与其适配器的有效 MAC 地址进行比較。查看它们是否匹配。假设地址不匹配,ESX 会丢弃此数据包。客户操作系统不会检測到其虚拟网络适配器无法使用模拟的 MAC 地址发送数据包。

ESX 主机将在不论什么使用模拟地址传递数据包传输之前将其截获。因此,客户操作系统可能会假设数据包已被丢弃。

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

  1. CENTOS7配置静态IP后无法ping通外部网络的问题

    我今天想谈论的并不是如何配置静态IP,这样的话题已经有好多高手再谈. 我想谈的是为什么,我按照他们的教程无论如何也要发生各种问题,没办法连接外网的问题. 先给大家看我的最终版配置方案:我只修改了一个文 ...

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

    打开ifcfg-ens33配置文件,注意下面标记部分 建议: (1)ifcfg-ens33 DNS 配置 DNS1=8.8.8.8 DNS2=8.8.4.4 (2)配置DNS解析才能够识别外部的IP域 ...

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

    https://docs.openstack.org/zh_CN/user-guide/cli-nova-configure-access-security-for-instances.html 好不 ...

  4. openstack VM可以ping外部网络,但是外部网络ping不通VM

    经过无数次的尝试,终于搭建好了完整的Openstack,本来VM可以获取到IP地址,但是等到我大功告成的时候,突然发现外部网络却不能ping进VM,我可是整整折腾了我几个通宵,这是哭啊.然而,皇天不负 ...

  5. VM不能ping通www.baidu.com的问题【NAT】 更新了【桥接模式】

    NAT模式 1.为NAT设置子网及掩码等信息 点击VMWare菜单栏“编辑” —> 虚拟网络编辑器 [下图第一张图]—> 选中VMnet8(当然这个看自己的设备后缀是多少了,只要外部连接方 ...

  6. win10升级后,无法ping通vmware的centos解决方法

    win10是lenovo thinkpad460上面的,是正版的.无法做设置,不让其自动升级.10月8日节后第一天上班,电脑要求更新,我就点更新. 结果就发现无法ping通vmware中的centos ...

  7. 开发板无法ping通虚拟机的问题解决一例

    先描述一下遇到的问题: 使用的开发板是Tq2440,我将虚拟机和开发板都设在在了同一个网段,并且虚拟机使用的是桥接的方式,我用nfs的方式挂载根文件系统是失败,系统无法起来,后来我进入uboot命令模 ...

  8. VMware中虚拟机与主机不能ping通解决办法

    先去看看服务全部启动了没? VMware相关服务启动关闭脚本     启动了还报错,接着往下看......     一.如果是桥接模式,那么 可能性1:虚拟机防火墙禁ping,请关闭虚拟机防火墙重试: ...

  9. delphi中检测局域网ip能够ping通模块

    // 函数PingHost用于ping目标IP是否连通 // uses winsock    在uses中加入  winsock // 用法:  if PingHost(edit2.Text) the ...

随机推荐

  1. define与typedef的区别

    define: 发生在预处理阶段,也就是编译之前,仅仅文本替换,不做任何的类型检查 没有作用域的限制 typedef: 多用于简化复杂的类型声明,比如函数指针声明:typedef bool (*fun ...

  2. 软件图标显示不正常【win7企业版】

    现象: 原因: 图标缓存没有把该软件图标建立起来 解决: 一. 1.找到 IconCache.db 2.你要把电脑隐藏文件打开不然找不到这个文件的,组织—文件夹及搜索选项——查看——显示隐藏文件.文件 ...

  3. P1538 迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  4. React Native导航器Navigator

    React Native导航器Navigator 使用导航器可以让你在应用的不同场景(页面)间进行切换.导航器通过路由对象来分辨不同的场景.利用renderScene方法,导航栏可以根据指定的路由来渲 ...

  5. PHP开发之旅-提取表单提交内容发送邮件

    在实际项目开发中,我们经常需要得到用户的反馈信息并及时回复.普通的留言板有一定的内容限制,而邮件则能满足这个需求.今天给大家演示一下怎么利用PHP发送电子邮件. 1.创建表单 <form nam ...

  6. Core 项目下使用SQl语句

    public static DataTable ExeQuery(string connectionString, CommandType cmdType, string cmdText) { usi ...

  7. SQL基本操作——select into与临时表

    SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档. --制作 "Persons" 表的备份复件: SELECT ...

  8. 13、scala模式匹配

    1.模式匹配的基础语法 2.对类型进行模式匹配 3.对Array和List的元素进行模式匹配 4.case class与模式匹配 5.Option与模式匹配 1.模式匹配的基础语法 Scala提供了m ...

  9. Qt 窗体间传值(代码备份)

    刚开始看的时候看的云里雾里的,现在稍微明白一点了.现在假设有一个form,一个MainWindow,如图所示: 实现点击PushButton,将文本框中的内容传输到MainWindow中,显示为Lab ...

  10. mybatis批量操作(foreach)

    foreach可以在SQL语句中通过拼接的方式进行集合迭代.foreach元素的属性主要有collection,item,index,separator,open,close. item属性:表示循环 ...