基于LXC的虚拟网络自动部署
在搭建以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
p { margin-bottom: 0.25cm; line-height: 115% }
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.1.type
= veth
lxc.net.1.link
= br-s1-h1
lxc.net.1.flags
= up
lxc.net.1.hwaddr
= 00:16:3e:4b:08:19
lxc.net.1.ipv4.address
= 192.168.1.1/24
lxc.net.1.ipv4.gateway
= 192.168.1.254
switch节点
第一步:修改网络配置
配置文件位置:/var/lib/lxc/switchname/config
追加内容:
lxc.net.1.type
= veth
lxc.net.1.link
= br-s1-h1
lxc.net.1.flags
= up
lxc.net.1.hwaddr
= 00:16:3e:47:65:38
lxc.net.2.type
= veth
lxc.net.2.link
= br-s1-h2
lxc.net.2.flags
= up
lxc.net.2.hwaddr
= 00:16:3e:47:65:39
lxc.net.3.type
= veth
lxc.net.3.link
= br-r1-s1
lxc.net.3.flags
= up
lxc.net.3.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.1.type
= veth
lxc.net.1.link
= br-r1-s1
lxc.net.1.flags
= up
lxc.net.1.ipv4.address
= 10.0.1.254/24
lxc.net.1.hwaddr
= 00:16:3e:c1:1b:fb
lxc.net.2.type
= veth
lxc.net.2.link
= br-r1-r2
lxc.net.2.flags
= up
lxc.net.2.ipv4.address
= 10.0.0.1/24
lxc.net.2.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
!
p { margin-bottom: 0.25cm; line-height: 115% }
控制运行脚本
create.sh
1 #!/bin/bash 2 sudo lxc-copy -n host_example -N h1 3 sudo lxc-copy -n host_example -N h2 4 sudo lxc-copy -n host_example -N h3 5 sudo lxc-copy -n host_example -N h4 6 sudo lxc-copy -n host_example -N h5 7 sudo lxc-copy -n ovs_example -N s1 8 sudo lxc-copy -n ovs_example -N s2 9 sudo lxc-copy -n router_example -N r1 10 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
1 #!/bin/bash 2 3 sudo lxc-stop -n h1 4 sudo lxc-stop -n h2 5 sudo lxc-stop -n h3 6 sudo lxc-stop -n h4 7 sudo lxc-stop -n h5 8 sudo lxc-stop -n s1 9 sudo lxc-stop -n s2 10 sudo lxc-stop -n r1 11 sudo lxc-stop -n r2 12 13 sudo ifconfig br-s1-h1 down 14 sudo ifconfig br-s1-h2 down 15 sudo ifconfig br-s2-h3 down 16 sudo ifconfig br-s2-h4 down 17 sudo ifconfig br-r1-s1 down 18 sudo ifconfig br-r2-s2 down 19 sudo ifconfig br-r2-h5 down 20 sudo ifconfig br-r1-r2 down 21 22 sudo brctl delbr br-s1-h1 23 sudo brctl delbr br-s1-h2 24 sudo brctl delbr br-s2-h3 25 sudo brctl delbr br-s2-h4 26 sudo brctl delbr br-r1-s1 27 sudo brctl delbr br-r2-s2 28 sudo brctl delbr br-r2-h5 29 sudo brctl delbr br-r1-r2
stop.sh
destroy.sh
1 #!/bin/bash 2 3 sudo lxc-destroy -n h1 4 sudo lxc-destroy -n h2 5 sudo lxc-destroy -n h3 6 sudo lxc-destroy -n h4 7 sudo lxc-destroy -n h5 8 sudo lxc-destroy -n s1 9 sudo lxc-destroy -n s2 10 sudo lxc-destroy -n r1 11 sudo lxc-destroy -n r2
destroy.sh
p { margin-bottom: 0.25cm; direction: ltr; line-height: 115%; text-align: justify }
a:link { color: rgba(5, 99, 193, 1) }
六、客户端控制
设置5种控制方法:
- create:解析xml,生成控制脚本,生成容器、网桥等组件。
- start:启动网桥,启动容器。
- stop:停止容器,关闭网桥。
- destroy:删除网桥与容器。
- show:显示网络配置信息。