1. Namespace实现网络隔离与互通
    1. 新建ns:

      ip netns add foo

    2. 查看ns:

      ip netns

    3. 查看ns详细配置:

      ip netns exec foo ip addr

    4. 设置ns内部lo网络up:

      ip netns exec foo ip link set lo up

      ip netns exec foo ip addr

      ip netns exec foo route –n

      ip netns exec foo iptables -t nat –S

    5. ip netns exec foo ping 10.20.0.88

    6. 创建tap设备对:

      ip link add tap-foo type veth peer name tap-root

      ip link

      使用ethtool确认属于成对设备:

    7. 设置tap设备的ns:

      ip link set tap-foo netns foo

      ip netns exec foo ip link

      ip netns exec foo ip link set tap-foo up

      root的ns看不到foo-tap了:

    8. 为tap设备添加ip地址

      ip netns exec foo ip addr add 88.88.88.100/24 dev tap-foo

      ip netns exec foo ifconfig

    9. 设置tap-root设备的ip地址

      ip addr add 88.88.88.101/24 dev tap-root

    10. up起root的tap设备

      ip link set tap-root up

      ifconfig

    11. 可以相互ping通88.88.88.100、88.88.88.101,但是仍然不可访问10.20.0.88

      ip netns exec foo ping 10.20.0.88

    12. 设置默认路由

      ip netns exec foo route add -net 0.0.0.0 netmask 0.0.0.0 gw 88.88.88.101

      ip netns exec foo route –n

    13. 继续ping10.20.0.88,可以ping通

      ip netns exec foo ping 10.20.0.88

    14. 机器重启所有配置自动清除。
  2. Openvswitch VM+GRE隧道实现同网段虚拟机跨主机通信
    1. 环境拓扑

    2. 环境准备

      network1

    eth0:10.20.0.201 (management network)

    eht1:172.16.0.201 (public/external network)

    eht2:192.168.4.201 (private network,gre tunning)

    compute1

    eth0:10.20.0.202 (management network)

    eht1:(disabled)

    eht2:192.168.4.202 (private network,gre tunning)

    1. 先看网络节点。

      安装必备软件包:yum install libvirt openvswitch python-virtinst xauth tigervnc –y

    yum install kvm qemu-kvm qemu-kvm-tools

    yum install bridge-utils qemu-img

    yum install python-virtinst virt-manager virt-viewer

    yum install libvirt libvirt-client

    reboot -h 0,vm重启生效。

    1. 移除默认的libvirt网络

    virsh net-destroy default

    virsh net-autostart --disable default

    virsh net-undefine default

    virsh net-list

    1. 设置允许ipforward

    vi /etc/sysctl.conf

    net.ipv4.ip_forward=1

    net.ipv4.conf.all.rp_filter=0

    net.ipv4.conf.default.rp_filter=0

    sysctl –p,立即生效。

    1. 启动openvswitch

      service openvswitch start

      chkconfig openvswitch on

    2. 创建linux bridge,qbr设备,虚拟机网卡与br-int网桥之间的桥梁网桥。

      brctl addbr qbr01

      ip link set qbr01 up

      brctl show

      ifconfig

    3. 创建虚拟机,虚拟机网卡连接到网桥qbr01的tap设备:

      mkdir -p /var/tmp/gre

      mv instance1.img instance1.xml /var/tmp/gre

      instance文件参考:

      https://github.com/yongluo2013/osf-openstack-training/blob/master/installation/gre/instance1.xml

      cd /var/tmp/gre

      virsh define instance1.xml

      virsh start instance1

      virsh vncdisplay instance1

      vncviewer :0

      vncviewer进入虚拟机。

    4. 为虚拟机配置IP与默认网关

      sudo ip addr add 192.168.1.11/24 dev eth0

      sudo route add default gw 192.168.1.1

    5. 创建br-int网桥,用于连接qbr网桥

      ovs-vsctl add-br br-int

      ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.202

    6. 创建tap对,用于br-int与qbr之间的连接

      ip link add qvo01 type veth peer name qvb01

      brctl addif qbr01 qvb01,设置qvb01为qbr01的接口

      ovs-vsctl add-port br-int qvo01

      ovs-vsctl set port qvo01 tag=100

      ip link set qvb01 up

      ip link set qvo01 up

      br-int以下的网络设备均up起来了

    7. 再看计算节点。准备软件与网络节点一致。

      brctl addbr qbr02

      ip link set qbr02 up

      virsh define instance2.xml

      virsh start instance2

      virsh vncdisplay instance2

      vncviewer :0

      sudo ip addr add 192.168.1.12/24 dev eth0

      sudo route add default gw 192.168.1.1

      ovs-vsctl add-br br-int

      ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.201

      ip link add qvo02 type veth peer name qvb02

      brctl addif qbr02 qvb02

      ovs-vsctl add-port br-int qvo02

      ovs-vsctl set port qvo02 tag=100

      ip link set qvb02 up

      ip link set qvo02 up

    8. 至此,vm01的192.168.1.11可以ping通vm02的192.168.1.12。在没有namespace场景下,同一vlan可以直接连通。

      vm01:

      vm02:

  3. Openvswitch VM+GRE隧道+NameSpace实现dhcp的namespace
    1. 添加dhcp的ns

      ip netns add dhcp01

    2. 为br-int添加dhcp的tap设备接口

      ovs-vsctl add-port br-int tapdhcp01 -- set interface tapdhcp01 type=internal

    3. ovs-vsctl set port tapdhcp01 tag=100

    4. 设置tap设备所属的ns

      ip link set tapdhcp01 netns dhcp01

    5. 为dhcp的tap设备设置ip

      ip netns exec dhcp01 ip addr add 192.168.1.2/24 dev tapdhcp01

      ip netns exec dhcp01 ip link set tapdhcp01 up

    6. 在namespace中可以访问vm01与vm02。
  4. Openvswitch VM+GRE隧道+NameSpace实现router的namespace
    1. ovs-vsctl add-br br-ex
    2. 重新配置eth1和br-ex

    vi /etc/sysconfig/network-scripts/ifcfg-eth1

    DEVICE=eth1

    ONBOOT=yes

    BOOTPROTO=none

    PROMISC=yes

    MTU=1546

    vi /etc/sysconfig/network-scripts/ifcfg-br-ex

    DEVICE=br-ex

    TYPE=Bridge

    ONBOOT=yes

    BOOTPROTO=none

    IPADDR0=172.16.0.201

    PREFIX0=24

    ovs-vsctl add-port br-ex eth1

    1. 重启网络服务:service network restart

      ip link set br-ex up

      sudo ip addr add 172.16.0.20/24 dev br-ex

    2. 添加router的ns

      ip netns add router01

    3. 添加私网的网关

      ovs-vsctl add-port br-int qr01 -- set interface qr01 type=internal

      ovs-vsctl set port qr01 tag=100

    4. 设置网关在router01的ns中

      ip link set qr01 netns router01

      ip netns exec router01 ip addr add 192.168.1.1/24 dev qr01

      ip netns exec router01 ip link set qr01 up

      ip netns exec router01 ip link set lo up

    5. 至此,路由器的qr端可以ping通vm的私有ip。

    6. 在br-ex中添加qg设备,设置为私有网段连接外网的下一跳地址

    ovs-vsctl add-port br-ex qg01 -- set interface qg01 type=internal

    ip link set qg01 netns router01

    ip netns exec router01 ip addr add 172.16.0.100/24 dev qg01

    ip netns exec router01 ip link set qg01 up

    ip netns exec router01 ip link set lo up

    1. 为虚拟机添加浮动ip,并且配置iptables,规则使虚拟机可以访问外网

      ip netns exec router01 ip addr add 172.16.0.101/32 dev qg01

      ip netns exec router01 iptables -t nat -A OUTPUT -d 172.16.0.101/32 -j DNAT --to-destination 192.168.1.11

      ip netns exec router01 iptables -t nat -A PREROUTING -d 172.16.0.101/32 -j DNAT --to-destination 192.168.1.11

      ip netns exec router01 iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -j SNAT --to-source 172.16.0.101

      ip netns exec router01 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.0.100

    2. 到此,可以使用洗浮动IP访问虚拟机,如下图所示:

  5. 参考文档:

    https://github.com/yongluo2013/osf-openstack-training/blob/master/installation/mock-neutron-sdn-with-ovs-gre.md

