openvswitch:
    openvswitch: 开放的虚拟交换机,虚拟交换就是利用虚拟平台,通过软件的方式形成交换机部件。跟传统的物理交换机相比,虚拟交换机同样具备众多优点:
        1. 配置灵活;
        2. 成本更低

接下来通过openvswitch + netns 实现如下虚拟网络架构:

这里通过vmware来实现:

系统:centos7.2 x64
    主机1 一张网卡,模式:仅主机模式
    主机2 两张网卡,1: 模式:桥接模式;2: 模式:仅主机模式

主机1:
        eno16777736: 192.168.190.128
    主机2:
        eno16777736: 192.168.190.130  eno33554992: 192.168.1.167

本文中所需附件下载:

链接:http://pan.baidu.com/s/1qYQ4BeO 密码:4h4h

1、安装Openvswitch,创建主机1的虚拟网络

    Create the repository config file /etc/yum.repos.d/naulinux-extras.repo:

    [naulinux-extras]
name=NauLinux Extras
baseurl=http://downloads.naulinux.ru/pub/NauLinux/7/$basearch/Extras/RPMS/
enabled=
gpgcheck=
gpgkey=http://downloads.naulinux.ru/pub/NauLinux/RPM-GPG-KEY-linux-ink Install openvswitch rpm package: # yum --enablerepo=naulinux-extras install openvswitch

安装openvswith官方说的很清楚了 。

但是这里,我们的主机1是仅主机模式无法下载安装。

这里直接使用下载好的rpm包安装。

主机1配置:

# tar xf openvswitch.tar.gz
# rpm -ivh openvswitch/*.rpm
# systemctl start openvswitch ; systemctl enable openvswitch 创建虚拟交换机br-in
# ovs-vsctl add-br br-in # ovs-vsctl show
de08faca-8165-4fe7-88d9-459796b5deec
Bridge br-in
Port br-in
Interface br-in
type: internal
ovs_version: "2.5.0" 创建port vx0,并且设置vx0的类型为vxlan,vxlan相关联的对端主机是192.168.190.130(主机2)
# ovs-vsctl add-port br-in vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.190.130 ovs-vsctl show
de08faca-8165-4fe7-88d9-459796b5deec
Bridge br-in
Port "vx0"
Interface "vx0"
type: vxlan
options: {remote_ip="192.168.190.130"}
Port br-in
Interface br-in
type: internal
ovs_version: "2.5.0"

主机2配置:

# tar xf openvswitch.tar.gz
# rpm -ivh openvswitch/*.rpm
# systemctl start openvswitch ; systemctl enable openvswitch 创建虚拟交换机br-in
# ovs-vsctl add-br br-in # ovs-vsctl show
de08faca-8165-4fe7-88d9-459796b5deec
Bridge br-in
Port br-in
Interface br-in
type: internal
ovs_version: "2.5.0" 创建port vx0,并且设置vx0的类型为vxlan,vxlan相关联的对端主机是192.168.190.128(主机1)
# ovs-vsctl add-port br-in vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.190.128
# ovs-vsctl show
e43bbb36-5e1f-4178-8dbc-a87bf11332ed
Bridge br-in
Port br-in
Interface br-in
type: internal
Port "vx0"
Interface "vx0"
type: vxlan
options: {remote_ip="192.168.190.128"}
ovs_version: "2.5.0"

这样两台主机之间就建立其了vxlan的隧道传输。

2. 在主机1上创建虚拟机vm1

主机1配置:

# mkdir -pv /images/linux

通过xmanager将镜像文件上传到/images/linux目录

# cp -a cirros-0.3.-i386-disk.img vm1.img
# yum install libvirt libvirt-client qemu-kvm virt-install -y 这里要注意,用libvirt安装虚拟机前,需要首先配置libvirt网络,因为openvswitch和brctl是不兼容的,libvirt是无法自动发现的。 # cd /etc/libvirt/qemu/networks/
不需要默认nat模式
# mv default.xml default.xml_bak 创建br-in网络
# vim br-in.xml
# vim br-in.xml <network>
<name>br-in</name>
<forward mode='bridge'/>
<bridge name='br-in'/>
<virtualport type='openvswitch'/>
</network> # systemctl start libvirtd ; systemctl enable libvirtd
# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
br-in inactive no yes 启动br-in网络
# virsh net-start br-in
# virsh net-autostart br-in 创建vm1
# virt-install --name vm1 --ram --vcpus= --disk path=/images/linux/vm1.img --network network:br-in,model=virtio --import --force --nographics --serial=pty --console=pty

