基于LXC的虚拟网络自动部署
一、问题:
在搭建以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种控制方法:
- create:解析xml,生成控制脚本,生成容器、网桥等组件。
- start:启动网桥,启动容器。
- stop:停止容器,关闭网桥。
- destroy:删除网桥与容器。
- show:显示网络配置信息。
基于LXC的虚拟网络自动部署的更多相关文章
- 基于webhook方案的Git自动部署方案
之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...
- 开源虚拟化KVM(三)管理虚拟网络
六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...
- Linux实战教学笔记55:开源虚拟化KVM(三)管理虚拟网络
六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...
- Windows Azure 虚拟网络中虚拟机的网络隔离选项
最近我们发布了一份<Windows网络安全白皮书>(单击此处下载),文中深入说明了客户可以如何利用该平台的本地功能,为他们的信息资产提供最好的保护. 由首席顾问Walter Myer ...
- Azure 基础:使用 powershell 创建虚拟网络
什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...
- 在Nginx中部署基于IP的虚拟主机
一.虚拟主机概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能.所谓虚拟主机,也叫"网站空间", 就是把一台运行在 ...
- 通过基于 Linux 的软件 VPN 设备连接到 Windows Azure 虚拟网络
摘要 本文章将说明如何通过使用软件 VPN 设备,将本地办公室或站点连接到 Windows Azure 虚拟网络.在构建原型或在构建可以尽快利用云的"开发/测试"工作流时,软件VP ...
- Centos6.5中Nginx部署基于IP的虚拟…
Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...
- 【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务
问题描述 创建新的Service Fabric集群,可以通过门户,Powershell命令,或者是ARM模板.但是通过门户和PowerShell命令时,创建的SF集群都会自动新建一个虚拟网络而无法使用 ...
随机推荐
- Codeforces 787B Not Afraid( 水 )
链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...
- [tyvj-1061]Mobile Service 动态规划
滚动数组优化一波. 原设计状态:表示三个员工分别的位置和执行到的任务. 考虑到:执行完第i个任务,一定有员工在pos[i],那么就可以压一维,空间复杂度就算不滚动数组也可以了. (喜闻乐见,今天第一次 ...
- 使用shell脚本定时备份web网站代码
#!/bin/bash ############### common file ################ #备份文件存放目录 WEBBACK_DIR="/data/backup/ba ...
- MYSQL数据库常用的LINUX命令
此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start / service mysql restart(重启服务) LINUX系 ...
- EhCache缓存页面、局部页面和对象缓存
页面缓存:SimplePageCachingFilter web.xml <!-- 页面缓存配置,配合ehcache.xml中name为“SimplePageCachingFilter”(默认值 ...
- 转[总结]FFMPEG视音频编解码零基础学习方法 .
http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视 ...
- 在android平台打印C语言日志
在android平台打印C语言日志 1.操作平台:AS2.0 2.步骤如下: 在C代码中添加如下代码: #define LOG_TAG "我的C语言日志:" #define LOG ...
- Ajax发送简单请求案例
所谓简单请求,是指不包含任何参数的请求.这种请求通常用于自动刷新的应用,例如证券交易所的实时信息发送.这种请求通常用于公告性质的响应,公告性质的响应无需客户端的任何请求参数,而是由服务器根据业务数据自 ...
- UI组件之AdapterView及其子类(三)Spinner控件具体解释
Spinner提供了从一个数据集合中高速选择一项值的办法. 默认情况下Spinner显示的是当前选择的值.点击Spinner会弹出一个包括全部可选值的dropdown菜单或者一个dialog对话框,从 ...
- 【Swift】学习笔记(六)——函数
函数 懂编程语言的来说这个是最主要的了,不论什么语言都有函数这个概念.函数就是完毕特定任务的独立代码块. 函数怎么创建: 1.创建一个无參无返回值的函数(实际上全部的函数都有返回值,这个函数返回vo ...