使用Open vSwitch进行VxLAN隧道实验

前言

为了加深对VxLAN网络模式的理解,小编打算使用Open vSwitch进行VxLAN隧道实验。主要参考搭建基于Open vSwitch的VxLAN隧道实验基于Open vSwitch的VxLAN隧道实验网络

虚拟机准备

使用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通。

安装openvswitch

通过源码安装参考Open vSwitch on Linux, FreeBSD and NetBSD,这里我们不使用源码安装,而是使用apt包管理工具直接安装,参考Debian安装openvswitch

一条命令搞定:

1
apt -y install  openvswitch-switch openvswitch-common openvswitch-switch-dpdk

实验一

目标


如上图,分别给两台虚拟机的br1指定两个 相同网段 的ip,然后通过搭建VXLAN隧道让这两个不同机器的网桥能够实现通信。

controller

1、在controller上添加br0和br1两个网桥

1
2
ovs-vsctl add-br br0
ovs-vsctl add-br br1

2、查看网桥
ovs-vsctl show

3、在br0上添加一个端口,将eth0挂载到br0上。这样做的目的是方便我们在虚拟网桥上添加多个端口供我们使用,这样不必受限于eth0的有限端口。
ovs-vsctl add-port br0 eth0

4、此时我们将原先eth0分配的ip清除并指定给br0,让虚拟机网络能通过br0继续工作。

1
2
ifconfig eth0 0 up
ifconfig br0 192.168.56.110/24 up

5、根据实际情况配置一下br0的网关(可选)。
route add default gw 192.168.56.1 br0

6、给网桥br1分配一个ip。
ifconfig br1 172.16.0.1/24 up

7、查看ip
ifconfig

ip永久生效

以上ip配置,在重启后会失效,要想永久有效,需要修改interfaces配置。
vim /etc/network/interfaces,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

auto eth1
iface eth1 inet dhcp

auto br0
iface br0 inet static
address 192.168.56.110
netmask 255.255.255.0

auto br1
iface br1 inet static
address 172.16.0.1
netmask 255.255.255.0

compute

1、在compute上添加br0和br1两个网桥

1
2
ovs-vsctl add-br br0
ovs-vsctl add-br br1

2、在br0上添加一个端口,将eth0挂载到br0上。这样做的目的是方便我们在虚拟网桥上添加多个端口供我们使用,这样不必受限于eth0的有限端口。
ovs-vsctl add-port br0 eth0

3、此时我们将原先eth0分配的ip清除并指定给br0,让虚拟机网络能通过br0继续工作。

1
2
ifconfig eth0 0 up
ifconfig br0 192.168.56.111/24 up

4、根据实际情况配置一下br0的网关(可选)。
route add default gw 192.168.56.1 br0

5、给网桥br1分配一个ip。
ifconfig br1 172.16.0.2/24 up

搭建VxLAN隧道

1、在controller查看连通性

1
2
ping 192.168.56.111 -c3
ping 172.16.0.2 -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已经连通,实验成功。

实验二

目标


如上图,分别给两台虚拟机的br1指定两个 不同网段 的ip,然后通过搭建VXLAN隧道让这两个不同网段的网桥能够实现通信。

搭建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已经连通,实验成功。

路由永久生效

以上路由配置,在重启后会失效,要想永久有效,需要修改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

实验三

目标


紧接着实验二,问题来了,两个虚拟机之间可以创建VxLAN隧道,那么三个虚拟机之间该怎么处理?本实验,就要在三个虚拟机之间建立XxLAN隧道,实现通信。

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。

搭建VxLAN隧道

1、在controller上设置VxLAN,远端ip设置为compute1和compute2能对外通信的br0的ip。

1
2
ovs-vsctl add-port br1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.56.111
ovs-vsctl add-port br1 vx2 -- set interface vx2 type=vxlan options:remote_ip=192.168.56.112

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
2
ping 172.16.1.1 -c3
ping 172.16.2.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测试连通compute2
ping 172.16.2.1 -c3

此时,compute1和compute2的br1已经连通。由上面的配置我们知道,它们之间并没有建立直接隧道,而是通过controller进行转发。

有意思的是,使用traceroute查看路由,发现它们连接时并没有经过网关(compute1的172.16.1.1和controller的172.16.0.1),而是直连。

1
2
traceroute 172.16.2.1
traceroute 172.16.2.1 -I

后记

至此,使用Open vSwitch进行VxLAN隧道实验完成。三个实验都比较基础,至于更高级的实验,以后再研究,比如在br1网桥上连接cirros虚拟机、添加tun/tap设备、添加veth设备等。

书签

Vxlan学习笔记——原理

最详细的Vlan原理介绍

SDN与OpenFlow技术简介

OpenStack网络实战系列一:通过Openvswitch实践了解交换机的基本概念和操作

Open vSwitch使用案例扩展实验

TAP 设备与 VETH 设备

Linux虚拟网络设备之tun/tap

Linux虚拟网络设备之veth

0%