3. 在主机2上实现netns

主机2配置:

首先将第二张做桥接。
# cd /etc/sysconfig/network-scripts/
# cp -a ifcfg-eno33554992 ifcfg-br-out
# vim ifcfg-eno33554992
修改如下: TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno33554992
UUID=2269e064--426a-ba84-7d1c06e6ab0a
DEVICE=eno33554992
ONBOOT=yes
BRIDGE=br-out # 主要添加这行 # vim ifcfg-br-out TYPE=Bridge # 修改类型
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br-out # 修改名称
DEVICE=br-out # 修改设备名
ONBOOT=yes
IPADDR=192.168.1.167
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1 # systemctl restart network 物理网卡此时就作为桥设备
# ifconfig eno33554992
eno33554992: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
ether :0c::d9::e7 txqueuelen (Ethernet)
RX packets bytes (27.9 KiB)
RX errors dropped overruns frame
TX packets bytes (2.7 KiB)
TX errors dropped overruns carrier collisions br-out就作为本机的网卡通信
# ifconfig br-out
br-out: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.1.167 netmask 255.255.255.0 broadcast 192.168.1.255
ether :0c::d9::e7 txqueuelen (Ethernet)
RX packets bytes (15.0 KiB)
RX errors dropped overruns frame
TX packets bytes (676.0 B)
TX errors dropped overruns carrier collisions 安装bridge工具
# yum install bridge-utils -y
# brctl show
bridge name bridge id STP enabled interfaces
br-out .000c29d913e7 no eno33554992 这样,我们的物理桥设备就完成了,接下来创建netns虚拟网络空间。 创建虚拟网络空间为ns1
# ip netns add ns1
开启本地回环网络
# ip netns exec ns1 ifconfig lo up
打开网卡间转发功能
# ip netns exec ns1 sysctl -w net.ipv4.ip_forward=

我们需要创建两张虚拟网卡,这里的虚拟网卡可以理解成网线。

如图:

就是图中红色的两段。

首先将netns和openvswitch连接起来。

创建一对网卡,net-in是前半段,net-out是后半段,就像网线一样,前半段我们接到openvswitch上,后半段接到netns上,这样就在同一个网络里面了

# ip link add net-in type veth peer name net-out
# ifconfig net-in up
# ifconfig net-out up 将net-in添加到openvswitch # ovs-vsctl add-port br-in net-in
# ovs-vsctl show
e43bbb36-5e1f--8dbc-a87bf11332ed
Bridge br-in
Port br-in
Interface br-in
type: internal
Port net-in
Interface net-in
Port "vx0"
Interface "vx0"
type: vxlan
options: {remote_ip="192.168.190.128"}
ovs_version: "2.5.0" 将net-out添加到ns1中 # ip link set dev net-out name eth0 netns ns1

该网卡现在连接到了openvswitch上,配置和vm1中通网段的ip地址。

登录上vm1主机

# ifconfig lo up
# ifconfig eth0 10.0.0.2 netmask 255.255.255.0 up

在主机2上配置:

# ip netns exec ns1 ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
# ip netns exec ns1 ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) () bytes of data.
bytes from 10.0.0.2: icmp_seq= ttl= time=16.2 ms
bytes from 10.0.0.2: icmp_seq= ttl= time=1.77 ms

现在主机1中的虚拟机vm1和netns虚拟网络空间是互通了。

再次,创建一对网卡,net1-in是前半段,net1-out是后半段,就像网线一样,前半段我们接到netns上,后半段接到br-out上,这样就在同一个网络里面了

# ip link add net1-in type veth peer name net1-out
# ifconfig net1-in up
# ifconfig net1-out up 将net1-in 添加到netns中
# ip link set dev net1-in name eth1 netns ns1
将net1-out 添加到br-out中
# brctl addif br-out net1-out

因为这里是和第二张物理网卡连接的,这张网卡直接对外网,所以netns 的第二张网卡需要配置主机同网段内地址。

# ip netns exec ns1 ifconfig eth1 192.168.1.130 netmask 255.255.255.0 up

