目录

  1. Overlay网络
    1. Overlay技术概述
    2. GRE技术
      1. 应用场景
      2. 配置GRE
      3. 过程
      4. GRE特点
    3. VxLAN技术
      1. VxLAN主要的网络设备
      2. VxLAN主要的组网方案
      3. VxLAN的实现
        1. VxLAN将二层数据帧封装为UDP包
        2. VTEP寻址
        3. VxLAN组网
        4. 数据流向
        5. 负载均衡
    4. 技术对比
      1. VLAN和VxLAN的对比
      2. GRE和VxLAN的对比
  2. Neutron通过OVS对GRE和VxLAN的支持
    1. Open vSwitch实现的VxLAN VTEP
    2. 隧道接口(Tunnel Port)
    3. 不使用l2 population建立隧道
    4. Neutron Tunnel数据流向
    5. MTU问题

Overlay网络

Overlay技术概述

Overlay在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其他网络业务分离,并且以基于IP的基础网络技术为主。Overlay技术是在现有的物理网络之上构建一个虚拟网络,上层应用只与虚拟网络相关。

一个Overlay网络主要由三部分组成。

  • 边缘设备:是指与虚拟机直接相连接的设备。
  • 控制平面:主要负责虚拟隧道的建立维护以及主机可达性信息的通告。
  • 转发平面:承载Overlay报文的物理网络。

当前主流的Overlay技术主要有VxLAN,GRE/NVGRE和STT。这三种二层Overlay技术,大体思路均是将以太网报文承载到某种隧道层面,差异性在于选择和构建的隧道的不同,而底层均是IP转发。

GRE技术

GRE(Generic Routeing Encapsulation,通用路由协议封装)协议,是一种IP-over-IP的隧道,由Cisco和Net-smiths等公司与1994年提交给IETF,它对部分网络层协议(IP)的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6网络中传输。其协议格式见RFC2784。简单的说,GRE是一种协议封装的格式,它规定了如何用一种网络协议去封装另一种网络协议,很多网络设备都支持该协议。说直白点,就是GRE将普通的包(如IP包)封装了,又按照普通的IP包的路由方式进行路由,相当于IP包外面再封装一层GRE包。在本例子中,在GRE包外围实际上又有一层公网的IP包。

GRE使用Tunnel(隧道)技术,数据抱在Tunnel的两端封装,并在这个通路上传输,到另一端的时候解封装。可以认为Tunnel是一个虚拟的点对点的连接。(实际Point To Point连接之后,加上路由协议及NAT技术,就可以吧两个隔绝及局域网连接在一起,就实现了Net To Net的互联)。一般GRE Tunnel是在多个网络设备(一般为路由器)之间建立。因为Linux服务具有路由转发的功能,当缺少专业的路由设备时,可以使用Linux服务器实现GRE Tunnel的建立。

应用场景

办公网(LAN 192.168.1.0/24,并通过固定的公网IP上网)
IDC(LAN 10.1.1.0/24,并有多个公网IP,两者通过公网IP互联)

这两个局域网相互隔离。但是在日常运维和研发过程中,需要在办公网络访问IDC网络。如果通过公网IP绕,既不方便,又不安全;拉专线是最稳定可靠的办法,但是成本高。

配置GRE

如果公司有多余的固定的公网IP或者路由器本身支持GRE,建议使用GRE方案。

办公网络路由器(Linux服务器实现):局域网IP:192.168.1.254,公网IP:180.1.1.1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat /usr/local/admin/gre.sh # 并把脚本加入开机启动

#! /bin/bash
modprobe ip_gre # 加载gre模块

ip tunnel add office mode gre mode 110.2.2.2 local 180.1.1.1 ttl 255
# 使用公网IP建立Tunnel,名字叫 ‘office’的device,使用gre mode。
# 指定远端的IP是110.2.2.2,本地IP是180.1.1.1。
# 这里为了提高安全性,你可以配置iptables,公网IP只接受来自110.2.2.2的包,其他都drip掉。

