Half Coffee

OSPF 设计指南-一篇简洁的OSPF知识回顾

2017-03-16

OSPF的设计需要满足可靠性和可扩展性,这取决于合理的网络结构和地址规划,通过路由汇总等手段可以大大减少路由设备的开销,在网络稳定性和扩展性上都会有很大优势。

快速收敛也是网络设计很重要的一个原则。

总结

OSPF 的设计可以按照下列思路进行,而每个部分都需要做一定考虑,熟悉其原理就显得很重要了,文章后面是各种相关知识简介,可以帮助设计,避免设计考虑不足。

  • 进行区域的设计,划定区域范围和将要参与的路由器,此处需要同时考虑物理连接结构(例如冗余度很高的数据中心用一个区域、网络复杂的Hub-Spoke区域用一个、网络稳定性不好的分公司用一个区域)

  • 按照区域划分IP地址,前提是保证区域内的地址是连续的可以进行汇总,且有一定的IP余量

  • 末节区域的定义,视情况调整末节区域类型,优化非骨干区域的路由

  • 其他路由协议如何和OSPF网络通信,此处可能牵扯到双向路由重发布,需要注意与末节区域搭配的问题还有环路问题

  • Router-ID,为了规范需要手动定义Router-ID,建议整体规划环回口地址

  • DR的选举考虑,Router-ID并不能保证DR选举正常,需要根据网络结构修改OSPF优先级来调整DR选举

  • OSPF 认证,为保证网络安全需要配置md5认证,防止私接。

  • Hello 、Dead时间,hello dead时间在某些时候会影响网络收敛速度,可以根据需求缩短此时间。

  • 路由的路径优化,可以使用ip ospf cost命令来调整选路

  • 路由汇总,通过此方式进一步减少域间路由

  • OSPF 网络类型微调。默认OSPF根据物理接口类型适配OSPF网络类型,但是可能需要手动调整网络类型以便让OSPF环境更加切合实际物理网络。另外有些特殊场合,例如环回口做VPN的接入点时,需要修改环回口的网络类型。

影响OSPF 扩展的因素

网络扩展能力是否好一般取决于路由器的处理性能:内存、CPU和接口带宽。OSPF 进程资源占用由下列因素决定:

  • 每个路由器的邻接关系数量:链路状态更新报文会在一个区域内泛洪给所有路由器。如果一个路由器的邻接关系比较多,则其需要处理的任务会更多。设计原则是每个路由器不要超过60个邻居
  • 每个区域内的最大路由器:OSPF的算法依赖于CPU,当区域内有频繁的链路变动时,路由重计算工作会很高,由此会产生性能问题。按照经验值一个区域内路由器不能超过50台,如果区域内有很不稳定的链路,则路由器数量越少越好。

  • 单个路由器支持的区域数:每个路由器所属的每个区域有链路变动时,都需要进行路由重计算,每个ABR至少有两个区域(骨干区域和普通区域),为了最大的扩展性,每台路由器上的区域数不能多于三个
  • DR 选举:DR和BDR一般工作在多路访问网络上(例如以太网)。推荐将负载不高、性能较强的路由器设置为DR和BDR(通过优先级)。且不要让一台设备作为多个网段的DR,将DR的工作分担在多个路由器上
  • 路由数:设备的负载也取决于一个区域和整个OSPF自治系统的路由信息数量(包含外部引入的路由),而路由信息是由网络中路由器以及链路数量。
    • 可以使用Stub及Totally stubby特殊区域过滤不需要的外部路由,只引入默认路由以减轻区域内设备的压力。
    • Totally stubby除了过滤域外的路由,还能过滤掉域间的路由信息,但是需要根据实际环境进行设置,保证最优路径。
    • NSSA以及Totally NSSA则可以实现过滤域间路由,放行域外路由,区域内允许存在ASBR。

最短路径优先算法

OSPF 使用最短路径优先算法计算到达目的地的最短路径,采用Dijkstra算法,算法本身比较复杂,但是可以简洁总结如下:

