OpenStack版本:Mitaka

物理节点:

Hostname Management IP Tunnel IP Role
test-ctrl-01 192.168.100.11 192.168.120.11 Controller Node、Network Node
test-cmpt-01 192.168.100.21 192.168.120.21 Compute Node
test-cmpt-02 192.168.100.22 192.168.120.22 Compute Node

Neutron网络:

网络 网络类型 网络模式 子网
public_net External Network Flat 192.168.100.0/24
share_net Private Network Vxlan 192.168.111.0/24

网络拓扑:

虚拟机:

test-01:直接连接到public_net,fixed ip为192.168.100.101

test-02:连接到share_net,fixed ip 192.168.111.4,绑定floating ip 192.168.100.102

特意将两个虚拟机建到同一台宿主机test-cmpt-02上,方便进行对比。

网络节点test-ctrl-01的网桥结构图:

计算节点test-cmpt-02上的网桥结构图:

flat网络(虚拟机test-01)访问外网的流量

1. 数据包从虚拟网卡tapaf305168-66出来,到达网桥qbraf305168-66,此处有iptables规则做IP/MAC pairs的匹配,如果配置了安全组规则,还会有对应的iptables规则:

2. 通过qvbaf305168-66和qboaf305168-66这对peer,到达br-int。由于qboaf305168-66在br-int上的vlan tag是2(类似交换机的access口),数据包的vlan_id会被标记成2。

3. br-int的flow table对ip和mac进行过滤,防止ip和mac伪造:

可以看到对arp和icmp有ip和mac的匹配。对mac的检测在mitaka版本以后都有,而kilo版只有arp_spa的规则。

这是些规则是neutron-openvswitch-agent添加的,具体实现在neutron.plugins.ml2.drivers.openvswitch.agent.openflow.ovs_ofctl.br_int. OVSIntegrationBridge的install_icmpv6_na_spoofing_protection(), set_allowed_macs_for_port()和install_arp_spoofing_protection()三个函数。

4. MAC地址检测通过后的action是normal,数据包有两个走向:

1) 通过patch-tun和patch-int这对peer到达br-tun:

最后会到达table 22,此处对于dl_vlan=2没有添加任何规则,会直接被丢弃。

2) 通过int-br-ex和phy-br-ex这对peer到达br-ex:

此处对于dl_vlan=2的action是normal,数据包会根据路由表规则从eth3发出。

vxlan网络(虚拟机test-02)访问外网的流量

前3步同test-01。

4. MAC地址检测通过后的action是normal,数据包有两个走向:

1) 通过int-br-ex和phy-br-ex这对peer到达br-ex:

此处对于dl_vlan=1没有添加任何规则,会直接被丢弃。

2) 通过patch-tun和patch-int这对peer到达br-tun:

对于dl_vlan=1的包,会将vlan id去除,设置tunnel id为0x10050(也就是share_net的segmentation_id 65616),从port 2和port 3(分别和test-ctrl-01和test-cmpt-01建立的tunnel隧道)发出。这一步即是vxlan封装。

下面的流程在网络节点进行:

5. 网络节点通过tunnel隧道收到这个封装过的vxlan数据包,到达br-tun上的vxlan-c0a87b16这个端口:

匹配到tunnel id是0x10050,会将vlan id设置为1,这一步就是vxlan的解包。然后从port 1送出。

6. 同过patch-int和patch-tun这对peer,到达br-int,br-int的流表对dl_vlan=1的包没有任何处理,action是normal:

7. 数据包有三个走向:

1) 通过int-br-ex和phy-br-ex这对peer到达br-ex:

此处对于dl_vlan=1没有添加任何规则,会直接被丢弃。

2) 到达tap96835b35-be,直接丢弃。

3) 到达qr-466214fa-3d,直接丢弃。

4) 到达qg-169d638e-0e,接收此数据包,进入qrouter-c8aec0d9-3203-4bdb-9237-9818603f521f,根据iptables规则,对来自192.168.111.4的数据包做SNAT:

然后根据路由表规则最终从eth3发出。