ip link set office up # 启动device office
ip link set office up mtu 1500 # 设置mtu为1500
ip addr add 192.912.192.2/24 dev office #为office添加IP:192.192.192.2。
echo 1 > /proc/sys/net/ipv4/ip_forward #让服务器支持转发
ip route add 10.1.1.0/24 dev office #添加路由,含义是:到10.1.1.0/24的包,由office设备负责转发。

iptables -t nat -A POSTROUTING -d 10.1.1.0/24 -j SNAT --to 192.192.192.2
# 否则192.168.1.x等机器访问10.1.1.x网段不通。

IDC路由器(Linux服务器实现):局域网IP:10.1.1.1,公网IP:110.2.2.2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat /usr/local/admin/gre.sh # 并把脚本加入开机启动

# !/bin/bash
modprobe ip_gre # 加载gre模块

ip tunnel add office mode gre remote 180.1.1.1 local 110.2.2.2 ttl 255
ip link set office up
ip link set office up mtu 1500
ip addr add 192.192.192.1/24 dev office # 为office添加IP:192.192.192.1
echo 1 > /proc/sys/net/ipv4/ip_forward
ip route add 10.1.1.0/24 dev office

iptables -t nat -A POSTROUTING -s 192.192.192.2 -d 10.1.0.0/16 -j SNAT --to 10.1.1.1
# 否则192.168.1.x等机器访问10.1.1.x网段不通。
iptables -A FORWARD -s 192.192.192.2 -m state --state NEW -m tcp -p tcp --dport 3306 -j drop
# 禁止直接访问线上的3306,防止内网被破坏。
过程
  1. GRE Tunnel的打通:这个过程就是双方建立Tunnel的过程。
  2. 局域网路由å
    1. 主机A发送一个源地址为192.168.1.2,目的地址为10.1.1.2的包。
    2. 封装过程
      1. 根据内网路由规则,可能是你的默认路由网关将之路由至192.168.1.254。
      2. 192.168.1.254第一次封装包,增加GRE包头,说明包的目的地址192.192.192.1和源地址192.192.192.2。
      3. 192.168.1.254第二次封装包,增加公网的包头(否则在公网上无法路由),说明包的目的地址110.2.2.2和180.1.1.1。
      4. 192.168.1.254把所有到10.1.1.0/24的包,源地址都转换为从192.192.192.2出(SNAT)。
  3. 公网路由过程:经过N个路由设备,最终路由到110.2.2.2。
  4. 拆包过程
    1. B端的路由器检查是到达自己的IP,就开始拆包。
    2. 拆包之后发现有GRE协议,就进一步拆包。
    3. 拆包之后发现目的地址不是自己的内网IP,同时发现自己本地做了SNAT,就将源IP地址替换为10.1.1.1。
  5. 局域网路由
    1. 实际上从10.1.1.1出发的,到达目的为10.1.1.2的包,无需路由,直接在局域网内广播。10.1.1.2的机器确定是发送给自己的包,就接收。然后进一步处理。
GRE特点
  • GRE的特点

    • 跨不同网络实现二次IP通信
    • L3上面包装L3
    • 封装在IP报文中
    • 点对点隧道
  • GRE的优点

    • 不用变更底层网络架构重建L2、L3通信
    • 实现不同Host之间网络Guest互通
    • 方便Guest迁移
    • 支持网络数量扩大
  • GRE的缺点

    • Tunnel数量问题
      GRE是一种点对点(Point To Point)标准。Neutron中,所有计算节点和网络节点之间都会建立GRE Tunnel。当节点不多的时候,这种组网没什么问题,但是,当数据中心有大量的节点的时候,就会占用大量资源。使用标准GRE的话,将会有7亿8千万个Tunnel。
    • 扩大的广播组
      GRE不支持组播,因此一个网络(同一个GRE Tunnel ID)中的一个虚机发出一个广播帧后,GRE会将其广播到所有与该节点有隧道连接的节点。
    • 增加了GRE表头会导致本应由交换机硬件来分片的变成由软件来分片(STT技术可以弥补这一点)。

    VxLAN技术

    VxLAN技术主要用于封装、转发二层报文。VxLAN全称Virtual Extensible Local Area Network,简单来说就是扩充了的VLAN,其使得多个三层连接的网络可以表现的和直接通过一台一台物理交换机连接配置而成的网络一样处在一个LAN中。