1、每次发生任何路由更新时,相关路由器产生LSA(链路状态通告),此通告包含了此路由器上所有链路状态的信息。

2、所有路由器通过泛洪的方式交换彼此的链路状态信息。每个路由器收到链路状态更新后都会将其加入自己的链路状态数据库中。然后将这个更新转发给其他路由器。

3、当每个路由器的数据库完整后,路由器使用 Dijkstra 算法计算出到目的的最短路径,路径开销,下一跳地址,产生最短路径树。

4、每次有路由更新或者链路cost变化时,更新通过LSU发送,需要重新通过spf算法计算最短路径

OSPF 开销

接口上的开销(cost,又称为metric)表示包经过此接口的开支(overhead)。接口的带宽越高,则其cost越小,开销的计算方式是:

cost=10000 0000/带宽 (单位为bit/秒)

因此可以算出10M(1000 0000)的cost=10,100M的cost=1,1000M的cost=1(cost必须为整数)。

默认cost是通过接口带宽计算的计算的,但是可以通过ip ospf cost进行调节(调节数据出方向接口的cost,影响本路由器以及经过本路由器前往此目的地的路径)。

最终选路结果由沿途所有接口开销之和决定。

最短路径树

以下图为例,我们以RTA的视角去看其对应的路径树,上面是物理的连接,下图是树的形状。

RTA 到 192.213.11.0的最短路径是通过RTB到达,总cost=10+5=15。

RTA 到 222.211.10.0的有两条最短路径:通过RTB->RTD(cost=10+5+5=20),以及通过RTC(cost=10+10=20)。

思科设备支持OSPF等价路由,在路由表中能看到到达目的地有两个下一跳。思科最多支持每目的地6条等价路由。

ospf-path

边界路由器类型

OSPF 使用泛洪的方式交换LSU,而LSU泛洪的边界是区域(Area),所有在相同区域的路由器拥有相同的链路状态数据库。

因为区域是针对接口的一个定义,所以当一台路由器的多个接口分别属于多个区域时,此路由器就拥有多个区域,这种类似的路由器被称为ABR(区域边界路由器Area border routers)。

如果一个路由器的所有接口同属于一个区域,那么此路由器被称为Internal Router(IR)。

某些时候一个路由器即参加OSPF路由,部分接口也运行了其他路由协议或者ospf的其他进程,为了保证两种不同协议之间路由通信做了重发布(redistribution),这样的路由器被称为自治系统边界路由器(ASBR)。

ospf-abr-asbr

设计 OSPF 区域

OSPF 区域划分可以用来减少一个区域内的路由信息。区域设计要考虑网络拓扑和地址规划。理想情况下,网络拓扑和地址规划要有区域的概念。OSPF 要求区域层次清晰,只有两层区域:骨干和普通区域。

做网络设计时一般从骨干区域开始设计,然后延展出其他区域。在将路由器加入骨干区域时应该谨慎考虑,建议只将必要的骨干设备和ABR加入区域0,其他设备属于非骨干区域。

对于骨干区域,应保证足够冗余,避免因为一条链路而发生骨干区域分裂。

可以根据地理位置以及功能来定义区域边界。

之前提过任何链路变动都会在整个区域内传播,不仅占用带宽而且占用CPU资源。为了避免本区域受其他区域的影响,可以使用sub等特殊区域,不学习外部的明细路由,也就不会因外部路由变化而频繁计算路由表。使用特殊区域也能减少LSA包大小。

需要注意应当将LSA包大小控制在MTU范围内,防止LSA分片传输。

设计原则是:简单、将非骨干区域设计为stub等区域类型、区域内使用可聚合地址段。

每个区域最大多少设备?

一个区域内支持多少设备而与邻接关系数量有关。同时需要考虑区域内泛洪信息的数量。举例:你的最大网络规模可以只有一个以太网段,但是有200台设备;也可以是40个网段,50台设备。

最佳实践建议每个区域最多不要超过50台路由器。

虚链路

所有非骨干区域必须物理上和骨干区域直连,这样做的原因是所有非骨干区域之间的路由信息必须通过Area0来传输。实际环境可能并无法满足这个硬性要求,OSPF提供一种“软件”解决方案:虚链路

