IP : 通用路由封装 (GRE)

GRE隧道Keepalive

2015 年 8 月 28 日 - 机器翻译
其他版本: PDFpdf | 英语 (2015 年 4 月 23 日) | 反馈


目录


简介

本文档介绍 GRE Keepalive 及其工作原理。不支持结合使用 GRE 隧道 Keepalive 与隧道保护 ipsec 配置文件命令。本文档讨论这一问题。

注意: 在任何情况下,都不支持结合使用 GRE Keepalive 与 IPSec 隧道保护

先决条件

要求

本文档没有任何特定的要求。

使用的组件

本文档不限于特定的软件和硬件版本。

规则

有关文档规则的详细信息,请参阅 Cisco 技术提示规则

GRE 隧道 Keepalive 机制

GRE 隧道

GRE 隧道设计为完全无状态。这意味着每个隧道终点都不保存有关远程隧道终点状态或可用性的信息。其结果之一是,如果无法到达隧道的远程端,则本地隧道终点路由器无法关闭 GRE 隧道接口的线路协议。使用在链路远程端不可用时将接口标记为关闭的功能,是为了删除路由表中使用该接口作为出站接口的所有路由(具体说来是静态路由)。具体而言,如果接口的线路协议更改为关闭,则会从路由表中删除使用该接口的所有静态路由。这样,可以安装备选(浮动)静态路由,Policy Based Routing (PBR) 可以选择备选的下一跳或接口。

通常,GRE 隧道接口在配置后立即打开,只要存在打开的有效隧道源地址或接口,它就保持打开状态。隧道目标 IP 地址也必须可路由。即使隧道另一端未进行配置也是如此。这意味着,即使 GRE 隧道数据包未达到隧道另一端,通过 GRE 隧道接口对数据包进行的静态路由或 PBR 转发也仍然有效。

在实施 GRE Keepalive 之前,GRE 隧道关闭只有三个原因:

  • 没有指向隧道目标地址的路由。

  • 定位隧道源的接口关闭。

  • 指向隧道目标地址的路由通过隧道本身进行。

这三个规则(缺少路由、接口关闭和错误路由的隧道目标)是隧道终点处的路由器的本地问题,不是相关网络的问题。例如,如果 GRE 隧道数据包成功转发,但在到达通道另一端之前丢失,则问题并非由这些规则所引起。这样,通过 GRE 隧道的数据包会“被黑洞吞噬”,即使可以使用 PBR 备选路由或另一个接口的浮动静态路由。GRE 隧道接口上的 Keepalive 可以解决这一问题,方式与 Keepalive 在物理接口上的使用方式相同。

使用Cisco IOS�软件版本12.2(8)T,配置在一个点到点GRE隧道接口的Keepalive是可能的。通过这一更改,如果 Keepalive 在某一时间段内出现故障,则隧道接口会动态关闭。为了更好地理解 GRE 隧道 Keepalive 的工作原理,下面几节讨论其他一些常见 Keepalive 机制。

常见 Keepalive 机制

Keepalive 消息由一个网络设备通过物理电路或虚电路发送,以通知另一个网络设备其间电路仍正常工作。Keepalive 间隔是网络设备发送的两个 Keepalive 消息之间的时间段。Keepalive 重试次数是在接口关闭之前,设备在没有响应的情况下继续发送 Keepalive 数据包的次数。

以太网 Keepalive

在广播介质(如以太网)上,Keepalive 稍有不同。以太网上可能存在许多邻居,因此,Keepalive 不会确定指向线路上任何特定邻居的路径是否可用。它仅检查本地系统是否拥有对以太网线路的读取和写入访问权限。路由器生成一个以太网数据包,将自己作为源和目标 MAC 地址,并使用特殊的以太网类型代码 0x9000。以太网硬件将该数据包发送到以太网线路,随后立即接收该数据包。这样可以检查以太网适配器的发送和接收硬件以及线路的基本完整性。

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-a.gif

