使用Open vSwitch进行VxLAN隧道实验

文章目录
  1. 1. 前言
  2. 2. 虚拟机准备
  3. 3. 安装openvswitch
  4. 4. 实验一
    1. 4.1. 目标
    2. 4.2. controller
    3. 4.3. ip永久生效
    4. 4.4. compute
    5. 4.5. 搭建VxLAN隧道
  5. 5. 实验二
    1. 5.1. 目标
    2. 5.2. 搭建VxLAN隧道
    3. 5.3. 路由永久生效
  6. 6. 实验三
    1. 6.1. 目标
    2. 6.2. ip配置
    3. 6.3. 搭建VxLAN隧道
  7. 7. 后记
  8. 8. 书签

前言

为了加深对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