什么是 GRE 隧道?| GRE 协议如何工作

通用路由封装或 GRE 是一种协议,用于将数据包包装在二级数据包中,以建立直接的点对点网络连接。

学习目标

阅读本文后,您将能够:

  • 了解 GRE 是什么
  • 了解隧道的工作原理
  • 了解 GRE 如何影响网络流程

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

什么是 GRE?

通用路由封装或 GRE 是一种协议,用于将使用一个路由协议的数据包封装在另一协议的数据包中。“封装”是指将一个数据包包装在另一个数据包中,就像将一个盒子放在另一个盒子中一样。GRE 是在网络上建立直接点对点连接的一种方法,目的是简化单独网络之间的连接。它适用于各种网络层协议。

封装的数据包——将不受支持的数据包放在网络支持的数据包内

GRE 允许使用网络通常不支持的协议,因为数据包被包装在其他确实使用受支持协议的数据包中。要了解其工作原理,请想像一下汽车和渡轮之间的区别。汽车在陆地上行驶,而渡轮在水上行驶。汽车通常不能在水上行驶,但是可以将汽车装载到渡轮上。

在这个类比当中,地形类型好比是支持某些路由协议的网络,而车辆则好比是数据包。GRE 是一种将一种类型的数据包装载到另一种类型的数据包中的方式,以便第一个数据包可以穿越它通常无法穿越的网络,就像一种类型的运输工具(汽车)被装载到到另一种类型的运输工具(渡轮)上,以便穿越原本无法行驶的地形。

例如,假设一家公司需要在位于两个不同办公室的局域网(LAN)之间建立连接。两个 LAN 都使用最新版本的 互联网协议 IPv6。但是,为了从一个办公网络到达另一个办公网络,流量必须通过一个由第三方管理的网络 — 该网络有些过时,仅支持较旧的 IPv4 协议。

借助 GRE,该公司可以将 IPv6 数据包封装在 IPv4 数据包中,然后便可通过此网络传输流量。回到那个类比,IPv6 数据包是汽车,IPv4 数据包是渡轮,而第三方网络则是水。

GRE 隧道是什么意思?

将数据包封装在其他数据包中称为“隧道”。GRE 隧道通常配置在两个路由器之间,每个路由器的作用好比隧道的一端。路由器设置为彼此直接发送和接收 GRE 数据包。两个路由器之间的任何路由器都不会打开封装的数据包;它们仅引用封装数据包外层的标头进行转发。

为了理解为什么将其称为“隧道”,我们可以对类比稍作更改。如果汽车需要从山一侧的 A 点绕到另一侧的 B 点,则最有效的方法就是直接穿过大山。但是,普通汽车无法直接穿过坚硬的岩石。因此,汽车必须一直绕着山脉行驶,才能从 A 点到达 B 点。

但不妨想象一下有条隧道穿过了山体。现在,汽车可以从 A 点直行到 B 点,这要快得多,而且没有隧道就无法做到。

现在,把 A 点视作一台联网设备,把 B 点视作另一台联网设备,再把大山视作两台设备之间的网络,将汽车视作需要从 A 点行到 B点的数据包。想象一下,这个网络不支持 A 点和 B 点设备需要交换的那种数据包类型。就像汽车试图穿越大山一样,数据包无法直接通过,可能需要通过其他网络走上更长的路。

但 GRE 创建了穿过“大山”网络的一个虚拟的“隧道”,以允许数据包通过。就像隧道为汽车提供了一种直接穿过陆地的方式一样,GRE(以及其他隧道协议)也为数据包穿过不支持它们的网络提供了一种方式。

GRE 标头中包含什么?

通过网络发送的所有数据都被分解为较小的部分,称为数据包,所有数据包都包括两部分:有效负载和标头。有效负载是数据包的实际内容,即正被发送的数据。标头包含有关数据包来自何处以及它属于哪个数据包组的信息。每种网络协议都会将标头附加到每个数据包上。

GRE 向每个数据包添加两个标头:GRE 标头(4 个字节长)和 IP 标头(20 个字节长)。GRE 标头表明封装数据包所使用的协议类型。IP 标头封装了原始数据包的标头和有效负载。这意味着 GRE 数据包通常包含两个 IP 标头:一个用于原始数据包,另一个由 GRE 协议添加。仅 GRE 隧道两端的路由器将引用原始的、非 GRE IP 标头。