HDLC Keepalive

另一个众所周知的 Keepalive 机制是 HDLC 的串行 Keepalive。串行 Keepalive 在两个路由器之间来回发送,Keepalive 得到确认。通过序列号,每个路由器都跟踪发送和确认的 Keepalive 数据包。这样,远程路由器可以查看彼此的 Keepalive,并跟踪其发送的 Keepalive 是否被接收。

为说明串行 Keepalive 的工作原理,路由器 1 和路由器 2 分别通过 Serial0/0 和 Serial2/0 直接连接。在路由器 1 输出中,故意关闭了 Serial0/0。这样,路由器 2 会错过三个 Keepalive,以此说明这个故障在错过 Keepalive 时是如何使路由器 2 关闭 Serial2/0 的。

下面是启用 Keepalive 时,HDLC 连接的调试串行接口命令的示例输出。在路由器 2 上,如果 myseq 和 mineseen 字段值之差大于 3,线路将断开,并重置接口。

路由器 1
17:21:09.685: Serial0/0: HDLC myseq 0, mineseen 0*, yourseen 1, line up 
17:21:19.725: Serial0/0: HDLC myseq 1, mineseen 1*, yourseen 2, line up
17:21:29.753: Serial0/0: HDLC myseq 2, mineseen 2*, yourseen 3, line up
17:21:39.773: Serial0/0: HDLC myseq 3, mineseen 3*, yourseen 4, line up
17:21:49.805: Serial0/0: HDLC myseq 4, mineseen 4*, yourseen 5, line up
17:21:59.837: Serial0/0: HDLC myseq 5, mineseen 5*, yourseen 6, line up
17:22:09.865: Serial0/0: HDLC myseq 6, mineseen 6*, yourseen 7, line up
17:22:19.905: Serial0/0: HDLC myseq 7, mineseen 7*, yourseen 8, line up
17:22:29.945: Serial0/0: HDLC myseq 8, mineseen 8*, yourseen 9, line up
Router1 (config-if)#shut
17:22:39.965: Serial0/0: HDLC myseq 9, mineseen 9*, yourseen 10, line up
17:22:42.225: %LINK-5-CHANGED: Interface Serial0/0, changed state 
to administratively down

17:22:43.245: %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial0/0, 
changed state to down

路由器 2
*Sep 24 17:21:04.929: Serial2/0: HDLC myseq 0, mineseen 0, yourseen 0, line up 
*Sep 24 17:21:14.941: Serial2/0: HDLC myseq 1, mineseen 1*, yourseen 1, line up 
*Sep 24 17:21:24.961: Serial2/0: HDLC myseq 2, mineseen 2*, yourseen 2, line up 
*Sep 24 17:21:34.981: Serial2/0: HDLC myseq 3, mineseen 3*, yourseen 3, line up 
*Sep 24 17:21:45.001: Serial2/0: HDLC myseq 4, mineseen 4*, yourseen 4, line up 
*Sep 24 17:21:55.021: Serial2/0: HDLC myseq 5, mineseen 5*, yourseen 5, line up 
*Sep 24 17:22:05.041: Serial2/0: HDLC myseq 6, mineseen 6*, yourseen 6, line up 
*Sep 24 17:22:15.061: Serial2/0: HDLC myseq 7, mineseen 7*, yourseen 7, line up 
*Sep 24 17:22:25.081: Serial2/0: HDLC myseq 8, mineseen 8*, yourseen 8, line up 
*Sep 24 17:22:35.101: Serial2/0: HDLC myseq 9, mineseen 9*, yourseen 9, line up 
*Sep 24 17:22:45.113: Serial2/0: HDLC myseq 10, mineseen 10*, yourseen 10, line up 
*Sep 24 17:22:55.133: Serial2/0: HDLC myseq 11, mineseen 10, yourseen 10, line up 
*Sep 24 17:23:05.153: HD(0): Reset from 0x203758
*Sep 24 17:23:05.153: HD(0): Asserting DTR 
*Sep 24 17:23:05.153: HD(0): Asserting DTR and RTS 
*Sep 24 17:23:05.153: Serial2/0: HDLC myseq 12, mineseen 10, yourseen 10, line up 
*Sep 24 17:23:15.173: HD(0): Reset from 0x203758
*Sep 24 17:23:15.173: HD(0): Asserting DTR 
*Sep 24 17:23:15.173: HD(0): Asserting DTR and RTS 
*Sep 24 17:23:15.173: Serial2/0: HDLC myseq 13, mineseen 10, yourseen 10, line down 
17:23:16.201: %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial2/0, 
changed state to down
Router2#
17:23:25.193: Serial2/0: HDLC myseq 14, mineseen 10, yourseen 10, line down