ospf-area

虚链路(Virtual Link)的引入可以解决以下两个问题:

1、一个区域物理上无法直接连接到骨干区域

2、将分割的骨干区域连接起来

非骨干区域无法物理直连到骨干区域

vlink1

如上图的环境,有时候物理上不能满足非骨干区域直接连到骨干区域,这时候可以在两个ABR之间建立虚链路,将Area 1通过虚链路的方式逻辑上连接到Area 0。

两个分割的骨干区域

有些时候网络中存在两个骨干区域,需要将他们连接起来,例如某企业以前有两个独立OSPF网络,现需要合并起来。

或者,因为设计问题,某个路由器的故障会导致骨干区域分裂,为避免这种情况发生,可以借助非骨干区域的设备建立虚链路做备份,防止以上情况发生。

vlink2

邻居

在同一个网段的两台路由器相互成为邻居。邻居的建立依赖于 Hello 包,Hello 包是周期在每个启用ospf的接口上发送的,一般使用组播地址224.0.0.5,特殊配置下使用单播发送。

当本路由器检测出邻居发来的hello包中有自己的信息,则彼此建立邻居关系。记住邻居的建立只使用接口的Primary地址

只有满足下列条件,邻居关系才能建立(即邻居不能建立时可检查以下各项帮助排错):

  • Area-ID:两个路由器在同一个网段;且属于相同的区域。
  • Authentication:OSPF 允许设置区域密码认证,两台路由器要想成为邻居必须使用相同的认证方式和密码。
  • Hello 和 Dead 时间:OSPF hello 包定期发送,只有两遍配置的hello包发送间隔一样才能建立邻居关系。默认Dead时间是Hello时间的倍数(例如广播类型下是4倍的hello时间),但是可以手动调节Dead时间。
  • 末端区域标志(Stub Area Flag):在Hello包中Stub area flag必须一致。

邻接关系

上面提到只要通过hello包交互就能建立邻居关系,但是并不代表未来他们之间会传输链路状态信息,只有互为邻接关系的路由器之间才会传送链路状态信息。

多路访问网络下的邻接关系

在多点访问(MA)网络下(例如以太网),会存在一个网段有多个设备的环境,为了减少链路状态消息报文的泛洪,OSPF定义了DR、BDR、DROTHER三种角色。

DR类似于中心联系人,所有路由器向DR发送链路信息,再由DR转发给其他路由器。

BDR代表Backup DR,做DR的备份,在DR失效后立马接管DR的工作。

在一个网段中,所有非DR设备必须和DR建立邻接关系。

DR的竞选规则是:

1、先对比参与OSPF接口的OSPF优先级,优先级最高的成为DR,次高的成为BDR。剩余路由器角色全为DRother

如果OSPF优先级设置为0,则代表此接口不参与DR竞选。

2、如果优先级一样,则对比Router-ID高低,最高的成为DR,次高的成为BDR。

Router-ID可以手动设置,如果不设置,则默认使用IP地址最大的环回口地址,如果没有环回口,则使用IP地址最大的物理口地址

DR BDR的选举是以一个网段为边界的,再次强调。

ospf-adj1

点到点网络下的邻接关系

如果物理网络是点到点类型的(例如串口),则对应接口的OSPF网络类型是Point-to-point。点到点网络类型没有DR、BDR的概念。

点到点类型下互为邻居关系的设备一定会建立邻接关系。

非广播多路访问的邻接关系

在Frame Relay,X.25,ATM等传输介质下,OSPF网络类型需要使用NBMA。这样的网络特点是,多个设备在同一个网段,像以太网一样,但是并不是两两全部互通,物理结构上类似Hub-Spoke结构。因为缺少广播功能,所以不能通过发送Hello包自动选举DR,需要手动在ospf进程内指定邻居。

NBMA下必须确保Hub端的接口成为DR,可以通过调整接口 ospf 优先级来实现。例如将其他接口设置为ospf优先级为0,不参与DR选举。(下图中RTA表现为hub)

