一、问题:

在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐。面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络。因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令。不仅能加快网络的部署时间,更使网络拓扑结构的改变更加灵活。使构建大规模的网络拓扑成为可能。

二、相关组件与工具:

LXC:用于承载虚拟网络节点,在LXC中安装OVS,Quagga等工具,使容器成为虚拟网络组件。

OVS:交换机组件。ovs创建网桥,每一个网桥相当于一个交换机。

Quagga:路由器组件。

Brctl:网桥工具。连接不同的容器。

三、拓扑示例:

四、常用指令:

lxc基本操作:

文档:https://linuxcontainers.org/

查看容器状态

lxc-ls -f

启动容器

lxc-start -n containerName

控制容器

lxc-console -n containerName

退出控制

ctrl-a和q

停止容器运行

sudo lxc-stop -n containerName

删除容器

sudo lxc-destroy -n containerName

克隆容器

lxc-copy -n container -N clone_container

OVS基本操作:

文档:http://www.openvswitch.org/

查看网桥信息

ovs-vsctl show

创建一个网桥

ovs-vsctl add-br br0

添加/删除网桥上的端口

ovs-vsctl add-port br0 eth1

ovs-vsctl del-port br0 eth1

查看某网桥当前流表

ovs-ofctl dump-flows br0

Quagga基本操作:

文档:https://www.quagga.net/docs.html

Brctl基本操作:

添加网桥

brctl addbr br1

删除网桥

brctl delbr br1

查询网桥信息

brctl show

brctl show br1

启动网桥

ifconfig br1 up

五、部署流程

创建相应的容器模板:example_host,example_switcher,example_router

1.编写XML配置文件

下面给出例子

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<topo>
<container type = "router">
<name>Router1</name>
<id>1</id>
<protocol>rip</protocol> <port>
<id>1</id>
<ip>10.0.1.254</ip>
<netmask>255.255.255.0</netmask>
<link>
<type>switch</type>
<id>1:3</id>
</link>
</port> <port>
<id>2</id>
<ip>10.0.0.1</ip>
<netmask>255.255.255.0</netmask>
<link>
<type>router</type>
<id>2:3</id>
</link>
</port>
</container> <container type = "router">
<name>Router2</name>
<id>2</id>
<protocol>rip</protocol> <port>
<id>1</id>
<ip>10.0.2.254</ip>
<netmask>255.255.255.0</netmask>
<link>
<type>switch</type>
<id>2:3</id>
</link>
</port> <port>
<id>2</id>
<ip>10.0.4.254</ip>
<netmask>255.255.255.0</netmask>
<link>
<type>host</type>
<id>5:1</id>
</link>
</port> <port>
<id>3</id>
<ip>10.0.0.2</ip>
<netmask>255.255.255.0</netmask>
<link>
<type>router</type>
<id>1:2</id>
</link>
</port>
</container> <container type="switch">
<name>Switch1</name>
<id>1</id> <bridge>
<name>br1</name>
<id>1</id> <port>
<id>1</id>
<link>
<type>host</type>
<id>1:1</id>
</link>
</port> <port>
<id>2</id>
<link>
<type>host</type>
<id>2:1</id>
</link>
</port> <port>
<id>3</id>
<link>
<type>router</type>
<id>1:1</id>
</link>
</port>
</bridge>
</container> <container type="switch">
<name>Switch2</name>
<id>2</id> <bridge>
<name>br1</name>
<id>1</id> <port>
<id>1</id>
<link>
<type>host</type>
<id>3:1</id>
</link>
</port> <port>
<id>2</id>
<link>
<type>host</type>
<id>4:1</id>
</link>
</port> <port>
<id>3</id>
<link>
<type>router</type>
<id>2:1</id>
</link>
</port>
</bridge> </container> <container type="host">
<name>Host1</name>
<id>1</id>
<port>
<id>1</id>
<ip>10.0.1.1</ip>
<netmask>255.255.255.0</netmask>
<gateway>10.0.1.254</gateway>
<link>
<type>switch</type>
<id>1:1</id>
</link>
</port>
</container> <container type="host">
<name>Host2</name>
<id>2</id>
<port>
<id>1</id>
<ip>10.0.1.2</ip>
<netmask>255.255.255.0</netmask>
<gateway>10.0.1.254</gateway>
<link>
<type>switch</type>
<id>1:2</id>
</link>
</port>
</container> <container type="host">
<name>Host3</name>
<id>3</id>
<port>
<id>1</id>
<ip>10.0.2.1</ip>
<netmask>255.255.255.0</netmask>
<gateway>10.0.2.254</gateway>
<link>
<type>switch</type>
<id>2:1</id>
</link>
</port>
</container> <container type="host">
<name>Host4</name>
<id>4</id>
<port>
<id>1</id>
<ip>10.0.2.2</ip>
<netmask>255.255.255.0</netmask>
<gateway>10.0.2.254</gateway>
<link>
<type>switch</type>
<id>2:2</id>
</link>
</port>
</container> <container type="host">
<name>Host5</name>
<id>5</id>
<port>
<id>1</id>
<ip>10.0.4.1</ip>
<netmask>255.255.255.0</netmask>
<gateway>10.0.4.254</gateway>
<link>
<type>router</type>
<id>2:2</id>
</link>
</port>
</container>
</topo>

