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不能通信。