一、實驗環境
1.准備3個CentOS7 mini版本的虛擬機,每個主機3個網卡。如圖:
圖中OVS-1、OVS-2、OVS-3分別為三台CentOS7 mini版虛擬機,分別配備3個虛擬網卡。如圖中編號所示:
網卡1(eno16777736):作為管理網,橋接到辦公網絡。
網卡2(eno33554960):VXLAN VTEP互聯的L3網絡。IP段為10.10.10.0/24
網卡3(eno50332184):用於連接測試用虛擬機,也使用Windows網橋連接。
2.准備好虛擬機后,更新每台虛擬機yum源。
yum install -y wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all;yum makecache;yum -y update; yum install net-tools -y
3.按照安裝過程安裝OVS。
4.三台OVS主機上分別創建br
#添加一個br ovs-vsctl add-br br0 #分別給br0添加一個IP地址,用於VXLAN的測試 ifconfig br0 192.168.100.11 up #OVS-2和OVS-3上分別設置22和33
二、實驗過程
1.添加VTEP
OVS-1:ovs-vsctl add-port br0 vx12 -- set interface vx12 type=vxlan options:remote_ip=10.10.10.22
OVS-1:ovs-vsctl add-port br0 vx13 -- set interface vx13 type=vxlan options:remote_ip=10.10.10.33
OVS-2:ovs-vsctl add-port br0 vx21 -- set interface vx21 type=vxlan options:remote_ip=10.10.10.11
OVS-3:ovs-vsctl add-port br0 vx31 -- set interface vx31 type=vxlan options:remote_ip=10.10.10.11
形成下面拓撲:
圖中,OVS-1中的Br0上創建了兩個VTEP,這兩個VTEP的remote_ip分別是10.10.10.22和10.10.10.33。
同樣的,OVS-2中創建一個Remote_IP為10.10.10.11。OVS-3中也創建一個Remote_IP為10.10.10.11。
這樣就創建了兩條VXLAN隧道,默認VNI為0。
此時,測試VXLAN是否能夠ping通:
[root@OVS-1 ~]# ping 192.168.100.22 PING 192.168.100.22 (192.168.100.22) 56(84) bytes of data. 64 bytes from 192.168.100.22: icmp_seq=1 ttl=64 time=1.16 ms 64 bytes from 192.168.100.22: icmp_seq=2 ttl=64 time=1.30 ms
[root@OVS-1 ~]# ping 192.168.100.33 PING 192.168.100.33 (192.168.100.33) 56(84) bytes of data. 64 bytes from 192.168.100.33: icmp_seq=1 ttl=64 time=1.43 ms 64 bytes from 192.168.100.33: icmp_seq=2 ttl=64 time=1.51 ms
[root@OVS-3 ~]# ping 192.168.100.11 PING 192.168.100.11 (192.168.100.11) 56(84) bytes of data. 64 bytes from 192.168.100.11: icmp_seq=1 ttl=64 time=1.28 ms 64 bytes from 192.168.100.11: icmp_seq=2 ttl=64 time=1.32 ms
[root@OVS-2 ~]# ping 192.168.100.11 PING 192.168.100.11 (192.168.100.11) 56(84) bytes of data. 64 bytes from 192.168.100.11: icmp_seq=1 ttl=64 time=1.28 ms 64 bytes from 192.168.100.11: icmp_seq=2 ttl=64 time=1.59 ms
說明,上述拓撲圖中VXLAN是成功的。
3.使用option:key=5000可以指定每個隧道的VNI:
例如:
OVS-1:ovs-vsctl add-port br0 vx12 -- set interface vx12 type=vxlan options:remote_ip=10.10.10.22 option:key=5000
OVS-1:ovs-vsctl add-port br0 vx13 -- set interface vx13 type=vxlan options:remote_ip=10.10.10.33 option:key=5001
OVS-2:ovs-vsctl add-port br0 vx21 -- set interface vx21 type=vxlan options:remote_ip=10.10.10.11 option:key=5000
OVS-3:ovs-vsctl add-port br0 vx31 -- set interface vx31 type=vxlan options:remote_ip=10.10.10.11 option:key=5001
這樣,拓撲中的兩條隧道的VNI就不同了:
此時,再次測試VXLAN是否能夠ping通:
[root@OVS-1 ~]# ping 192.168.100.22 PING 192.168.100.22 (192.168.100.22) 56(84) bytes of data. 64 bytes from 192.168.100.22: icmp_seq=1 ttl=64 time=1.36 ms 64 bytes from 192.168.100.22: icmp_seq=2 ttl=64 time=0.986 ms
同樣,在這種情況下(VNI不同),通訊也是OK的。
從這里,得出結論,每個VXLAN隧道是獨立工作的。由於三台虛擬機上的Br0未划分VLAN網段,所以相當於三個Br0通過VXLAN隧道組成了一個L2網絡。
4.雲平台中使用VXLAN隔離租戶原理
在雲平台中如何使用VXLAN來隔離租戶:
當在雲平台中,例如Openstack中選擇使用VXLAN作為網絡模式。那么意味着,每個租戶使用一個VNI來進行隔離,一共可以支持成百上千萬個租戶。
上圖中:
G、H為兩個VTEP,形成VXLAN隧道,兩端IP為10.0.100.88和10.0.100.77。
br-tun和br-int一般載體是OVS,供多租戶共享,每個租戶的數據包在G和H處進行封裝,使用不同的VNI隔離。
qbr-xxx是虛擬機獨享的,載體是linux bridge。因為OVS無法支持基於iptables規則的安全組功能,所以只能使用Linux bridge來實現安全組功能。
報文出的過程:
1.報文從VM1-1的A端口發出,是Untag報文。
2.報文從B口進入qbr-xxx,再從C端口離開qbr-xxx,也是Untag報文。
3.報文從D端口進入br-int,在D端口,報文被打上標簽,VLAN ID=10。
4.報文從E端口離開br-int,此時報文VID=10。
5.報文從F端口進入br-tun,此時報文VID=10。
6.報文從G端口離開Host,在G端口,報文被再次封裝為VXLAN報文,外層VID=5000。