此产品的文档集力求使用非歧视性语言。在本文档集中,非歧视性语言是指不隐含针对年龄、残障、性别、种族身份、族群身份、性取向、社会经济地位和交叉性的歧视的语言。由于产品软件的用户界面中使用的硬编码语言、基于 RFP 文档使用的语言或引用的第三方产品使用的语言,文档中可能无法确保完全使用非歧视性语言。 深入了解思科如何使用包容性语言。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文档介绍通用路由封装(GRE)保持连接及其工作原理。
GRE 隧道是 Cisco 路由器的逻辑接口,通过它可以将乘客数据包封装在传输协议内。这种架构旨在提供各种服务以实施点对点封装方案。
GRE 隧道设计为完全无状态。这意味着每个隧道终端不会保留有关远程隧道终端的状态或可用性的任何信息。由此产生的后果是,如果无法访问隧道的远程端,本地隧道终端路由器将无法关闭 GRE 隧道接口的线路协议。使用在链路远程端不可用时将接口标记为关闭的功能,是为了删除路由表中使用该接口作为出站接口的所有路由(具体说来是静态路由)。具体而言,如果接口的线路协议更改为关闭,则会从路由表中删除使用该接口的所有静态路由。这样就可以安装备用(浮动)静态路由,或实施基于策略的路由 (PBR),以便选择备用的下一跳或接口。
通常,GRE 隧道接口在配置后立即打开,只要存在打开的有效隧道源地址或接口,它就保持打开状态。隧道目标 IP 地址也必须可路由。即使隧道另一端未进行配置也是如此。这意味着,即使 GRE 隧道数据包未达到隧道另一端,通过 GRE 隧道接口对数据包进行的静态路由或 PBR 转发也仍然有效。
在实施 GRE 保持连接前,只能够确定路由器上的本地问题,而无法确定中间网络中的问题。例如,GRE 隧道数据包转发成功但在到达隧道另一端之前丢失的情况。此类情况将导致通过GRE隧道的数据包被设置为“黑洞”,即使有使用PBR的备用路由或通过其他接口的浮动静态路由可用。GRE 隧道接口上的 Keepalive 可以解决这一问题,方式与 Keepalive 在物理接口上的使用方式相同。
注意:在任何情况下,GRE keepalive都不支持IPsec隧道保护。本文档讨论这一问题。
GRE 隧道保持连接机制与 PPP 保持连接类似,因为即使远程路由器不支持 GRE 保持连接,它也会使一端能够与远程路由器之间进行保持连接数据包收发。GRE 是 IP 内隧道传输 IP 的数据包隧道机制,因此,GRE IP 隧道数据包可以在另一个 GRE IP 隧道数据包里构建。对于 GRE 保持连接,发送方会在原始保持连接请求数据包内预构建保持连接响应数据包,以便远程终端只需对外部 GRE IP 报头执行标准 GRE 解封,然后将内部 IP GRE 数据包回复给发送方即可。这些数据包说明了 IP 隧道的概念,其中 GRE 是封装协议,IP 是传输协议。乘客协议也是 IP(但也可以是 Decnet、网际分组交换 [IPX] 或 Appletalk 等其他协议)。
正常数据包:
IP 报头 |
TCP 报头 |
Telnet |
隧道数据包:
GRE IP 报头 |
GRE |
|
以下是源自路由器 A 并发往路由器 B 的保持连接数据包的示例。路由器 B 返回给路由器 A 的 Keepalive 响应已在内部 IP 报头中。路由器 B 只是解封 Keepalive 数据包,然后将其发送出物理接口 (S2)。它处理 GRE Keepalive 数据包的方式与任何其他 GRE IP 数据包一样。
GRE 保持连接:
GRE IP 报头 |
GRE |
|
|||||||
源 A | 目的 B | PT=IP |
通过这种机制,可以将 Keepalive 响应转发出物理接口而不是隧道接口。这意味着 GRE 保持连接响应数据包不受隧道接口上任何 output 功能(例如“tunnel protection ...”、QoS、虚拟路由和转发 [VRF] 等)的影响。
注意:如果在GRE隧道接口上配置了入站访问控制列表(ACL),则必须允许对端设备发送的GRE隧道keepalive数据包。否则,相反的设备GRE隧道会关闭。(access-list <编号> permit gre host <隧道源> host <隧道目标>)
GRE 隧道保持连接所具有的另一个属性是,两端的保持连接计时器相互独立且不必匹配,类似于 PPP 保持连接。
提示:仅在隧道的一端配置keepalive的问题在于,如果keepalive计时器超时,只有配置了keepalive的路由器才会将其隧道接口标记为关闭。另一端的 GRE 隧道接口(未配置 Keepalive)保持为打开状态,即使通道另一端关闭也是如此。对于从未配置 Keepalive 的一端发送到隧道中的数据包而言,隧道可能成为黑洞。
提示:在大型集中星型GRE隧道网络中,可以只将GRE Keepalive配置在辐射端,而不配置在中心端。这是因为,通常情况下,更重要的是使辐射端发现无法到达中心端,从而切换为备份路径(例如拨号备份)。
使用 Cisco IOS® 软件版本 12.2(8)T,可以在点对点 GRE 隧道接口上配置 Keepalive。通过这一更改,如果 Keepalive 在某一时间段内出现故障,则隧道接口会动态关闭。
有关其他形式保持连接机制的工作方式的详细信息,请参阅 Cisco IOS 上的保持连接机制概述。
注意:仅在点对点GRE隧道上支持GRE隧道keepalive。隧道 Keepalive 可在多点 GRE (mGRE) 隧道上配置,但是没有任何效果。
注:一般来说,在隧道接口和fVRF('tunnel vrf ...)上使用VRF时,隧道keepalive无法工作。')和iVRF('ip vrf forwarding ...)'(在隧道接口上)不匹配。在将保持连接“反射”回请求者的隧道终端上,这一点非常重要。当收到保持连接请求时,它会在 fVRF 中接收并进行解封。这会显示出预先构建的保持连接应答,随后需将此应答转发回发送方,但此转发是在隧道接口上的 iVRF 上下文中进行的。因此,如果 iVRF 和 fVRF 不匹配,则保持连接应答数据包不会转发回发送方。即使您将 iVRF 和/或 fVRF 替换为“global”,也是如此。
此输出显示用于在 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.
为了更好地了解隧道保持连接机制的工作方式,请参考以下隧道拓扑和配置示例:
Router A
interface loopback 0
ip address 192.168.1.1 255.255.255.255
interface tunnel 0
ip address 10.10.10.1 255.255.255.252
tunnel source loopback0
tunnel destination 192.168.1.2
keepalive 5 4
Router B
interface loopback 0
ip address 192.168.1.2 255.255.255.255
interface tunnel 0
ip address 10.10.10.2 255.255.255.252
tunnel source loopback0
tunnel destination 192.168.1.1
keepalive 5 4
在此场景中,路由器 A 执行以下步骤:
IP 报头 |
GRE |
|
源:192.168.1.2 | 目的地:192.168.1.1 | PT=0 |
GRE IP 报头 |
GRE |
|
|||||||
源:192.168.1.1 | 目的地:192.168.1.2 | PT=IP |
IP 报头 |
GRE |
|
源:192.168.1.2 | 目的地:192.168.1.1 | PT=0 |
如果无法访问路由器 B,路由器 A 会继续构建并发送保持连接数据包以及正常流量。如果保持连接未恢复,只要隧道保持连接计数器小于重试次数(在本例中为 4),隧道线路协议就会保持运行。如果不是这种情况,则当路由器 A 下次尝试将 Keepalive 发送到路由器 B 时,线路协议会关闭。
注意:在打开/关闭状态下,隧道不会转发或处理任何数据流量。不过,它会继续发送 Keepalive 数据包。在收到保持连接响应时,如果此响应暗示隧道终端重新恢复可访问性,则隧道保持连接计数器会重置为 0,并且隧道上的线路协议会运行。
要查看保持连接的运行,请启用调试隧道和调试隧道保持连接。
路由器 A 的调试示例:
debug tunnel keepalive
Tunnel keepalive debugging is on
01:19:16.019: Tunnel0: sending keepalive, 192.168.1.1->192.168.1.2
(len=24 ttl=0), counter=15
01:19:21.019: Tunnel0: sending keepalive, 192.168.1.1->192.168.1.2
(len=24 ttl=0), counter=16
01:19:26.019: Tunnel0: sending keepalive, 192.168.1.1->192.168.1.2
(len=24 ttl=0), counter=17
单播 RPF(单播逆向路径转发)是一项安全功能,可根据路由表验证数据包源地址,从而帮助检测和丢弃伪造的 IP 流量。 如果单播 RPF 在严格模式下运行 (ip verify unicast source reachable-via rx),则必须在路由器用于转发返回数据包的接口上接收该数据包。如果在接收GRE Keepalive数据包的路由器的隧道接口上启用了严格模式或松散模式单播RPF,则Keepalive数据包在隧道解封后由RPF丢弃,因为通往数据包源地址(路由器自己的隧道源地址)的路由不是通过隧道接口。可以在 show ip traffic 输出中观察到 RPF 丢包,如下所示:
Router#show ip traffic | section Drop
Drop: 0 encapsulation failed, 0 unresolved, 0 no adjacency
0 no route, 156 unicast RPF, 0 forced drop
0 options denied
因此,隧道keepalive的发起方会由于丢失的keepalive返回数据包而关闭隧道。因此,为了使 GRE 隧道保持连接正常工作,单播 RPF 不得配置为严格或宽松模式。有关单播 RPF 的详细信息,请参阅了解单播逆向路径转发。
GRE 隧道有时与 IPsec 结合使用,因为 IPsec 不支持 IP 组播数据包。因此,动态路由协议无法在 IPsec VPN 网络中成功运行。GRE 隧道支持 IP 组播,因此,动态路由协议可以在 GRE 隧道上运行。所生成的 GRE IP 单播数据包可由 IPsec 加密。
IPsec 可通过以下两种方法加密 GRE 数据包:
这两种方法都指定在添加 GRE 封装后执行 IPsec 加密。使用加密映射与使用隧道保护,主要存在以下两个区别:
考虑到两种向 GRE 隧道添加加密的方法,可使用三种不同的方法来设置加密的 GRE 隧道:
场景 1 和场景 2 中所述的配置通常采用中心辐射型设计。隧道保护在中心路由器上配置以减少配置的大小,而在每个辐射端使用静态加密映射。
请考虑在对等体 B(分支)上启用 GRE 保持连接并且使用隧道模式进行加密的以下每个场景。
设置:
-----------
在此场景中,由于在对等体 B 上配置了 GRE 保持连接,生成保持连接时发生的一系列事件如下:
IP 报头 |
ESP 报头 |
GRE IP 报头 |
GRE 报头 |
|
ESP 报尾 |
|||||||
源B | 目的地 A | 源B | 目的地 A | PT=IP |
GRE IP 报头 |
GRE |
|
|||||||
源B | 目的地 A | PT=IP |
IP 报头 |
GRE |
|
源A | 目的地 B | PT=0 |
IP 报头 |
GRE |
|
源A | 目的地 B | PT=0 |
注:keepalive未加密。
因此,即使对等体A对保持连接作出响应,而路由器对等体B收到响应,它也不会处理这些响应,最终会将隧道接口的线路协议更改为关闭状态。
结果:
----------
在对等体 B 上启用保持连接会导致对等体 B 上的隧道状态更改为“打开/关闭”。
设置:
-----------
在此场景中,由于在对等体 B 上配置了 GRE 保持连接,因此生成保持连接时发生的一系列事件如下:
IP 报头 |
ESP 报头 |
GRE IP 报头 |
GRE 报头 |
|
ESP 报尾 |
|||||
源B | 目的地 A | 源B | 目的地 A | PT=IP |
GRE IP 报头 |
GRE |
|
|||||||
源B | 目的地 A | PT=IP |
IP 报头 |
GRE |
|
源A | 目的地 B | PT=0 |
IP 报头 |
ESP 报头 |
|
ESP 报尾 |
|||||||
源B | 目的地 A |
注意:保持连接响应已加密。
IP 报头 |
GRE |
|
源A | 目的地 B | PT=0 |
结果:
----------
在对等B上启用Keepalive成功根据隧道目标的可用性确定隧道状态。
设置:
-----------
此场景与场景 1 类似,因为当对等体 A 收到加密的保持连接时,会对其进行解密和解封。但是,它不会对转发出去的响应进行加密,因为对等体 A 在隧道接口上使用隧道保护。因此,对等体 B 会丢弃未加密的保持连接响应,并且不对其进行处理。
结果:
----------
在对等体 B 上启用保持连接会导致对等体 B 上的隧道状态更改为“打开/关闭”。
在必须加密 GRE 数据包的情况下,有三种可能的解决方案:
版本 | 发布日期 | 备注 |
---|---|---|
2.0 |
19-Dec-2022 |
添加了Alt文本。更新了简介、编号、样式要求和格式。 |
1.0 |
31-Oct-2014 |
初始版本 |