它的实现机制是,将二层报文加上个VxLAN Header,封装在一个UDP包中进行传输。VxLAN Header会包括一个24位的ID(成为VNI),类似于VLAN ID或者GRE的Tunnel ID。GRE一般是通过路由器来进行GRE协议的封装和解封的,在VxLAN中这类封装和解封的组件有个专有的名字叫VTEP。相比起VLAN来说,好处在于其突破了VLAN只有4000+子网的限制,同时架设在UDP协议上后其扩展性提高了不少(因为UDP是高层协议,屏蔽了底层差异,屏蔽了二层差异)。

VxLAN主要的网络设备

VxLAN网络设备主要有三种角色,分别是:

  1. VTEP(VxLAN Tunnel End Point)
    直接与终端设备比如虚机连接设备,负责原始以太报文的VxLAN封装和解封装,形态可以是虚拟交换机比如Open vSwitch,也可以是物理交换机。

  2. VxLAN GW(VxLAN Gateway/二层网关)
    用于终结VxLAN,将VxLAN报文转换成对应的传统二层网络送到传统以太网络,适用于VxLAN网络内的服务器与远端终端或远端服务器的二层互联。如在不同网络中做虚拟机迁移时,当业务需要传统网络中服务器与VxLAN网络中服务器在同一个二层中,此时需要使用VxLAN二层网关打通VxLAN网络和二层网络。

VxLAN 10网络中的服务器要和IP网络中VLAN 100的业务二层相通,此时就需要通过VxLAN的二层网关进行互联。VxLAN 10的报文进入IP网络的流量,剥掉VxLAN的报文头,根据VxLAN的标签查询对应的VxLAN网络(此处对应的是VLAN 100),并据此在二层报文中加入 VLAN的802.1Q报文送入IP网络;相反VLAN 100的业务流量进入VxLAN也需要根据VxLAN获知对应的VxLAN网络编号,根据目的MAC地址获知远端VTEP的IP地址,基于以上信息进行VxLAN封装后送入对应的VxLAN网络。可见,它除了具备VTEP的功能外,还负责VLAN报文与VxLAN报文之间的映射和转发,主要以物理交换机为主。

  1. VxLAN IP GW(VxLAN IP Gateway/三层网关)
    用于终结VxLAN网络,将VxLAN报文转换成传统三层报文送至IP网络,适用于VxLAN网络内服务器与远端终端之间的三层互访;同时也用作不同VxLAN网络互通。

当服务器访问外部网络时,VxLAN三层网关剥离对应VxLAN报文封装,送入IP网络;当外部终端访问VxLAN内的服务器时,VxLAN根据目的IP地址确定所属VxLAN及所属的VTEP,加上对应的VxLAN报文头封装进入VxLAN网络。VxLAN之间的互访流量于此类似,VxLAN网关剥离VxLAN报文头,并基于目的IP地址确定所属VxLAN及所属的VTEP,重新封装后送入另外的VxLAN网络。可见,具有VxLAN GW的所有功能,此外,还负责处理不同VxLAN之间的报文通信,同时也是数据中心内部服务去往发布业务的出口,主要以高性能物理交换机为主。

可见,无论是二层还是三层网关,均涉及到查表转发、VxLAN报文的解封和封装操作。从转发效率和执行性能来看,都只能在物理网络设备上实现,并且传统设备无法支持,必须通过新的硬件形式来实现。以上设备均是物理网络的边缘设备,而由三种边缘设备构成了VxLAN Overlay网络,对于应用系统来说,只与这三种设备有关,而与底层物理网络无关。