GRE 的使用如何影响 MTU 和 MSS 要求?

MTUMSS 是用来限制通过网络传输的数据包最大长度的度量单位,就像对过桥车辆限重一样。MTU 测量数据包的总大小,包括标头;MSS仅测量有效负载。超过 MTU 值的数据包将被分成几段或分解成较小的数据包,使之适合在网络上传输。

像任何协议一样,使用 GRE 会在数据包原有大小基础上增加几个字节。在数据包的 MSS 和 MTU 设置中必须考虑这个因素。如果 MTU 设为 1,500 字节,MSS 设为 1,460 字节(考虑到必要的 IP 和 TCP 标头大小),则增加 GRE 24字节标头将导致数据包超过 MTU 限值:

1,460 字节 [有效负载] + 20 字节 [TCP 标头] + 20 字节 [IP 标头] + 24 字节 [GRE 标头+ IP 标头] = 1,524字节

因此,数据包将被分段。分段会减慢数据包传递,并增加算力开销,因为超出 MTU 的数据包必须分解然后重新组合。

通过减少 MSS 长度以包含 GRE 标头,可以避免这种情况。如果将 MSS 设置为 1,436 而不是 1,460,那么,GRE 标头的问题就得到了解决,并且数据包不会超过 MTU 值 1,500:

1,436 字节 [有效负载] + 20 字节 [TCP 标头] + 20 字节 [IP 标头] + 24 字节 [GRE 标头+ IP 标头] = 1,500 字节

尽管避免了分段,但结果却是有效载荷变小,这意味着需要额外的数据包来传递数据。例如,如果目标是传递 150,000 字节的内容(或大约 150 kB),假设 MTU 设置为 1,500,且未使用其他 3 层协议,那么,比较一下使用 GRE 和不使用 GRE 时分别需要多少个数据包:

  • 不使用 GRE,MSS 为 1,460: 103 个数据包
  • 使用 GRE,MSS 为 1,436: 105 个数据包

额外的两个数据包会增加毫秒级的数据传输延迟。但是,使用 GRE 比不使用 GRE 可以使这些数据包选择更快的网络路径,进而可以弥补损失的时间。

在 DDoS 攻击中如何使用 GRE?

分布式拒绝服务(DDoS)攻击中 ,攻击者试图用垃圾网络流量淹没目标服务器或网络,这有点像用虚假的订单轰炸一家餐馆,直到它无法为合法客户提供服务。

就像任何网络协议一样,GRE 可以用来进行 DDoS 攻击。有史以来最大的 DDoS 攻击之一发生在 2016 年 9 月。它针对安全研究人员的网站,并使用 Mirai 僵尸网络进行攻击。该网站被使用 GRE 协议的数据包淹没。

与某些其他协议不同,GRE 数据包的源无法被伪造或欺骗 。(请参阅我们有关 SYN 洪水DNS 放大攻击的文章,以了解协议示例,但本例并非如此)为发起大型 GRE DDoS 攻击,攻击者必须控制僵尸网络中大量真实存在的计算设备。

Cloudflare 如何防御 GRE DDoS 攻击?

Cloudflare 可抵御各种网络层 DDoS 攻击 ,包括使用 GRE 的攻击。Cloudflare Magic Transit 通过将Cloudflare 全球网络的 DDoS 缓解功能扩展到网络基础设施来保护本地 混合网络。任何攻击网络流量都会被过滤掉,而不会减慢合法流量。

Cloudflare 如何使用 GRE 隧道?

为了使 Magic Transit 保护和加速客户的网络流量,必须将 Cloudflare 网络安全地连接到客户的内部网络。正因为如此,GRE 隧道极为有用。借助于 GRE 隧道,Magic Transit 能够通过公共互联网与 Cloudflare 客户的网络实现安全直连。

Magic Transit 建立在 Cloudflare Anycast 网络基础上。这意味着任何 Cloudflare 服务器都可以使用单个 IP 地址充当 GRE 隧道的端点,从而消除了 GRE 隧道连接的单点故障(Cloudflare 也使用这种方式连接 Magic WAN 客户)。要了解有关 Magic Transit 工作原理的更多信息,请参阅我们的 Magic Transit 产品页面