GRE隧道Keepalive

GRE 隧道 Keepalive 机制对于以太网或串行接口稍有不同。它使一端能够与远程路由器之间发起和接收 Keepalive 数据包(即使远程路由器不支持 GRE Keepalive)。GRE 是 IP 内隧道传输 IP 的数据包隧道机制,因此,GRE IP 隧道数据包可以在另一个 GRE IP 隧道数据包里构建。对于 GRE Keepalive,发送方在原始 Keepalive 请求包中预先构建 Keepalive 响应数据包,远程端只需对外部 GRE IP 报头执行标准 GRE 解封,然后转发内部 IP GRE 数据包。通过这种机制,可以将 Keepalive 响应转发出物理接口而不是隧道接口。这意味着,GRE Keepalive 响应数据包不会受隧道接口上的任何输出功能(如“隧道保护...”、QoS 等)影响。

注意: 如果在 GRE 隧道接口上配置了入站 ACL,则必须允许对面设备发送的 GRE 隧道 Keepalive 数据包。否则,对面设备的 GRE 隧道会关闭。(access-list <编号> permit gre host <隧道源> host <隧道目标>)

GRE 隧道 Keepalive 的另一个特性是每一端的 Keepalive 计时器都是独立的,不要求一定匹配。只在隧道一端配置 Keepalive 的问题在于,如果 Keepalive 计时器过期,只有配置了 Keepalive 的路由器才会将其隧道接口标记为关闭。另一端的 GRE 隧道接口(未配置 Keepalive)保持为打开状态,即使通道另一端关闭也是如此。对于从未配置 Keepalive 的一端发送到隧道中的数据包而言,隧道可能成为黑洞。在大型星型 GRE 隧道网络中,可能只适合在辐射端配置 GRE Keepalive,而不适合在中心端配置。这是因为,通常情况下,更重要的是使辐射端发现无法到达中心端,从而切换为备份路径(例如拨号备份)。

隧道 Keepalive 工作原理

GRE 隧道是 Cisco 路由器的逻辑接口,通过它可以将乘客数据包封装在传输协议内。设计此体系结构的目的是为了提供实现点对点封装方案的服务。

这些数据包说明了 IP 隧道的概念,其中 GRE 是封装协议,IP 是传输协议。乘客协议也是 IP(尽管它也可能是其他协议,如 Decnet、IPX 或 AppleTalk)。

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-b.gif

  • IP 是传输协议。

  • GRE 是封装协议。

  • IP 是乘客协议。

为了更好地理解隧道 Keepalive 机制的工作原理,考虑下面的示例隧道拓扑和配置。路由器 A 和路由器 B 的物理接口分别是 S1 和 S2,隧道接口称为 Tu0。两个 GRE 隧道终点路由器之间是 IP 骨干网络。

这是从路由器 A 发起、以路由器 B 为目标的 Keepalive 数据包示例。路由器 B 返回给路由器 A 的 Keepalive 响应已在内部 IP 报头中。路由器 B 只是解封 Keepalive 数据包,然后将其发送出物理接口 (S2)。它处理 GRE Keepalive 数据包的方式与任何其他 GRE IP 数据包一样。

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-1.gif