VxLAN主要的组网方案

Overlay网络架构就纯大二层的实现来说,可分为网络Overlay、主机Overlay以及两种方式同时部署的混合Overlay。Overlay网络与外部网络数据连通也有多种实现模式,并且对于关键网络部件有不同的技术要求。

  1. 网络Overlay方案:使用物理交换机做VxLAN网络设备
    所有的物理接入交换机支持VxLAN,物理服务器支持SR-IOV功能,使虚拟机通过SR-IOV技术直接与物理交换机相连,虚拟机的流量在接入交换机上进行VxLAN报文的封装和卸载,对于非虚拟化服务器,直接连接支持VxLAN的接入交换机,服务器流量在接入交换机上进行VxLAN报文封装和卸载;当VxLAN网络需要与VLAN网络通信时,采用物理交换机做VxLAN GW,实现VxLAN网络主机与VLAN网络主机与VLAN网络主机的通信;采用高端交换机做VxLAN IP GW,实现VxLAN网络与WAN以及Internet的互联。

  2. 主机Overlay方案:使用服务器上的软件实现VxLAN网络设备
    在主机Overlay方案中,VTEP、VxLAN GW、VxLAN IP GW均通过安装在服务器上的软件实现。

  • vSwitch实现VTEP功能,完成VxLAN报文的封装和解封装。
  • vFW等实现VxLAN GW功能,实现VxLAN网络与VLAN网络、物理服务器的互通。
  • vRouter作为VxLAN IP GW,实现VxLAN网络与Internet和WAN的互联。
    在本组网中,由于所有VxLAN报文的封装卸载都通过软件实现,会占用部分服务器资源,当访问量大时,vRouter会成为系统瓶颈。
  1. 混合Overlay组网方案
    上述两种组网方案中,网络Overlay方案与虚拟机相连,需要通过一些特殊的要求或技术实现虚拟机与VTEP的对接,组网不够灵活,但是主机Overlay方案与传统网络互通时,连接也比较复杂,且通过软件实现VxLAN IP GW也会成为整个网络的瓶颈,所以最理想的组网方案应该是一个结合了网络Overlay与主机Overlay两种方案优势的混合Overlay方案。

通过vSwitch实现虚拟机的VTEP,通过物理交换机实现物理服务器的VTEP,通过物理交换机实现VxLAN GW和VxLAN IP GW;混合式Overlay组网方案对虚拟机和物理服务器都能很好的兼容,同时通过专业的硬件交换机实现VxLAN IP GW从而承载超大规模的流量转发,是目前应用比较广泛的组网方案。
VxLAN网络中,虚机之间的三种互访方式:

  1. 相同VxLAN内VM之间互访:
    1. 单播报文在VTEP处查找目的MAC地址,确定对应的VTEP主机IP地址。
    2. 根据目的和源VTEP主机IP地址封装VxLAN报头后发送给IP核心网。
    3. IP核心内部根据路由转发该UDP报文给目的VTEP。
    4. 目的VTEP解封装VxLAN报文头后按照目的MAC转发报文给目的VM。
  2. 不同VxLAN内VM之间需要互访经过VxLAN IP GW完成。
    1. 在VxLAN IP GW上匹配VxLAN Mapping表项进行转发,报文封装模式同同一VxLAN内VM一致。
  3. VxLAN VM与VLAN VM之间互访,通过VxLAN GW来完成。
    1. VxLAN报文先通过VxLAN内部转发模式对报文进行封装,目的IP为VxLAN GW。
    2. 在VxLAN GW把VxLAN报文解封装后,匹配二层转发表项进行转发,VLAN到VxLAN的访问流程正好相反。
VxLAN的实现
VxLAN将二层数据帧封装为UDP包

