zoukankan      html  css  js  c++  java
  • OpenvSwitch系列之八 vxlan隧道

    Open vSwitch系列之一 Open vSwitch诞生
    Open vSwitch系列之二 安装指定版本ovs
    Open vSwitch系列之三 ovs-vsctl命令使用
    Open vSwitch系列之四 ovs-ofctl命令使用
    Open vSwitch系列之五 网桥特性功能配置
    Open vSwitch系列之六 vlan隔离
    Open vSwitch系列之七 meter表限速
    OpenvSwitch系列之八 vxlan隧道

    官方介绍
    VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,是对传统VLAN协议的一种扩展。VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。VXLAN本质上是一种隧道技术,在源网络设备与目的网络设备之间的IP网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。

    vxlan 是一种网络协议,将原始数据封装到UDP数据包中传输。vxlan被广泛应用到云计算网络环境中,耳熟能详的云计算框架openstack主要的网络架构就是vxlan,kubernetes也有vxlan的网络插件。vxlan 有许多优点,诸如:

    1. 连接两个局域网,可以将局域网内主机之间流量互通。就像是在局域网之间架起桥梁
    2. 支持隔离。vlan最多支持4096个隔离,而vxlan支持2的次方数32即 4294967296据隔离

    vxlan的封装格式

    本篇文章使用ovs搭建vxlan网桥,连接两个mininet构建的局域网。
    实验环境:两台虚拟机 ubuntu1804桌面版+ubuntu1604桌面版+mininet

    安装mininet

    分别在两台机器上安装mininet

    安装git工具

    root@ubuntu:~# apt install git
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      git-man liberror-perl
    Suggested packages:
      git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs git-mediawiki git-svn
    The following NEW packages will be installed:
      git git-man liberror-perl
    0 upgraded, 3 newly installed, 0 to remove and 406 not upgraded.
    Need to get 3,932 kB of archives.
    After this operation, 25.6 MB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    

    从github上拉取mininet源码

    root@openlab:~# git clone git://github.com/mininet/mininet
    Cloning into 'mininet'...
    remote: Enumerating objects: 9752, done.
    remote: Total 9752 (delta 0), reused 0 (delta 0), pack-reused 9752
    Receiving objects: 100% (9752/9752), 3.03 MiB | 1.35 MiB/s, done.
    Resolving deltas: 100% (6472/6472), done.
    
    

    安装mininet

    mininet的安装是进入mininet/util目录中,然后执行 ./install -a-a表示安装全部的组件。mininet的安装可以有很多备选项。

    root@openlab:~/mininet/util# ./install.sh -a
    Detected Linux distribution: Ubuntu 18.04 bionic amd64
    sys.version_info(major=3, minor=6, micro=7, releaselevel='final', serial=0)
    Detected Python (python3) version 3
    Installing all packages except for -eix (doxypy, ivs, nox-classic)...
    Install Mininet-compatible kernel if necessary
    .......
    .......
    .......
    libtool: install: /usr/bin/install -c cbench /usr/local/bin/cbench
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/root/oflops/cbench'
    make[1]: Leaving directory '/root/oflops/cbench'
    Making install in doc
    make[1]: Entering directory '/root/oflops/doc'
    make[1]: Nothing to be done for 'install'.
    make[1]: Leaving directory '/root/oflops/doc'
    Enjoy Mininet!
    

    验证安装

    安装完成之后,ovs会安装好,使用ovs-vsctl show命令,查看ovs版本

    root@openlab:~/mininet/util# ovs-vsctl show
    58cc7b02-ef48-4de7-a96b-ee1c0259472d
        ovs_version: "2.9.5"
    

    使用命令 mn 创建一个最小拓扑的环境。包括一个控制器,一个交换机,两个主机。

    root@openlab:~/mininet/util# mn
    *** Creating network
    *** Adding controller
    *** Adding hosts:
    h1 h2 
    *** Adding switches:
    s1 
    *** Adding links:
    (h1, s1) (h2, s1) 
    *** Configuring hosts
    h1 h2 
    *** Starting controller
    c0 
    *** Starting 1 switches
    s1 ...
    *** Starting CLI:
    mininet> 
    

    配置vxlan

    第一台机器配置

    记录下第一台机器的ip地址和路由信息,后面会使用这些信息。

    root@openlab:~/mininet/util# ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.175.130  netmask 255.255.255.0  broadcast 192.168.175.255
            inet6 fe80::20c:29ff:fe45:a8b7  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:45:a8:b7  txqueuelen 1000  (Ethernet)
            RX packets 247144  bytes 344597431 (344.5 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 74937  bytes 6024181 (6.0 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 993  bytes 76788 (76.7 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 993  bytes 76788 (76.7 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    root@openlab:~/mininet/util# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.175.2   0.0.0.0         UG    100    0        0 ens33
    192.168.175.0   0.0.0.0         255.255.255.0   U     0      0        0 ens33
    192.168.175.2   0.0.0.0         255.255.255.255 UH    100    0        0 ens33
    

    第二台机器配置

    同样,记录第二台机器的ip地址和路由信息。

    ens33     Link encap:Ethernet  HWaddr 00:0c:29:a6:71:34  
              inet addr:192.168.175.128  Bcast:192.168.175.255  Mask:255.255.255.0
              inet6 addr: fe80::b933:b350:fe27:b89a/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:56351 errors:0 dropped:0 overruns:0 frame:0
              TX packets:14943 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:76128903 (76.1 MB)  TX bytes:1464272 (1.4 MB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:404 errors:0 dropped:0 overruns:0 frame:0
              TX packets:404 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:33728 (33.7 KB)  TX bytes:33728 (33.7 KB)
    
    
    root@ubuntu:~/mininet/util# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.175.2   0.0.0.0         UG    100    0        0 ens33
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
    192.168.175.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
    
    

    创建隧道网桥br-tun

    使用ovs创建一个网桥,叫做br-tun,该网桥后面会作为vxlan隧道的端点。两个虚拟机都需要创建。

    root@openlab:~/mininet/util# ovs-vsctl add-br br-tun
    root@openlab:~/mininet/util# 
    root@openlab:~/mininet/util# ovs-vsctl show
    58cc7b02-ef48-4de7-a96b-ee1c0259472d
        Bridge br-tun
            Port br-tun
                Interface br-tun
                    type: internal
        ovs_version: "2.9.5"
    

    创建好br-tun之后,可以用ifconfig -a查看到这个设备

    root@openlab:~/mininet/util# ifconfig -a
    br-tun: flags=4098<BROADCAST,MULTICAST>  mtu 1500
            ether 26:c9:1f:49:4e:4e  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.175.130  netmask 255.255.255.0  broadcast 192.168.175.255
            inet6 fe80::20c:29ff:fe45:a8b7  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:45:a8:b7  txqueuelen 1000  (Ethernet)
            RX packets 247744  bytes 344644771 (344.6 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 75331  bytes 6070686 (6.0 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 993  bytes 76788 (76.7 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 993  bytes 76788 (76.7 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ovs-system: flags=4098<BROADCAST,MULTICAST>  mtu 1500
            ether 62:da:79:d8:d4:d3  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    第二台机器创建好的设备。

    root@ubuntu:~/mininet/util# ifconfig -a
    br-tun    Link encap:Ethernet  HWaddr 1e:66:43:f2:04:43  
              BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    ens33     Link encap:Ethernet  HWaddr 00:0c:29:a6:71:34  
              inet addr:192.168.175.128  Bcast:192.168.175.255  Mask:255.255.255.0
              inet6 addr: fe80::b933:b350:fe27:b89a/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:56569 errors:0 dropped:0 overruns:0 frame:0
              TX packets:15061 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:76151455 (76.1 MB)  TX bytes:1479464 (1.4 MB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:404 errors:0 dropped:0 overruns:0 frame:0
              TX packets:404 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:33728 (33.7 KB)  TX bytes:33728 (33.7 KB)
    
    ovs-system Link encap:Ethernet  HWaddr 8e:fb:8e:a0:0c:e5  
              BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    

    转移ens33 网卡的ip地址到br-tun上

    将网卡上的ip地址转交给br-tun。从上一步可以看出br-tun和网卡其实是非常类似的,将其赋值ip地址就可以当做网卡使用。现在要做的是把虚拟机网卡的ip地址给br-tun。
    增加路由信息。将ip地址转交给br-tun之后,路由信息也需要更新。ip地址和路由信息都要以实际的信息,在复制实验时不可直接使用我的。这也是为什么在前面记录ip信息和路由信息的原因。

    ifconfig ens33 0 up
    ifconfig br-tun 192.168.175.130/24 up
    route add default gw 192.168.175.2
    

    同样在第二台机器上完成同样的操作。

    ifconfig ens33 0 up
    ifconfig br-tun 192.168.175.128/24 up
    route add default gw 192.168.175.2
    

    将网卡ens33作为端口添加到br-tun

    因为ens33是流量出虚拟机的接口,所以最后流量还是肯定走ens33网卡出去。br-tun只是一个虚拟机的设备,要将ens33作为端口加入br-tun中

    ovs-vsctl add-port br-tun ens33
    

    同样在第二台机器上完成同样的操作。

    ovs-vsctl add-port br-tun ens33
    

    启动mininet

    使用命令mn启动一个最小拓扑的实验。创建的设备包括两个主机,h1,h2;一个交换机 s1

    使用ovs-vsctl show 可以看到环境中新增了一个交换机s1

    同样在第二台机器上完成同样的操作。

    修改主机IP地址

    上一步创建的mininet中两个主机的默认地址都是10.0.0.110.0.0.2,需要将第一台虚拟机中的mininet的主机的地址修改10.0.0.310.0.0.4。构建的环境如下:

    创建vxlan隧道

    在交换机s1创建vxlan隧道。这一步是最关键的一步。

    ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.175.128
    

    其中s1是创建隧道的网桥,remote_ip就是隧道另外一端机器的ip地址。

    查看创建好的隧道

    在第二台虚拟机上做同样的操作

    ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.175.130
    


    查看创建好的隧道

    验证通信

    在第一台虚拟机上打开h2。使用命令xterm h2可以打开mininet中h2的操作终端。

    在终端中ping 10.0.0.1

    在终端中ping 10.0.0.2

    抓取vxlan数据包

    打开wireshark,监听br-tun隧道端点上的流量。可以看到目前流量就是ICMP

    打开具体的icmp查看,与普通icmp有什么不同之处。正常icmp流量是icmp+网络层+数据链路层,而使用vxlan的icmp则是 icmp + 网络层 + 数据链路层 + vxlan报文头 + udp + 网络层 + 数据链路层。内层是10.0.0.3 ping 10.0.0.1的流量,这些流量被vxlan封装之后有外层包 192.168.175.130到192.168.175.128的UDP数据包。

    最后看一下vxlan报文头的具体信息。里面包含了一个 vxlan network identity 即vni,就是类似与vlan tag的ID号。不同的ID号之间不可以通信。

    总结

    在两个交换机上配置了vxlan之后,就像是在s1和s1之间打通了隧道,跨越局域网的限制传输数据。逻辑上是如上,实际是流量是从 h1 -->s1-->br-tun -->ens33 -->ens33 -->br-tun -->s1 -->h1

  • 相关阅读:
    python day01学习
    标准化体系建设(下):如何建立基础架构标准化及服务化体系?
    用EL表达式与Java代码的共享数据
    String和StringBuilder的相互转化
    博客园的一个bug_修改文章标签
    int const *p和int *const的区别
    C++ assert()的用法
    java中,为什么char类型数组可以直接用数组名打印,而int型数组打印结果是地址值!
    传说中的栈溢出
    Trello
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/13630767.html
Copyright © 2011-2022 走看看