此输出显示用于在 GRE 隧道上配置 Keepalive 的命令。

Router# configure terminal
Router(config)#interface tunnel0
Router(config-if)#keepalive 5 4          

!--- The syntax of this command is keepalive [seconds [retries]].



!--- Keepalives are sent every 5 seconds and 4 retries.
!--- Keepalives must be missed before the tunnel is shut down.
!--- The default values are 10 seconds for the interval and 3 retries.

注意: 仅在点对点 GRE 隧道上支持 GRE 隧道 Keepalive。隧道 Keepalive 可在多点 GRE (mGRE) 隧道上配置,但是没有任何效果。

此表列出了路由器 A 和路由器 B 的配置,两个路由器都配置了隧道 Keepalive

主机名路由器 A 主机名路由器 B
interface loopback 0
  ip address 129.9.9.9 255.255.255.255
interface tunnel 0
  ip address 1.1.1.1 255.255.255.240
  tunnel source loopback0
  tunnel destination 128.8.8.8
  keepalive 5 4
interface loopback 0
  ip address 128.8.8.8 255.255.255.255
interface tunnel 0
  ip address 1.1.1.2 255.255.255.240
  tunnel source loopback0
  tunnel destination 129.9.9.9
  keepalive 5 4 

在路由器 A 的隧道终点上启用 Keepalive 时,路由器每隔 <period> 时间都会使用协议类型 (PT) 0 构造内部 IP 报头和 GRE 报头。它随后将数据包发送出其隧道接口,这会导致使用外部 IP 报头和 PT = IP 的 GRE 报头封装数据包。路由器 A 使隧道 Keepalive 计数器递增一。假设可以到达远端隧道终点并且隧道线路协议因其他原因未关闭,则数据包会到达路由器 B。它随后针对隧道 0 进行匹配,进行解封,并转发到目标 IP(路由器 A 上的隧道源 IP 地址)。到达路由器 A 时,数据包解封,PT 检查结果为 0。这表示这是 Keepalive 数据包。然后,隧道 Keepalive 计数器重置为 0,丢弃数据包。

如果无法到达路由器 B,则路由器 A 继续构造并发送 Keepalive 数据包以及普通数据流。如果 Keepalive 未返回,只要隧道 Keepalive 计数器小于 <retries> 数字,隧道线路协议就保持为打开状态。如果不是这种情况,则当路由器 A 下次尝试将 Keepalive 发送到路由器 B 时,线路协议会关闭。

在打开/关闭状态下,隧道不转发或处理任何数据流。不过,它会继续发送 Keepalive 数据包。接收到 Keepalive 响应时,如果指示可再次到达隧道终点,则隧道 Keepalive 计数器重置为 0,并且隧道上的线路协议会打开。

注意: 如果由于Keepalive丢弃通道去上下状态、enable (event)调试通道调试隧道保活

此表显示调试隧道保活输出示例:在路由器A的:

主机名路由器 A
debug tunnel keepalive
        Tunnel keepalive debugging is on
        *Mar  1 01:19:16.019: Tunnel0: sending keepalive, 128.8.8.8->129.9.9.9 (len=24 ttl=0), counter=15
        *Mar  1 01:19:21.019: Tunnel0: sending keepalive, 128.8.8.8->129.9.9.9 (len=24 ttl=0), counter=16
        *Mar  1 01:19:26.019: Tunnel0: sending keepalive, 128.8.8.8->129.9.9.9 (len=24 ttl=0), counter=17

此图是一个示例方案,说明在路由器 A 将 GRE Keepalive 发送到路由器 B 时发生的情况:

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-2.gif

此图是一个示例方案,演示在路由器 B 将 GRE Keepalive 发送到路由器 A 时发生的情况:

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-3.gif

IPSec 和 GRE Keepalive

采用 IPSec 的 GRE 隧道