为主机1中的vm1配置路由地址:

# ip route add default via 10.0.0.1
# ping 192.168.1.130
PING 192.168.1.130 (192.168.1.130): data bytes
bytes from 192.168.1.130: seq= ttl= time=18.684 ms
bytes from 192.168.1.130: seq= ttl= time=1.212 ms

这样,就说明vm1已经达到netns中的第二张对外的网卡上。

为netns配置路由地址并添加源地址转发:

# ip netns exec ns1 ip route add default via 192.168.1.1
# ip netns exec ns1 iptables -t nat -A POSTROUTING -s 10.0.0.2/ -j SNAT --to-source 192.168.1.130
# ip netns exec ns1 iptables -t nat -A PREROUTING -d 192.168./ -j DNAT --to-destination 10.0.0.1

从vm1中ping公网地址:

# ping qq.com
PING qq.com (101.226.103.106): data bytes
bytes from 101.226.103.106: seq= ttl= time=48.198 ms
bytes from 101.226.103.106: seq= ttl= time=49.612 ms

这样我们就实现了内网主机中的虚拟主机访问外网。

【 Linux 网络虚拟化 】Openvswitch的更多相关文章

  1. linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...

  2. Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)

    作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...

  3. linux 网络虚拟化: network namespace 简介

    linux 网络虚拟化: network namespace 简介 network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息.不管是虚拟机还是 ...

  4. 【 Linux 网络虚拟化 】Netns

    netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等.总之,与网络有关的组件都是独立的. 创建网络空间: # ip netns ...

  5. 网络虚拟化技术(一): Linux网络虚拟化

    创建虚拟网络环境 使用命令 $ ip netns add net0 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables, ...

  6. 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  7. 网络虚拟化基础一:linux名称空间Namespaces

    一 介绍 如果把linux操作系统比作一个大房子,那命名空间指的就是这个房子中的一个个房间,住在每个房间里的人都自以为独享了整个房子的资源,但其实大家仅仅只是在共享的基础之上互相隔离,共享指的是共享全 ...

  8. Neutron 理解 (1): Neutron 所实现的网络虚拟化 [How Neutron Virtualizes Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的网络虚拟化 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  9. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...

随机推荐

  1. pyinstaller加密打包

    pyinstaller -F -w --key=keys --clean --icon=imgs/xxx.ico xxx.py

  2. 测试理论--branch testing and boundary testing

    1 branch testing 分支测试 测试代码的所有分支 2 boundary testing 测试 程序的限制条件

  3. URAL 1732 Ministry of Truth(KMP)

    Description In whiteblack on blackwhite is written the utterance that has been censored by the Minis ...

  4. SQLServer数据库慢查询追踪

    不喜欢跟研发扯淡,说点击功能慢,是网络.服务器.运维的锅, 甩手给你打开慢查询,时间超过5s的全部抓取,已经很仁慈了,才抓取大于5s的SQL语句..... SQL SERVER 2014数据库慢查询追 ...

  5. 辨析ADK&JVM&JRE&JDK&ADT

    一.SDK 英文全称:Software Development Kit 中文译名:软件开发工具包 详解: 由第三方服务商提供的实现软件产品某项功能的工具包. 为了扩展软件功能或其它方面而设计出来给开发 ...

  6. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  7. Mininet简单性能测试

    建一个简单的模型,使用一个单交换机,然后链接n个主机形成拓扑,然后对每个链路设置带宽,延迟时间,和丢包率. 这里就选择建一个单交换机和六个主机的作为例子. 创建py脚本生成拓扑:写一个类生成一个单交换 ...

  8. 【EasyNetQ】- 请求回复

    EasyNetQ还支持请求/响应消息传递模式.这使得实现客户端/服务器应用程序变得容易,客户端向服务器发出请求,然后服务器处理请求并返回响应.与传统的RPC机制不同,EasyNetQ请求/响应操作没有 ...

  9. SRM709 div1 Xscoregame(状压dp)

    题目大意: 给定一个序列a,包含n个数(n<=15),每个数的大小小于等于50 初始时x = 0,让你每次选a中的一个数y,使得x = x + x^y 问如何安排选择的次序,使得最终结果最大. ...

  10. POJ2155 Matrix 【二维线段树】

    题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...