neutron flat和vxlan网络访问外网流量走向的更多相关文章

  1. [OpenStack] [Liberty] Neutron单网卡桥接模式访问外网

    环境配置: * Exsi一台 * Exsi创建的单网卡虚拟机一台 * Ubuntu 14LTS 64位操作系统 * OpenStack Liberty版本 * 使用Neutron网络而非Nova网络 ...

  2. OpenStack Neutron单网卡桥接模式访问外网

    环境配置: * Exsi一台 * Exsi创建的单网卡虚拟机一台 * Ubuntu 14LTS 64位操作系统 * OpenStack Liberty版本 * 使用Neutron网络而非Nova网络 ...

  3. Neutron:访问外网

    instance 如何与外部网络通信?   这里的外部网络是指的租户网络以外的网络.  租户网络是由 Neutron 创建和维护的网络. 外部网络不由 Neutron 创建. 如果是私有云,外部网络通 ...

  4. OpenStack Neutron配置虚拟机访问外网

    配置完成后的网络拓扑如下: 当前环境: X86服务器1台 Ubuntu 16.04 DevStack搭建OpenStack 网络拓扑: 外部网络:192.168.98.0/24 内部网络:10.0.0 ...

  5. 在OpenStack里怎样配置Neutron,让虚拟机访问外网

    http://blog.csdn.net/zhangli_perdue/article/details/50264681 OpenStack里虚机(或者叫instance)只有在分配floating ...

  6. OpenStack创建网络和虚拟机、dhcp设备、虚拟路由器、虚拟机访问外网原理分析

    创建网络和虚拟机流程: 1.创建网络和子网 背后发生了什么: Neutron让控制节点上针对此子网的dhcp(虚拟设备)启动,用于给该子网下的实例分配ip 2.生成虚拟机 背后发生了什么: 用户通过G ...

  7. Docker: 解决Docker无法在电信网络中访问外网

    在电信网络中,Docker在build和run时会无法访问外网,原因是docker的默认dns地址是8.8.8.8,由于众所周知的原因,我们需要改写这个地址,方法如下: 修改/etc/sysconfi ...

  8. 本地虚拟机在NAT网络连接模式下如何设置才可以访问外网以及使用Xshell远程连接

    本文演示环境: 笔记本电脑系统:windows 7 虚拟机系统:CentOS 7 虚拟化软件:VMware Workstation 12 远程连接工具:Xshell 5 第一步: 打开虚拟网络编辑器 ...

  9. kubernetes搭建(可访问外网环境部署)

    版权声明:本文为博主原创文章,支持原创,转载请附上原文出处链接和本声明. 本文链接地址:https://www.cnblogs.com/wannengachao/p/11947621.html 一.前 ...

随机推荐

  1. JavaScript高级程序设计---学习笔记(三)

    函数表达式 定义函数的方式有两种:一种是函数声明,另一种是函数表达式. 关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之前会先读取函数声明所以可以把函数声明放在调用它的语句后面. 而 ...

  2. MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用

    在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...

  3. Golang分布式爬虫:抓取煎蛋文章|Redis/Mysql|56,961 篇文章

    --- layout: post title: "Golang分布式爬虫:抓取煎蛋文章" date: 2017-04-15 author: hunterhug categories ...

  4. 关于sql、mysql语句的模糊查询分类与详解,包括基本用法和mapper.xml文件里插入写法

    欢迎猿类加qq:2318645572,共同学习进步 实际例子: ssm框架:service业务层->dao层->mappers.xml->junit/test测试 1:service ...

  5. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

  6. .Net MVC4笔记之Razor视图引擎的基础语法

    Razor视图引擎的基础语法: 1.“_”开头的cshtml文档将不能在服务器上访问,和asp.net中的config文档差不多. 2.Razor语法以@开头,以@{}进行包裹. 3.语法使用: 注释 ...

  7. js创建xml对象

    js创建xml对象 //创建对象 function getDataXML() {     var objTds = $("TEXTAREA");     var count = o ...

  8. Centos7完全分布式搭建Hadoop2.7.3

    (一)软件准备 1,hadoop-2.7.3.tar.gz(包) 2,三台机器装有cetos7的机子 (二)安装步骤 1,给每台机子配相同的用户 进入root : su root ---------& ...

  9. Unity 脚本中各种[XXX]的用法

    1.[SerializeField]在Inspector中显示非public属性,并且序列化:若写在public修饰的字段前,相当于没写,Unity会自动为Public变量做序列化,序列化的意思是说再 ...

  10. 区分词法作用域(js)与动态作用域(精!)

    在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console ...