IPSec 不支持 IP 组播数据包,因此,GRE 隧道有时与 IPSec 结合使用。这样,动态路由协议无法在 IPSec VPN 网络上成功运行。GRE 隧道支持 IP 组播,因此,动态路由协议可以在 GRE 隧道上运行。随后,可以通过 IPSec 加密 GRE IP 单播数据包。

IPSec 可通过两种不同的方式加密 GRE 数据包。一种方式是使用加密映射,另一种方式是使用隧道保护。这两种方法都指定在添加 GRE 封装之后执行 IPSec 加密。如果使用加密映射,则将应用于 GRE 隧道数据包的出站物理接口。如果使用隧道保护,是在 GRE 隧道接口上配置的。Cisco IOS 软件版本 12.2(13)T 提供了隧道保护命令

注意: GRE Keepalive 不与隧道保护兼容。

此图说明通过 GRE 隧道接口进入路由器的加密数据包。路由器将加密映射应用于物理接口。数据包解密和解封后,会以明文形式发送到 IP 目标。

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-4.gif

此图说明在 GRE 隧道接口上配置隧道保护时发生的情况。数据包在继续以明文形式发送到目标之前,会通过隧道接口进入加密的路由器并进行解密和解封。

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-5.gif

使用加密映射与使用隧道保护这两种方式存在两个重要差异:

  • IPSec 加密映射绑定到物理接口,在数据包转发出物理接口时进行检查。

    注意: GRE 隧道此时已对数据包进行 GRE 封装。

  • 隧道保护将加密功能绑定到 GRE 隧道,在对数据包进行 GRE 封装之后,并且在将数据包发送到物理接口之前进行检查。

结合使用 IPSec 和 GRE 时的 Keepalive 问题

如果在 GRE IPSec 隧道的一端使用加密映射(在物理接口上配置),在另一端配置隧道保护,则会出现问题。隧道保护只能在隧道接口(不是物理接口)上进行配置。可以在星型设计中进行这类配置。隧道保护在中心路由器上配置以减少配置的大小,而在每个辐射端使用静态加密映射。在此方案中,如果在辐射端配置 GRE 隧道 Keepalive,则 Keepalive 会发生故障。这是因为从 HUB 返回的 Keepalive 会遍历未配置加密映射的物理接口。因此,返回的 Keepalive 未经加密,接收路由器(最初发送 Keepalive 数据包的路由器)会丢弃该 Keepalive 响应,因为它不受 IPSec 保护(加密)。

下图对这一问题进行说明:

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-9.gif

这个问题是可以避免的,如果在配置了隧道保护的路由器上配置 GRE Keepalive,也是有益的。下图对此进行说明:

http://www.cisco.com/c/dam/en/us/support/docs/ip/generic-routing-encapsulation-gre/64565-gre-tunnel-keepalive-10.gif

如果中心使用动态加密映射,辐射路由器使用隧道保护,则可以在辐射路由器上配置 GRE Keepalive,这样可以在辐射端的隧道接口关闭时触发备份接口向中心拨号。

尽管中心的 GRE 隧道接口仍保持为打开状态,路由邻居和隧道路由会丢失,可能会建立备用路由。在辐射端,隧道接口关闭可能会触发打开拨号器接口并回拨到中心(或中心的其他路由器),然后建立新连接。

如果两个路由器都配置了加密映射,则隧道 Keepalive 可以在两个方向上传送,GRE 隧道接口可以在任一方向或两个方向关闭,并且触发建立备份连接。这是最灵活的方法。

如果两个路由器都配置了隧道保护,则无法在任一方向使用 GRE 隧道 Keepalive。在这种情况下,必须使用路由协议或其他机制(如 Service Assurance Agent)才能发现隧道未正常工作。

相关的思科支持社区讨论

思科支持社区是您提问、解答问题、分享建议以及与工作伙伴协作的论坛。


相关信息


Document ID: 64565