特点:

  • VNID:24-bits,最大16777216。每个不同的24-bits VNI代表一个VxLAN网段。只有同一个网段中的虚机才能互相通信。
  • VxLAN Port:目的UDP端口,默认使用4789端口。可以自行配置。
  • 两个VTEP之间的VxLAN Tunnels是无状态的。
  • VTEP可以在虚拟交换机上,物理交换机或者物理服务器上通过软件或者硬件实现。
  • 使用多播来传送未知目的的广播或者多播帧。
  • VTEP不可以对VxLAN包分段。
VTEP寻址

一个VTEP可以管理多个VxLAN隧道,每个隧道通向不同的目标。那VTEP接收到一个二层帧后,它怎么根据二层帧中的目的MAC地址找到对应的VxLAN隧道呢?VxLAN利用了多播和MAC地址学习技术。如果它收到的帧是广播帧比如ARP帧,也会经过同样的过程。

每个VTEP包含两个VxLAN隧道。VTEP-1收到二层ARP帧1(A要查找B的MAC地址)后,发出一个目的IP地址为VTEP多播组239.1.1.1的VxLAN封装UDP包。该包会到达VTEP-2和VTEP-3。VTEP-3收到后,因为目的IP地址不在它的范围内,丢弃该包,但是学习到一条路径:MAC-A, VNI 10, VTEP-1-IP,它知道到达A需要经过VTEP-1了。VTEP-2收到后,发现目的IP地址时机器B,交给B,同时添加学习到的规则:MAC-A, VNI 10, VTEP-1-IP。B发回响应帧后,VTEP-2直接使用VTEP-1的IP直接将它封装成三层包,通过物理网络直接到达VTEP-1,再由它交给A。VTEP-1也学习到了一条规则:MAC-B, VNI 10, VTEP-2-IP。

VxLAN组网
  • 逻辑VxLAN Tunnel:建立在物理的VxLAN网络之上,向虚机提供虚拟的二层网络,以VNI做区分。
  • VTEP(VxLAN Tunnel End):对虚机的二层包封装和解封。
数据流向

发送端

  1. 计算目的地址:Linux内核在发送之前会检查数据帧的目的MAC地址,需要选择目的VTEP。
    1. 如果是广播或者多播地址,则使用其VNI对应的VxLAN Group组播地址,该多播组内所有的VTEP将收到该多播包。
    2. 如果是单播地址,如果Linux的MAC表中包含该MAC地址对应的目的VTEP地址,则使用它。
    3. 如果是单播地址,但是Linux的MAC表中不包含该MAC地址对应的目的VTEP地址,那么使用该VNI对应的组播地址。
  2. 添加Headers:依次添加VxLAN Header,UDP Header,IP Header。

接收端

  1. UDP监听:因为VxLAN利用了UDP,所以它在接收的时候势要有一个UDP Server在监听某个端口,这个VxLAN初始化的时候完成的。
  2. IP剥离:一层一层剥离出原始的数据帧,交给TCP/IP栈,由它交给虚机。
负载均衡

组成VxLAN隧道的三层路由器在有多条ECMP(Equal-cost Multi-path Routing)路径通往目的VTEP时往往会使用基于每个包(per-package)的负载均衡(Load Balancing)。因为两个VTEP之间的所有数据包具有相同的Outer Source and Destination IP Address和UDP Destination Port,因此ECMP只能使用Source UDP Port。VTEP往往将其设置为原始数据帧的一些参数的Hash值,这样ECMP就可以使用该Hash值,来区分Tunnel之间的网络流量了。

技术对比

VLAN和VxLAN的对比
GRE和VxLAN的对比

Neutron通过OVS对GRE和VxLAN的支持

因为OVS对两种协议的实现机制,Neutron对两个协议的支持的代码和配置几乎完全一致的,除了一些细小差别,比如名称,以及个别配置比如VxLAN的UDP端口等。OVS在计算或者网络节点上的br-tun上建立多个Tunnel Port,和别的节点上的Tunnel Port之间建立点对点的GRE/VxLAN Tunnel。Neutron GRE/VxLAN Network使用segmentation_id(VNI或者GRE Tunnel ID)作为其网络标识,类似于VLAN ID,来实现不同网络内网络流量之间的隔离。