ospf-adj2


关于OSPF网络类型的选择可看另一篇博客:OSPF 5种网络类型及适用场景


关于OSPF认证可以看:OSPF认证配置


路由汇总

末节区域

ospf 支持将某些区域设置为末节区域,有以下几种:stub、Totally Stubby、NSSA,Totally NSSA。

  • Stub,不允许接收其他路由协议重发布到OSPF的路由。通过ABR下放的默认路由访问这些外部网络。这样做可以减少本区域的数据库大小,进而减小路由器的资源占用。

    Stub区域也不允许当做Virtual Link的传输区域。ASBR不能存在于Stub区域中。

    这样的原因是:Stub表示不能带有外部路由的区域

    如果一个区域为Stub,所以在此区域中的设备都需要将此区域设为Stub,这是因为邻居关系的建立会检查Hello包中的stub flag位(E位),flag不一致则同网段的两台设备不能建立邻居关系。

    Stub区域的ABR会在stub区域下方默认路由,类型为O IA

    stub1

  • Totally Stubby,相比Stub,Totally Stubby除了禁止外部路由进来,还禁止区域间的路由进入区域。所以此区域中设备路由表中只会有本区域的路由信息和默认路由。

    Totally Stub区域的ABR会在stub区域下方默认路由,类型为O IA

    sub2

  • NSSA:通过上面的简短介绍,发现Stub区域的一个缺点,不能存在ASBR,某些时候想要stub的路由优化功能,但是区域中又存在ASBR,需要进行路由重发布,这时可以使用NSSA。

    sub3

  • Totally NSSA:同Totally Stubby一样,在NSSA基础上过滤了区域间的路由。

    Totally NSSA区域的ABR会在stub区域下方默认路由,类型为O IA

    sub4

路由重发布

如果要让OSPF网络和其他协议网络通信,需要进行路由重发布。

命令为:

redistribute protocol processID metric value

例如 redistribute eigrp 1 metric 30

默认如果不指定metric值(cost值),OSPF将其设为20,重发布BGP时设为1。默认会在命令后面加一条subnets,表示会重发布主类网络(ABC三大主类网络)以及子网网段。

在重发布后,对于重发布到OSPF中的路由有两种 cost 计算方式,一种是恒定不变ASBR重发布时是多少,在整个OSPF区域内传输,cost就是多少,这种类型叫做 OE2。

另一种是从ASBR开始,累加沿途接口的cost。默认使用类型OE2。

在下图例子中,RTA为ASBR,重发布了网络N1和网络N2,将网络N1的metric-type设置为 Type1(OE1),网络N2的metric-type设置为 Type2(OE2)。

RTB 以及RTC的路由表中看到到 N2 的 cost 始终为 X 。

而 RTB 到 N1 的 cost 为 X+Y,RTC 到 N1的cost 为 X+Y+Z。

oe2

双向重发布

在路由协议之间双向重发布时一定要非常小心,避免产生路由环路。可以通过被动接口(Passive Interfacce)和Distribute list来控制路由的传播

Distribute list out 应用在ASBR上,用来过滤OSPF重发布给其他协议的路由条目。

Distribute list in 方向可以应用在所有协议上,但是在OSPF中调用只影响本地路由的接收,不会影响链路状态信息包的传播,所以可能需要在所有OSPF路由上都配置Distribute list。因此需要避免在OSPF中使用入方向的过滤,尽量将其应用到其他路由协议上来实现相同的效果

默认路由下放

默认ASBR进行重发布时不会在OSPF区域中产生默认路由。

可以使用以下命令手动将默认路由下放到OSPF区域中:

  • default-information originate [always] [metric] [metric-type typex]

还有其他两种产生默认路由的办法:

  • 在ASBR上设置正确的默认路由,然后将其重发布到OSPF域内
  • 直接在ASBR上通告0.0.0.0,可以添加always参数让ASBR始终宣告此默认路由,但这时候要确定ASBR上有去往外部网络的明细路由或者默认路由。

参考资料

OSPF 设计指南

ChinaCCIE IGP资料


评论