Open vSwitch + libvirt 搭建vlan网络

网络拓扑结构

创建一个限制VM流量的网络,使用的是Open vSiwitch来实现VM之间的流量隔离。

要实现的网络拓扑如下图。

 

配置环境

  如网络拓扑图所示,我们需要两台物理主机,4台虚拟机。每台物理主机上运行两台虚拟机。

先在host1上进行配置。

创建镜像

  

1 qemu-img create -f qcow2 -o size=20g 镜像名字

 

配置镜像的xml文件

  这是一份比较完整的xml文件,可以根据自己的需求进行更改。

 1 <domain type='kvm'>  //如果是Xen,则type=‘xen’
 2   <name>vm0</name> //虚拟机名称,同一物理机唯一
 3   <uuid>fd3535db-2558-43e9-b067-314f48211343</uuid>  //同一物理机唯一,可用uuidgen生成
 4   <memory>524288</memory>
 5   <currentMemory>524288</currentMemory>  //memory这两个值最好设成一样
 6   <vcpu>2</vcpu>            //虚拟机可使用的cpu个数,查看物理机可用CPU个数:cat /proc/cpuinfo |grep processor | wc -l 
 7   <os>
 8    <type arch='x86_64' machine='pc-i440fx-vivid'>hvm</type> //arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?
 9    <boot dev='hd'/>  //启动介质,第一次需要装系统可以选择cdrom光盘启动
10    <bootmenu enable='yes'/>  //表示启动按F12进入启动菜单
11   </os>
12   <features>
13    <acpi/>  //Advanced Configuration and Power Interface,高级配置与电源接口
14    <apic/>  //Advanced Programmable Interrupt Controller,高级可编程中断控制器
15    <pae/>   //Physical Address Extension,物理地址扩展
16   </features>
17   <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间
18   <on_poweroff>destroy</on_poweroff>  //突发事件动作
19   <on_reboot>restart</on_reboot>
20   <on_crash>restart</on_crash>
21   <devices>   //设备配置
22    <emulator>/usr/bin/kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm
23    <disk type='file' device='disk'> //硬盘
24       <driver name='qemu' type='raw'/>
25       <source file='/opt/vm/vmdev/fdisk.img'/>
26       <target dev='vda' bus='virtio'/>
27       <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> //域、总线、槽、功能号,slot值同一虚拟机上唯一
28    </disk>
29    <disk type='file' device='disk'>  
30       <driver name='qemu' type='raw'/> 
31       <source file='/opt/vm/vmdev/fdisk2.img'/>
32       <target dev='vdb' bus='virtio'/>  
33    </disk>
34    <disk type='file' device='cdrom'>//光盘
35       <driver name='qemu' type='raw'/>
36       <source file='/opt/vm/vmiso/ubuntu-15.10-server-amd64.iso'/>
37       <target dev='hdc' bus='ide'/>
38       <readonly/>
39    </disk>
40 
41    /* 利用Linux网桥连接网络 */
42    <interface type='bridge'>   
43       <mac address='fa:92:01:33:d4:fa'/> 
44       <source bridge='br100'/>  //配置的网桥网卡名称
45       <target dev='vnet0'/>     //同一网桥下相同
46       <alias name='net0'/>      //别名,同一网桥下相同
47       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>  //注意slot值唯一
48    </interface>
49 
50    /* 利用ovs网桥连接网络 */
51    <interface type='bridge'>  
52       <source bridge='br-ovs0'/>  
53       <virtualport type='openvswitch'/>
54       <target dev='tap0'/>     
55       <model type='virtio'/>  
56    </interface>
57 
58     /* 配置成pci直通虚拟机连接网络,SR-IOV网卡的VF场景 */
59    <hostdev mode='subsystem' type='pci' managed='yes'>
60      <source>
61        <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
62      </source>
63    </hostdev>
64 
65    /* 利用vhostuser连接ovs端口 */
66    <interface type='vhostuser'>   
67       <mac address='fa:92:01:33:d4:fa'/> 
68       <source type='unix' path='/var/run/vhost-user/tap0' mode='client'/>  
69       <model type='virtio'/>     
70       <driver vringbuf='2048'/>     
71       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>  
72    </interface>
73 
74    <interface type='network'>   //基于虚拟局域网的网络
75      <mac address='52:54:4a:e1:1c:84'/>  //可用命令生成,见下面的补充
76      <source network='default'/> //默认
77      <target dev='vnet1'/>  //同一虚拟局域网的值相同
78      <alias name='net1'/>
79      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>  //注意slot值
80    </interface>
81   <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us'/>  //配置vnc,windows下可以使用vncviewer登录,获取vnc端口号:virsh vncdisplay vm0
82    <listen type='address' address='0.0.0.0'/>
83   </graphics>
84   </devices>
85 </domain>

启动虚拟机

  

1 virsh create filename.xml 

 

建立OVS网桥

  

[root@localhost ~]#ovs-vsctl add-br br0

 

将网卡加入网桥

  

[root@localhost ~]#ovs-vsctl add-port  br0 eth0 

  注:当eth0挂在网桥上时,之前分配给eth0的所有IP地址都将消失,所以需要重新配置IP地址。

 

为虚拟机建立access端口并打上tag标记

  

[root@localhost ~]#ovs-vsctl add-port  tap0

[root@localhost ~]#ovs-vsctl add-port  tap1

 

此时两台host都经过上面的配置流程后是可以互相ping通的。

 

为了隔离VM之间的流量我们需要tag标记,相同的标记之间可以互相通信。

[root@localhost ~]#ovs-vsctl set port  tap0  tag=100

[root@localhost ~]#ovs-vsctl set port  tap1  tag=200

 

也可以这样:

[root@localhost ~]#ovs-vsctl add-port br0 tap0 tag=100

 

使用VNC运行虚拟机&进行配置IP

 

在为vm1 vm2配置IP

ifconfig  eth0(网卡名) ip (同一子网的ip地址

 

host2上进行相同配置即可。

 

最后

  可以按照自己的喜好进行tag标记,最后的结果就是相同tag可以通信,不同tag不能通信。

posted @ 2018-08-09 15:41 L1m1t 阅读(...) 评论(...) 编辑 收藏