Open vSwitch实现的VxLAN VTEP

VTEP不止实现包的封装和解封,还包括:

  1. ARP解析:需要尽量高效的方式响应本地虚机的ARP请求。
  2. 目的VTEP地址搜索:根据目的虚机的MAC地址,找到它所在机器的VTEP的IP地址。

通常的实现方式包括:

  1. 使用L3多播。
  2. 使用SDN控制器(Controller)来提供集中式的MAC/IP对照表。
  3. 在VTEP本地运行一个代理(Agent),接收(MAC,IP,VTEP IP)数据,并提供给VTEP。

Open Vswitch如何实现这些功能需求。

  1. 在没有启用l2 population的情况下,配置了多播就使用多播,没有的话就使用广播。
  2. 在启用l2 population的情况下,在虚机boot后,通过MQ向用于同网络虚机的节点时的l2 population driver发送两种数据,再将数据加入到OVS流表。
    1. FDB(Forwarding Database):目的地址-所在VTEP IP地址的对照表,用于查找目的虚机所在的VTEP的IP地址。
    2. 虚机IP地址-MAC地址对照表,用于响应本地虚机的ARP请求。

隧道接口(Tunnel Port)

10.0.1.31 Hypervisor上的br-tun上分别有两个GRE Tunnel端口和两个VxLAN Tunnel端口,分别连接目标Hypervisor 10.0.1.39和21。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Bridge br-tun
fail_mode: secure
Port br-tun
Interface br-tun
type: internal
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port "vxlan-0a000127"
Interface "vxlan-0a000127"
type: vxlan
options: {df_default="true", in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.39"}
Port "vxlan-0a000115"
Interface "vxlan-0a000115"
type: vxlan
options: {df_default="true", in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.21"}
Port "gre-0a000127"
Interface "gre-0a000127"
type: gre
options: {df_default="true", in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.39"}
Port "gre-0a000115"
Interface "gre-0a000115"
type: gre
options: {df_default="true", in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.21"}

当有多个节点时,Neutron会建立一个Tunnel网。

不使用l2 population建立隧道

要使用GRE和VxLAN,管理员需要在ml2配置文件中配置local_ip(比如物理服务器的公网IP),并使用配置项tunnel_types指定要使用的隧道类型,即GRE或者VxLAN。当enable_tunneling = true时,Neutron ML2 Agent在启动时会建立Tunnel Bridge,默认为br-tun。接着,ML2 Agent会在br-tun上建立Tunnel Ports,作为GRE/VxLAN Tunnel的一端。

OVS默认使用4789作为VxLAN Port。Neutron节点在该端口上监听来自所有源的UDP包。

1
2
3
4
ss -lnup
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:4789 *:*
UNCONN 0 0 :::4789 :::*

Neutron Tunnel数据流向

Neutron中的数据流向是受Neutron添加在Integration Bridge和Tunnel Bridge中的OpenFlow Rules控制的,而且和l2 population直接相关。

MTU问题

VxLAN模式下虚机中mtu最大值为1450,也就是只能小于1450,大于这个值会导致Open vSwitch传输分片,进而导致虚机中数据包数据重传,从而导致网络性能下降。GRE模式下虚机mtu最大值为1462。

计算方法如下:

  • VxLAN mtu = 1500 - 20(IP头)- 8(UDP头)- 8(VxLAN头)- 14(以太网头)= 1450
  • GRE mtu = 1500 - 20(IP头)- 8(GRE头)- 14(以太网头)= 1458

可以配置Neutron DHCP组件,让虚拟机自动配置mtu。

1
2
3
4
5
6
#/etc/neutron/dhcp_agent.ini
[DEFAULT]
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

#/etc/neutron/dnsmasq-neutron.conf
dhcp-option-force=26,1450或1458

重启DHCP Agent,让虚拟机重新获取IP,然后使用ifconfig查看是否正确配置mtu。