【OpenStack】OpenStack系列11之namaspace&openvswitch原理实践的更多相关文章

  1. Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

    我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...

  2. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  3. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  4. 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转

      最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...

  5. 【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  6. Redis 系列(04-2)Redis原理 - 内存回收

    目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...

  7. Java 集合系列 11 hashmap 和 hashtable 的区别

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改 ASP.NET MVC+EF框架+EasyUI实现权限管系列  (开篇)   (1):框架搭建    ...

随机推荐

  1. ibatis selectKey用法问题

    其实就是相为SHIPMENT_HISTORY表加入一个主键sequence id shipmentHistoryId,加入一条记录,然后返回这个sequence id xml 代码 <inser ...

  2. Tomcat+eclipse JSP windows开发环境配置

    一.安装Java SE http://www.oracle.com/technetwork/java/javase/downloads/index.html ,配置JAVA_HOME环境变量 二.安装 ...

  3. 坑爹的BFC;块格式上下文

    Formatting context(FC) Formatting context 是 W3C CSS2.1 规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位 ...

  4. Java基础-关键字-final

    在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继 ...

  5. Angulajs系列-01-入门

    1.解决什么问题? a, controller的各种的创建 b,体验angular的双向绑定 2.怎么解决 2.1 引入angularjs 下载地址 2.2 创建controller的方法 2.2.1 ...

  6. asp.net 回发或回调参数无效的各种情况分析及解决办法

    昨天,在实现级联菜单的时候,突然出现一下错误: 回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中 ...

  7. [Angularjs]ng-show和ng-hide

    写在前面 上篇文章介绍了ng-select和ng-options指令的使用,这篇文章继续指令的学习,本篇文章讲学习ng-show和ng-hide指令. 系列文章 [Angularjs]ng-selec ...

  8. C# ServiceStack.Redis 操作对象List

    class Car { public Int32 Id { get; set; } public String Name { get; set; } static void Main(string[] ...

  9. NYOJ 77 开灯问题

    #include <stdio.h> #include <string.h> #define maxn 1050 int a[maxn]; int main(void) { i ...

  10. import numpy 和 from numpy import * 的区别

    对于 import xxx 使用函数的方法为 x'x'x.Afunc 而对于 from xxx import * 调用函数的方法为 Afunc