在本课中,你将学习高级路由概念。你还将学习有用的故障排除命令来调试路由问题。
完成本课后,你应该能够实现上图显示的目标。
通过展示路由能力,你将能够描述FortiGate如何路由流量,诊断RPF检查引起的路由问题,识别通过不同路径路由的会话,并使用调试命令对路由问题进行故障排除。
在本节中,你将了解一般路由概念和故障排除。
FortiGate是一个有状态的设备,因此它在会话开始时根据第一个数据包解码大量信息。对于任何流量会话,FortiGate通常只执行两次路由查找:一次在发起人发送的第一个数据包上,另一次在响应者发送的第一个回复数据包上。之后,所有路由信息都写入FortiGate会话表中。然而,在更改路由表后,路由信息会从会话表中受影响的条目中刷新。因此,FortiGate执行额外的路由表查找,以便用新的路由信息重新填充会话表。
请注意,路由缓存已从Linux内核3.6及更高版本的路由查找过程中删除。
上图的流程图描述了FortiOS中的路由查找流程。请注意,策略路由可以是常规策略路由、互联网服务数据库(ISDB)路由或SD-WAN规则。
首先,FortiGate检查策略路由。FortiGate检查的第一类策略路由是常规策略路由。如果有匹配,并且所选操作是转发流量,只要策略路由通过转发信息库(FIB)验证过程,FortiGate将相应地路由数据包。如果所选操作是停止策略路由,FortiGate将继续检查其路由缓存(如果适用)。
如果数据包与任何常规策略路由不匹配,FortiGate会先检查ISDB路由,然后检查SD-WAN规则。
接下来,FortiGate检查FIB,这是用于执行标准路由的表。从内核的角度来看,FIB可以被描述为路由表,主要由路由表中的路由构建,但也由FortiOS所需的特定系统条目构建。如果数据包与FIB中的任何路由不匹配,FortiGate会丢弃数据包,并向发件人发送ICMP目标网络无法访问的消息。
上图还显示了可用于显示策略路由、路由缓存条目(如果适用)、路由表条目和FIB条目的FortiOS CLI命令。
上图显示了如果有多于一个到目的地的路由,选择使用哪个路由的过程。
首先,FortiGate使用最具体的路线,即网掩码最长(最小子网)的路线。如果有两条或多条具有相同最长网掩码的路线,设备会选择距离最短的路线。在那之后,FortiGate使用最低的指标作为动态路线的决胜者。在静态路由的情况下,FortiGate使用最低优先级。如果有多个路线具有相同的网掩码、距离、度量和优先级,FortiGate会在所有路由之间共享流量。这被称为等成本多路径(ECMP)。ECMP支持静态、BGP和OSPF路由。
仅当路由满足以下所有要求时,FortiGate才会将静态路由添加到路由表中:
● 出站接口在线。
● 没有距离较短的重复路线。
● 链路运行状况监视器(如果配置)已运行。
现在,你将了解一个重要的路由概念:RPF检查。
RPF检查通过检查到达源IP地址的路由来防止IP欺骗攻击和路由环路。在创建会话时,只对第一个数据包进行此检查。如果检查失败,则丢弃数据包,调试流程显示此错误:reverse path check fail, drop。
RPF有两种类型,可行和严格。你可以使用上图显示的命令来配置所需的行为。
上图的示例显示了FortiGate使用可行的路径RPF检查模式。当FortiGate执行RPF检查时,它会检查路由表中与第一个原始数据包的源地址和传入接口匹配的路由。
根据上图显示的拓扑和路由表,来自每个用户的流量的RPF检查结果如下:
● 用户A:通过。有一个通过wan1的默认路由。这意味着在wan1接收的所有数据包都会通过RPF检查,无论源地址如何。
● 用户B:失败。FortiGate的路由表中没有通过wan2到95.56.234.24的路由。
● 用户C:失败。FortiGate在其路由表中没有通过端口1到10.0.4.63的路由。
上图的示例显示了FortiGate使用可行的路径RPF检查模式。当FortiGate执行RPF检查时,它会检查路由表中与第一个原始数据包的源地址和传入接口匹配的路由。
根据上图显示的拓扑和路由表,来自每个用户的流量的RPF检查结果如下:
● 用户A:通过。有一个通过wan1的默认路由。这意味着在wan1接收的所有数据包都会通过RPF检查,无论源地址如何。
● 用户B:失败。FortiGate的路由表中没有通过wan2到95.56.234.24的路由。
● 用户C:失败。FortiGate在其路由表中没有通过端口1到10.0.4.63的路由。
上图的示例显示了FortiGate使用严格的RPF检查模式。在严格模式下,FortiGate还检查匹配的路线是否是通往源的最佳路由。
根据上图显示的拓扑和路由表,来自每个用户的流量的RPF检查结果如下:
● 用户A:通过。有一个通过wan1的默认路由。这条路由也是通往71.234.149.16的最佳(也是唯一的)路由。
● 用户B:失败。有一个通过wan2的默认路由。然而,通过wan1有一条更好的(更具体的)静态路由到95.56.234.24。
● 用户C:通过。FortiGate在其路由表中通过端口1有一条通往10.0.4.63的路由。虽然默认通过端口1。通过wan1和wan2的路由也是10.0.4.63的有效路由,但用户C的最佳路由是通过端口1的路由。
像可行的路径示例一样,你可以通过在路由表中进行相应的更改来解决用户B的RPF失败问题,因此用户B的最佳路由是通过wan2。
内容检查要求路由尽可能保持对称;即,流量必须双向遵循相同的路径。有多种情况不对称路由阻止FortiGate检查流量内容。因此,FortiGate对称地路由流量。这意味着,在某些网络拓扑中,FortiGate可能不会通过最佳路径路由返回流量,而是通过与原始流量使用的相同路径。为此,FortiGate记住与源的接口,并使用该接口路由返回数据包,即使存在使用不同接口的更好路由。
现在,你将分析上图显示的网络拓扑结构。本地网络10.1.0.0/24有三个网络设备:一个本地工作站、一个本地路由器和FortiGate端口1。此外,FortiGate端口2直接连接到本地路由器(使用子网10.2.0.0/24)。
有一个远程路由器连接到FortiGate端口3,后面有一个远程服务器(10.4.0.1)。因此,任何指向远程服务器的流量都必须通过FortiGate进行路由。这个网络中需要注意的一个重要细节是,本地工作站的默认网关是10.1.0.254。这意味着,如果你从本地工作站向远程服务器发送ICMP回声请求,数据包将先发送到本地路由器,然后发送到FortiGate,然后发送到远程路由器,最后发送到目的地。
FortiGate在会话表中创建一个条目。此条目包含有关源接口的信息。可以使用命令diagnose sys session list查看。
FortiGate进行第一次路由查找,以找到目的地的下一跳。该IP地址也存储在会话信息中。
由于尚未有ICMP回声回复,源的下一跳仍然未知(它是0.0.0.0)。它在与第一个回复数据包一起发生的第二个路由查找中被识别。
现在,看看FortiGate如何路由返回数据包。
因此,在这种情况下,设备通过端口2将数据包路由到本地路由器,即使通过端口1有更好的路由到目的地。因为已经有一个会话条目,所以当FortiGate收到ICMP回声回复时,它会使用源接口。FortiGate路由表显示port1是通往10.1.0.1(本地连接)的最佳路由,但它仍然使用port2。目标是保持交通流量对称。
FortiOS执行第二次路由查找,这次是为了找到源的下一跳(或网关)。该IP地址被添加到会话中,会话之前设置为0.0.0.0。
如果流量来自服务器端,会发生什么?
假设ping从远程服务器发送到本地工作站。在这种情况下,当ICMP回声请求到达FortiGate时,还没有会话。因此,FortiGate使用10.1.0.1的最佳路由,即通过端口1。
上图显示的示例展示了在某些网络拓扑结构中,FortiGate如何将数据包以不同的方式路由到同一目的地,具体取决于谁发起了会话。
看看上图显示的示例中的回复流量。使用嗅探器工具查看交通流量。
由于本地工作站的默认网关为10.1.0.254,ICMP回声回复首先发送到本地路由器。然后,数据包到达FortiGate端口2。结果是不对称路由:返回的流量遵循的路径与原始流量不同。返回数据包到达端口2,而不是端口1(发送原始流量的地方)。
在这些特殊情况下,FortiGate接受这种不对称性,不会丢弃数据包,安全检查也不受影响。
上图展示了FortiOS不允许不对称路由的示例。
1. 服务器通过本地路由器的端口2向PC发送回声请求,有效地绕过FortiGate。
2. 当它收到回声请求时,PC通过其默认网关进行回声回复。10.1.0.2是FortiGate上的端口1。
3. 由于没有现有的会话,回声回复被丢弃。
4. 所有后续的回声回复也被屏蔽了。
默认情况下,如果回声请求没有通过FortiGate,但响应通过了,则数据包将被丢弃。
在某些情况下,允许这种类型的不对称路由可能是有意义的。示例包括当你进行故障排除时,或者当你无法通过确保入口和出口流量都通过FortiGate来解决不对称路由问题时。
启用非对称路由会导致FortiOS无法检查所有流量。恶意流量可能会在未被发现的情况下通过FortiGate并损害网络。
使用上图的命令,上一张图片上解释的默认路由行为更改为以下内容:
1. 服务器的ICMP请求绕过FortiGate到达PC。
2. PC的回声回复通过FortiGate。没有会话匹配。然而,数据包没有被丢弃。相反,数据包被传递到FortiGate的CPU,然后使用FIB转发。
3. 所有后续的回声回复的处理方式与第2步相同。
4. FortiGate本质上充当路由器。没有进行安全检查。
如果你出于故障排除目的使用不对称路由,请记住在解决问题后将其禁用。
当FortiGate不应用源网络地址转换(SNAT)时,当路由表更改时,FortiGate会从受更改影响的会话中删除路由信息。FortiGate对下一个数据包再执行两次路由查找,以了解新的路由信息并将其存储在路由表中。
上图显示了路由更改后的会话示例。双向网关更改为0.0.0.0/0,接口更改为0,表明FortiGate必须再次学习此信息。此外,还添加了脏标识。
你可以使用上图显示的命令在接口级别配置会话路由持久性。默认值为禁用。如果你启用此设置,通过该接口的会话将继续通过,不受路由更改的影响。路由更改仅适用于新会话。
如果路由从FIB中删除,那么FortiGate必须将会话标记为脏,刷新其网关信息,并重新评估会话。
上图显示了通过启用设置preserve-session-route的接口(T_INET_0)建立的ICMP会话的详细信息。请注意,仅显示会话的相关行。
此外,请注意会话中存在route_preserve标志。接口名称可以通过命令diagnose netlink interface list查询。
当你启用辅助会话时,FortiGate内核会创建一个新的辅助会话,并将其附加到主会话中。对于每个流量路径(传入和传出),FortiGate继续创建一个新的辅助会话。
默认情况下,系统CPU处理由回复接口更改触发的脏会话。因此,不使用硬件卸载。出于这个原因,这些脏会话处理的大量流量可能会导致CPU使用率高和性能差。
在config system settings下启用auxiliary-session可以解决这个问题,通过创建辅助会话(也称为反射会话)将不对称会话卸载到硬件。对称流量匹配主会话,非对称流量匹配辅助会话。两个会话都可以卸载到硬件上。对于FortiGate虚拟机,虽然硬件卸载不适用,但性能得到了提高,因为FortiGate不必重新评估不对称流量。
由于每次路由更改都会创建一个新的会话,因此会话表的大小可能会显著增加。
在上图所示的示例中,ECMP是为客户端和服务器配置的。FortiGate通过端口1和端口2使用ECMP到客户端,通过端口3和端口4使用ECMP到服务器。
基于此示例,你可以看到如何在FortiGate上处理会话:
1. 最初,流量从1号端口流向3号端口。FortiGate创建了一个新会话:主会话。
2. 来自服务器的回复在端口4上接收,并转发到端口1。FortiGate创建辅助会话1,并将其附加到主会话中。
3. 来自客户端的下一个数据包在端口1上接收,并转发到端口4。FortiGate匹配辅助会话1。
4. 来自客户端的额外流量在端口2上接收,并通过端口3离开。FortiGate创建辅助会话2,并将其附加到主会话中。
5. 服务器回复在端口3上接收,并通过端口2离开。FortiGate匹配辅助会话2。
6. 在端口4上收到第二个回复,并转发到端口2。FortiGate创建辅助会话3并将其附加到主会话中。
7. 来自客户端的最后一个数据包从端口2流向端口4。FortiGate匹配辅助会话3。
8. 最后,服务器回复在端口3上接收,并通过端口1离开。FortiGate与主会话相匹配。
如果策略允许卸载,FortiGate可以卸载所有这些会话。
上图显示的CLI命令显示路由表中的所有条目。路由表显示到达FIB的路由,即到达目的地的最佳活动路由。
左边的列表示路线来源。路线属性显示在方括号内。在第一对属性中,第一个数字是距离,它适用于动态和静态路线。第二个数字是公制,仅适用于动态路线。
静态路由和动态路由也有优先级和权重属性,这些属性显示为相应路由的最后一对属性。在动态路线的情况下,权重总是0。
此命令不显示待机或非活动路由,这些路由仅存在于路由表数据库中。例如,当两个指向同一目标子网的静态路由距离不同时,距离较小的路由安装在路由表中,距离较远的路由安装在路由表数据库中。
如果你想查看活动、待机和非活动路由,请使用上图显示的CLI命令来显示路由表数据库条目。
在上图显示的示例中,该命令显示了两条备用路线:一条是静态路由,另一条是BGP。两个备用路线都是备用路线,因为有更好的路线——距离更低——到达同一目的地。更好的路由在路由源旁边显示一个星号,以表明它们是FIB条目,因此用于路由流量。
输出还显示一条非活动路线。当相应接口在管理上停机、其链接停机或链接运行状况监视器检测到停机并启用更新静态路由操作时,路由将被标记为非活动。
此低级命令显示FIB,这是内核用于路由流量的路由信息。路由表中的所有活动路由必须出现在FIB中。此外,FIB可能包含不在路由表中,但FortiGate自动添加的路由,例如动态添加以访问SSL VPN用户的路由。
FortiOS维护一个策略路由表,你可以通过输入diagnose firewall proute list命令来查看。
策略路由表中显示三种类型的策略路由:常规策略路由、ISDB路由和SD-WAN规则。遵循以下规则来识别表格中每种类型的策略路线:
● 常规策略路由被分配一个不高于65535的ID。在上图显示的输出中,第一个条目被分配了ID 1,这使得它成为普通策略路由。
● ISDB路由和SD-WAN规则被分配一个高于65535的ID。然而,SD-WAN规则条目包括vwl_service字段,而ISDB路由条目不包括。从SD-WAN配置角度,vwl_service字段表示规则的ID和名称。在上图显示的输出中,第二个条目是ISDB路由,第三个条目是SD-WAN规则。
请注意,尽管常规策略路由的ID在1到65535范围内,但你可以配置的常规策略路由的最大数量要低得多,并且因FortiGate型号而异。例如,你可以在FortiGate 300D上配置多达512个常规策略路由。有关每个FortiGate型号的最大支持值的更多信息,请参阅docs.fortinet.com上的FortiOS最大值表。或者,你可以在FortiGate CLl上输入print tablesize命令,以获取您的FortiGate的最大值。
对于上图显示的故障排除场景,你采取了什么方法?
用户正尝试ping 8.8.8.8,但无法做到这一点。用户可以ping其他各种公共IP地址。
你开始解决这个问题的方法是什么?
你的第一步应该是确认用户发送的ICMP数据包是否到达FortiGate A,并且有双向通信。为此使用的最佳工具是数据包嗅探器。你可以看到FortiGate没有收到任何回声回复。
现在,你必须弄清楚为什么FortiGate没有反应。为此使用的最佳工具是调试流。FortiGate正在使用错误信息丢弃流量:“Denied by forward policy check(policy 0)”。
然而,FortiGate没有响应的实际原因是FortiGate正在执行策略路由,你可以根据消息“Match policy routing id=1: to10.40.0.15 via ifindex-15”来确定。
查看策略路由配置,会发现一个策略路由,该路由强制流量通过端口3而不是广域网端口。删除政策路线解决了这个问题。
上图展示了你在本课中涵盖的目标。
通过掌握本课中涵盖的目标,你了解了高级路由概念和有用的故障排除命令,以调试路由问题。