配置文档

2.解析XML配置文件

dom4j解析XML生成相应对象

3.修改相应配置LXC相应配置文件,生成命令脚本

容器目录:/var/lib/lxc/s1/rootfs

host节点

修改网络配置

配置文件位置:/var/lib/lxc/hostname/config

追加内容:

lxc.net..type
= veth

lxc.net..link
= br-s1-h1

lxc.net..flags
= up

lxc.net..hwaddr
= 00:16:3e:4b:08:19

lxc.net..ipv4.address
= 192.168.1.1/24

lxc.net..ipv4.gateway
= 192.168.1.254

switch节点

第一步:修改网络配置

配置文件位置:/var/lib/lxc/switchname/config

追加内容:

lxc.net.1.type
= veth

lxc.net..link
= br-s1-h1

lxc.net..flags
= up

lxc.net..hwaddr
= 00:16:3e:47:65:38

lxc.net..type
= veth

lxc.net..link
= br-s1-h2

lxc.net.2.flags
= up

lxc.net..hwaddr
= 00:16:3e:47:65:39

lxc.net..type
= veth

lxc.net..link
= br-r1-s1

lxc.net..flags
= up

lxc.net..hwaddr
= 00:16:3e:47:65:40

第二步:设置启动脚本

在ovs_example(switch模板)中设置启动脚本:

/etc/rc.local

/etc/init.d/switch.sh

启动时调用switch.sh脚本

启动脚本范例:

vim
/etc/init.d/switch.sh

#!/bin/bash

sudo
ovs-vsctl add-br br1

sudo
ovs-vsctl add-port br1 eth1

sudo
ovs-vsctl add-port br1 eth2

sudo
ovs-vsctl add-port br1 eth3

添加switch.sh执行权

sudo
chmod +x /var/lib/lxc/Switch2/rootfs/etc/init.d/switch.sh

router节点

第一步:修改网络配置

配置文件位置:/var/lib/lxc/routername/config

追加内容:

lxc.net..type
= veth

lxc.net..link
= br-r1-s1

lxc.net.1.flags
= up

lxc.net..ipv4.address
= 10.0.1.254/24

lxc.net..hwaddr
= 00:16:3e:c1:1b:fb

lxc.net..type
= veth

lxc.net..link
= br-r1-r2

lxc.net..flags
= up

lxc.net..ipv4.address
= 10.0.0.1/24

lxc.net..hwaddr
= 00:16:3e:c1:1b:fc

第二步:设置启动脚本

