2.5. GRE 隧道使用指南

2.5.1. 前言

当我们想连接多个云的时候,需要通过隧道来连接各个云,UStack 目前提供了 GRE 二层和三层隧道的支持,本文将向用户介绍如何通过界面和 API 创建 GRE 隧道。

2.5.2. 概念

隧道是对称的,我们需要在两边同时做一些设置,首先明确一些概念:

  • 三层隧道(L3):三层隧道协议是把各种网络协议直接装入隧道协议中,形成的数据包依靠第三层协议进行传输,隧道两边应当为不同的网段,用户可以在一个路由器上配置多个三层隧道;
  • 二层隧道(L2):二层隧道协议对应于OSI模型的数据链路层,使用帧作为数据交换单位,隧道两边应当在同一个网段;
  • 隧道连接(tunnel connection):一个三层隧道只能与一个路由器相连接,也就是它只能设置一个隧道连接,二层隧道可以同时与多个路由器相连接以组成一个等大规模的二层网络,也就是支持它支持多个隧道连接。隧道连接包括四项设置:
    • 对端IP
    • 密钥
    • 密钥类型
    • 校验码
  • 对端 IP(Remote IP):每个隧道连接都需要配置一个对端 IP,也就是它需要连接的目标的 IP;
  • 密钥(key):GRE 隧道不提供加密功能,但支持 32 位整形密钥,用户可以输入 0~2^32 之间的整数,或者为了便于记忆,可以输入一个 IPv4 地址,隧道两端的密钥必须完全一致;
  • 密钥类型(key type):GRE 隧道的密钥可以设置为四种类型(我们推荐用户设置为 3 或 4 以降低配置复杂性,需要注意配置为 3 或 4 时,隧道两端的设置必须完全一致):
    1. 只对发出的包计算并填充密钥;
    2. 只对收到的包校验密钥;
    3. 同时计算和检验;
    4. 既不计算也不检验密钥;
  • 校验码(checksum):GRE 隧道提供了基本的校验码来保证数据包的完整性,校验码的设置类型和注意事项与密钥类型相似,我们推荐用户设置为同时计算和校验或既不计算也不校验校验码来降低复杂性,此时隧道两端的配置应当是完全一致的;
  • 目标网络(target network):目标网络是属于三层隧道的一个属性,指明这个三层隧道将连接到哪些网络,从本地发往这写网络地址的 IP 包将通过这个 GRE 隧道来发送;
  • 本地子网(local subnet):本地子网是属于二层隧道的一个属性,指明这个二层隧道将联通哪个二层网络,一个二层隧道只能选择一个与该路由器相连接的子网。

2.5.3. 三层 GRE 隧道

三层隧道是 GRE 隧道最常见的用法,大部分主流网络设备和操作系统均提供支持。GRE 隧道很灵活,但它一般不提供转发功能,也就是说当你的数据中心 A 的路由器(网关)已与你在 UStack 上的路由器 B 相连,同时 B 与你的另一个路由器 C 相连,并不代表此时 A 与 C 已经相连,我们会在下一步中提供这个功能(Cloud Hub)。

2.5.3.1. 连接 UStack 路由器与数据中心网关

我们以下面这个拓扑设计为例:

gre-tunnel-topology

2.5.3.2. 在 UStack 公有云中的操作

首先打开 UStack 公有云控制台,在虚拟数据中心中选择“路由器”,点击路由器进入路由器的详情页,选择“隧道服务”标签,点击“创建隧道”,在新弹出的窗口做如下设置:

tunnel-set

确认无误后,点击创建就完成了 UStack 公有云上的 GRE 隧道的配置。

2.5.3.3. 在数据中心的操作

在 UStack 上配置完,需要在您的数据中心网关(路由器)做类似的配置,具体配置需要参考您的设备的厂商手册,需要在网管上配置的有:

  • GRE 隧道
  • 静态路由

2.5.3.3.1. 使用 API 建立 GRE 隧道:

首先建立一个隧道:

curl -i -X POST https://bj1.network.api.ustack.com/v2.0/tunnel/tunnels  \
     -H "X-Auth-Token: token_id" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"tunnel":{"name":"Tunnel2","type":3,
          "router_id":"32","mode":"gre"}}'

然后创建隧道连接:

curl -i -X POST https://bj1.network.api.ustack.com/v2.0/tunnel/tunnel-connections  \
     -H "X-Auth-Token: token_id" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"tunnel":{"remote_ip": "2.2.2.2",
          "tunnel_id":"11",
          "key":"1024",
          "key_type":3,
          "checksum":0}}'

最后添加目标网络:

curl -i -X POST https://bj1.network.api.ustack.com/v2.0/tunnel/target-networks  \
     -H "X-Auth-Token: token_id" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"tunnel":{"network_cidr":"10.0.1.0/24",
          "tunnel_id":"11"}}'

正常的话,以上操作均应返回 201 Created 及创建获得资源的详细信息。

2.5.4. 二层 GRE 隧道

二层隧道可以用来连接广播域,例如下面的拓扑:

l2-topology

2.5.4.1. 在 UStack 公有云中的操作

首先打开 UStack 公有云控制台,在虚拟数据中心中选择“路由器”,点击路由器进入路由器的详情页,选择“隧道服务”标签,点击“创建隧道”,在新弹出的窗口做如下设置:

gre-tunnel-set-l2

确认无误后,点击创建就完成了 UStack 公有云上的 GRE 隧道的配置。

2.5.4.2. 在数据中心的操作

在 UStack 上配置完,需要在您的数据中心网关(路由器)做类似的配置,具体配置需要参考您的设备的厂商手册,配置时请注意两点:

  • 应当是一个在本地数据中心已存在的网段;
  • 请避免二层、三层隧道混用以避免潜在的网络问题。

2.5.4.2.1. 使用 API 建立 2 层 GRE 隧道:

首先建立一个隧道:

curl -i -X POST https://bj1.network.api.ustack.com/v2.0/tunnel/tunnels  \
     -H "X-Auth-Token: token_id" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"tunnel":{"name":"Tunnel2","type":2,
          "router_id":"32","mode":"gre",
          "local_subnet":"41"}}'

然后创建隧道连接:

curl -i -X POST https://bj1.network.api.ustack.com/v2.0/tunnel/tunnel-connections  \
     -H "X-Auth-Token: token_id" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"tunnel":{"remote_ip":"2.2.2.2",
          "tunnel_id":"11",
          "key":"1024",
          "key_type":3,
          "checksum":0}}'

因为是二层隧道,所以不需要设置目标网络。

正常的话,以上操作均应返回 201 Created 及创建获得资源的详细信息。