1. 前言
为了加深对VxLAN网络模式的理解,郝同学打算使用Open vSwitch进行VxLAN隧道实验。主要参考搭建基于Open vSwitch的VxLAN隧道实验和基于Open vSwitch的VxLAN隧道实验网络。
2. 虚拟机准备
使用VirtualBox创建两个虚拟机,主机名分别为controller和compute,系统均为ubuntu-16.04.4-server-amd64。
这两台虚拟机,都有两块网卡。eth0负责主机间相互通信,eth1负责上网。controller的eth0的IP为192.168.56.110,compute的eth0的IP为192.168.56.111。controller和compute可以互相ping通。
3. 安装openvswitch
通过源码安装参考Open vSwitch on Linux, FreeBSD and NetBSD,这里我们不使用源码安装,而是使用apt包管理工具直接安装,参考Debian安装openvswitch。
一条命令搞定:
1 | apt -y install openvswitch-switch openvswitch-common openvswitch-switch-dpdk |
4. 实验一
4.1. 目标
如上图,分别给两台虚拟机的br1指定两个 相同网段 的ip,然后通过搭建VXLAN隧道让这两个不同机器的网桥能够实现通信。
4.2. controller
1、在controller上添加br0和br1两个网桥
1 | ovs-vsctl add-br br0 |
2、查看网桥ovs-vsctl show
3、在br0上添加一个端口,将eth0挂载到br0上。这样做的目的是方便我们在虚拟网桥上添加多个端口供我们使用,这样不必受限于eth0的有限端口。ovs-vsctl add-port br0 eth0
4、此时我们将原先eth0分配的ip清除并指定给br0,让虚拟机网络能通过br0继续工作。
1 | ifconfig eth0 0 up |
5、根据实际情况配置一下br0的网关(可选)。route add default gw 192.168.56.1 br0
6、给网桥br1分配一个ip。ifconfig br1 172.16.0.1/24 up
7、查看ipifconfig
4.3. ip永久生效
以上ip配置,在重启后会失效,要想永久有效,需要修改interfaces配置。vim /etc/network/interfaces
,如下修改:
1 | auto eth0 |
4.4. compute
1、在compute上添加br0和br1两个网桥
1 | ovs-vsctl add-br br0 |
2、在br0上添加一个端口,将eth0挂载到br0上。这样做的目的是方便我们在虚拟网桥上添加多个端口供我们使用,这样不必受限于eth0的有限端口。ovs-vsctl add-port br0 eth0
3、此时我们将原先eth0分配的ip清除并指定给br0,让虚拟机网络能通过br0继续工作。
1 | ifconfig eth0 0 up |
4、根据实际情况配置一下br0的网关(可选)。route add default gw 192.168.56.1 br0
5、给网桥br1分配一个ip。ifconfig br1 172.16.0.2/24 up
4.5. 搭建VxLAN隧道
1、在controller查看连通性
1 | ping 192.168.56.111 -c3 |
上图可以看到,controller可以ping通过192.168.56.111,却ping不通172.16.0.2。
2、在controller上设置VxLAN,远端ip设置为compute能对外通信的br0的ip。
1 | ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.111 |
此时,依然ping不通172.16.0.2。
3、在compute上设置VxLAN,远端ip设置为controller能对外通信的br0的ip。
1 | ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.110 |
4、在controller上验证VxLAN隧道ping 172.16.0.2 -c3
如上图,controller的br1和compute的br1已经连通,实验成功。
5. 实验二
5.1. 目标
如上图,分别给两台虚拟机的br1指定两个 不同网段 的ip,然后通过搭建VXLAN隧道让这两个不同网段的网桥能够实现通信。
5.2. 搭建VxLAN隧道
紧接着实验一,我们已经创建了VxLAN隧道,controller和compute在172.16.0.0/24网段可以相互ping通。
1、在compute上修改ip为其他网段ifconfig br1 172.16.1.1/24 up
2、在controller上验证VxLAN隧道ping 172.16.1.1 -c3
如上图,controller无法连通compute,这是因为,不通网段间的通信需要路由。
3、在controller上设置路由route add -net 172.16.1.0/24 gw 172.16.0.1 dev br1
4、在compute上设置路由route add -net 172.16.0.0/24 gw 172.16.1.1 dev br1
5、再次在controller上验证VxLAN隧道ping 172.16.1.1 -c3
如上图,controller的br1和compute的br1已经连通,实验成功。
5.3. 路由永久生效
以上路由配置,在重启后会失效,要想永久有效,需要修改interfaces配置。
controller上,vim /etc/network/interfaces
,添加:
1 | up route add -net 172.16.1.0/24 gw 172.16.0.1 dev br1 |
compute上,vim /etc/network/interfaces
,添加:
1 | up route add -net 172.16.0.0/24 gw 172.16.1.1 dev br1 |
6. 实验三
6.1. 目标
紧接着实验二,问题来了,两个虚拟机之间可以创建VxLAN隧道,那么三个虚拟机之间该怎么处理?本实验,就要在三个虚拟机之间建立XxLAN隧道,实现通信。
6.2. ip配置
参照实验一:
controller的br0配置ip为192.168.56.110/24,br1配置ip为172.16.0.1/24。
compute1的br0配置ip为192.168.56.111/24,br1配置ip为172.16.1.1/24。
compute2的br0配置ip为192.168.56.112/24,br1配置ip为172.16.2.1/24。
6.3. 搭建VxLAN隧道
1、在controller上设置VxLAN,远端ip设置为compute1和compute2能对外通信的br0的ip。
1 | ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.111 |
2、在compute1上设置VxLAN,远端ip设置为controller能对外通信的br0的ip。
1 | ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.110 |
3、在compute2上设置VxLAN,远端ip设置为controller能对外通信的br0的ip。
1 | ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.110 |
5、在controller上添加路由
1 | route add -net 172.16.0.0/16 gw 172.16.0.1 dev br1 |
6、在compute1上添加路由route add -net 172.16.0.0/16 gw 172.16.1.1 dev br1
7、在compute2上添加路由route add -net 172.16.0.0/16 gw 172.16.2.1 dev br1
8、在controller测试连通compute1和compute2
1 | ping 172.16.1.1 -c3 |
神奇的事情发生了,可以ping通172.16.1.1的时候,172.16.2.1不通;可以ping通172.16.2.1的时候,172.16.1.1不通。这是因为,在完成实验二后,郝同学直接复制了compute虚拟机作为compute2,结果导致两台虚拟机的br1的mac地址相同。compute2删除br1重建,问题解决。
9、在compute1测试连通compute2ping 172.16.2.1 -c3
此时,compute1和compute2的br1已经连通。由上面的配置我们知道,它们之间并没有建立直接隧道,而是通过controller进行转发。
有意思的是,使用traceroute查看路由,发现它们连接时并没有经过网关(compute1的172.16.1.1和controller的172.16.0.1),而是直连。
1 | traceroute 172.16.2.1 |
7. 后记
至此,使用Open vSwitch进行VxLAN隧道实验完成。三个实验都比较基础,至于更高级的实验,以后再研究,比如在br1网桥上连接cirros虚拟机、添加tun/tap设备、添加veth设备等。