【 Linux 网络虚拟化 】Openvswitch
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的更多相关文章
- linux网络虚拟化
图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...
- Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)
作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...
- linux 网络虚拟化: network namespace 简介
linux 网络虚拟化: network namespace 简介 network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息.不管是虚拟机还是 ...
- 【 Linux 网络虚拟化 】Netns
netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等.总之,与网络有关的组件都是独立的. 创建网络空间: # ip netns ...
- 网络虚拟化技术(一): Linux网络虚拟化
创建虚拟网络环境 使用命令 $ ip netns add net0 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables, ...
- 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- 网络虚拟化基础一:linux名称空间Namespaces
一 介绍 如果把linux操作系统比作一个大房子,那命名空间指的就是这个房子中的一个个房间,住在每个房间里的人都自以为独享了整个房子的资源,但其实大家仅仅只是在共享的基础之上互相隔离,共享指的是共享全 ...
- Neutron 理解 (1): Neutron 所实现的网络虚拟化 [How Neutron Virtualizes Network]
学习 Neutron 系列文章: (1)Neutron 所实现的网络虚拟化 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)
网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...
随机推荐
- POJ 2168 Joke with Turtles(DP)
Description There is a famous joke-riddle for children: Three turtles are crawling along a road. One ...
- 基于bootstrap动态分页
bootstrap本身的分页有分页组件 但是却是静态的,无法满足要求,分页必须根据当前的总页数来展示 使用插件bootstrap-paginator github下载地址 https://github ...
- java基础知识(一)- 数据类型
Java有两大数据类型: 基本数据类型,基本数据类型都可以直接分配到栈中 引用数据类型,引用存放在栈中,对象本身存放在堆中 基本数据类型共有四类八种 第一类:字符型(char) 第二类:逻辑型(boo ...
- Java中动态代理实现原理深究
一.前言 笔者平时开发使用“动态代理”不多,最近在看设计模式的时候,“动态代理”又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理 本文源码 ...
- hdu6103 Kirinriki(trick+字符串)
题解: 考虑一开始时,左边从1开始枚举,右边从n开始枚举 我们可以得到一个最大的值k. 但是如果这样依次枚举,复杂度肯定是n^3,是不行的 考虑如何利用上一次的结果,如果我们把1和n同时去掉 就可以利 ...
- 【题解】HAOI2008木棍分割
对于这道题目的两问,第一问直接二分答案求出最短长度.关键在于第二问应当如何求:建立dp方程,dp[i][j]代表到第i个分界线,切了j次(强制在第i处切一刀.这样就不会对后面的状态产生影响).状态转移 ...
- Linux和Windows上实现的异同-Linux的自适应ACK
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...
- VS的ncb、pdb文件分析
原文链接地址:http://blog.csdn.net/changbaolong/article/details/7472685 NCB是"No Compile ...
- 【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
读了一下题就会很愉快的发现,这个数列是关于p的幂次的斐波那契数列,很愉快,然后就很愉快的发现可以矩阵快速幂一波,然后再一看数据范围就......然后由于上帝与集合对我的正确启示,我就发现这个东西可以用 ...
- ng4转义html
https://stackoverflow.com/questions/31548311/angular-html-binding <div [innerHTML]="content& ...