/etc/rc.local

在exit
0 之上添加命令
sudo
/etc/init.d/quagga restart

第三步:修改路由器配置文件(rip为例

配置文件位置:/etc/quagga/ripd.conf

源文件:

!
-*- rip -*-

!

!
RIPd sample configuration file

!

!
$Id: ripd.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $

!

hostname
ripd

password
zebra

!

!
debug rip events

!
debug rip packet

!

router
rip

!
network 11.0.0.0/8

!
network eth0

!
route 10.0.0.0/8

!
distribute-list private-only in eth0

!

!access-list
private-only permit 10.0.0.0/8

!access-list
private-only deny any

!

!log
file /var/log/quagga/ripd.log

!

log
stdout

修改范例(指定直连网络):

!

hostname
ripd

password
zebra

log
stdout

!

router
rip

network
10.0.0.0/24

network
10.0.2.0/24

network
10.0.4.0/24

!

line
vty

!

控制运行脚本

create.sh

 #!/bin/bash
sudo lxc-copy -n host_example -N h1
sudo lxc-copy -n host_example -N h2
sudo lxc-copy -n host_example -N h3
sudo lxc-copy -n host_example -N h4
sudo lxc-copy -n host_example -N h5
sudo lxc-copy -n ovs_example -N s1
sudo lxc-copy -n ovs_example -N s2
sudo lxc-copy -n router_example -N r1
sudo lxc-copy -n router_example -N r2

createsh

start.sh

#!/bin/bash

sudo brctl addbr br-s1-h1
sudo brctl addbr br-s1-h2
sudo brctl addbr br-s2-h3
sudo brctl addbr br-s2-h4
sudo brctl addbr br-r1-s1
sudo brctl addbr br-r2-s2
sudo brctl addbr br-r2-h5
sudo brctl addbr br-r1-r2 sudo ifconfig br-s1-h1 up
sudo ifconfig br-s1-h2 up
sudo ifconfig br-s2-h3 up
sudo ifconfig br-s2-h4 up
sudo ifconfig br-r1-s1 up
sudo ifconfig br-r2-s2 up
sudo ifconfig br-r2-h5 up
sudo ifconfig br-r1-r2 up sudo lxc-start -n h1
sudo lxc-start -n h2
sudo lxc-start -n h3
sudo lxc-start -n h4
sudo lxc-start -n h5
sudo lxc-start -n s1
sudo lxc-start -n s2
sudo lxc-start -n r1
sudo lxc-start -n r2

start.sh

stop.sh

 #!/bin/bash

 sudo lxc-stop -n h1
sudo lxc-stop -n h2
sudo lxc-stop -n h3
sudo lxc-stop -n h4
sudo lxc-stop -n h5
sudo lxc-stop -n s1
sudo lxc-stop -n s2
sudo lxc-stop -n r1
sudo lxc-stop -n r2 sudo ifconfig br-s1-h1 down
sudo ifconfig br-s1-h2 down
sudo ifconfig br-s2-h3 down
sudo ifconfig br-s2-h4 down
sudo ifconfig br-r1-s1 down
sudo ifconfig br-r2-s2 down
sudo ifconfig br-r2-h5 down
sudo ifconfig br-r1-r2 down sudo brctl delbr br-s1-h1
sudo brctl delbr br-s1-h2
sudo brctl delbr br-s2-h3
sudo brctl delbr br-s2-h4
sudo brctl delbr br-r1-s1
sudo brctl delbr br-r2-s2
sudo brctl delbr br-r2-h5
sudo brctl delbr br-r1-r2

stop.sh

destroy.sh

 #!/bin/bash

 sudo lxc-destroy -n h1
sudo lxc-destroy -n h2
sudo lxc-destroy -n h3
sudo lxc-destroy -n h4
sudo lxc-destroy -n h5
sudo lxc-destroy -n s1
sudo lxc-destroy -n s2
sudo lxc-destroy -n r1
sudo lxc-destroy -n r2

destroy.sh

六、客户端控制

设置5种控制方法:

  1. create:解析xml,生成控制脚本,生成容器、网桥等组件。
  2. start:启动网桥,启动容器。
  3. stop:停止容器,关闭网桥。
  4. destroy:删除网桥与容器。
  5. show:显示网络配置信息。

基于LXC的虚拟网络自动部署的更多相关文章

  1. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  2. 开源虚拟化KVM(三)管理虚拟网络

    六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...

  3. Linux实战教学笔记55:开源虚拟化KVM(三)管理虚拟网络

    六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...

  4. Windows Azure 虚拟网络中虚拟机的网络隔离选项

     最近我们发布了一份<Windows网络安全白皮书>(单击此处下载),文中深入说明了客户可以如何利用该平台的本地功能,为他们的信息资产提供最好的保护. 由首席顾问Walter Myer ...

  5. Azure 基础:使用 powershell 创建虚拟网络

    什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...

  6. 在Nginx中部署基于IP的虚拟主机

    一.虚拟主机概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能.所谓虚拟主机,也叫"网站空间", 就是把一台运行在 ...

  7. 通过基于 Linux 的软件 VPN 设备连接到 Windows Azure 虚拟网络

    摘要 本文章将说明如何通过使用软件 VPN 设备,将本地办公室或站点连接到 Windows Azure 虚拟网络.在构建原型或在构建可以尽快利用云的"开发/测试"工作流时,软件VP ...

  8. Centos6.5中Nginx部署基于IP的虚拟…

    Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...

  9. 【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务

    问题描述 创建新的Service Fabric集群,可以通过门户,Powershell命令,或者是ARM模板.但是通过门户和PowerShell命令时,创建的SF集群都会自动新建一个虚拟网络而无法使用 ...

随机推荐

  1. 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

    大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...

  2. 配置sudo命令行为审计

    1.检查是否安装 rpm -aq sudo rsyslog #检验是否安装此软件 ***如果没有需执行(yum install sudo rsyslog -y)安装*** 2.配置审计 echo &q ...

  3. 【codeforces 723F】st-Spanning Tree

    [题目链接]:http://codeforces.com/contest/723/problem/F [题意] 给你一张图; 让你选择n-1条边; 使得这张图成为一颗树(生成树); 同时s的度数不超过 ...

  4. nyoj 38 简单并查集的应用&最小生成树

    #include<stdio.h> #include<stdlib.h> #define inf 0x3fffffff #define N 600 struct node { ...

  5. 全球级的分布式数据库 Google Spanner原理

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>    Google Spanner简介 Spanner 是Google的全球级的分布式数据库 (Globally-Di ...

  6. Servlet过滤器和监听器知识总结

    Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能够在客户端请求到达 Servlet资源之前被截 ...

  7. Eclipse开发C/C++程序的MinGw配置

    环境变量设置: a.鼠标右击桌面"计算机"(WindowsXp是"我的电脑")->"属性" b.WindowsXP时,在新弹出的属性窗 ...

  8. Visual C++ 经常使用快捷键

    大写和小写 Ctrl+Shift+U: 所有变为大写 Ctrl+U: 所有变为小写 凝视 Ctrl+K+Crtr+C: 凝视选定内容  Ctrl+K+Crtr+U: 取消选定凝视内容 折叠 折叠代码: ...

  9. Cocos2d-x 动手实现游戏主循环

    因为Cocos2d-x封装的非常好,所以对于非常多新手,他们仅仅知道先new一个场景,在场景上加入布景或精灵,然后用Director的runWithScene便能够执行游戏了.假设给一个精灵加个动作, ...

  10. mysql安装出错cannot create windows service for mysql.error:0

    配置时最后一步出现不能启动mysql 解决成功的办法:[MySQL] Could not start the service MySQL 解决方法 安装mysql 5.1.33,在运行Server I ...