OSPF协议详解5:实验 - 计时器、度量值与其他高级配置
本文深入探讨OSPF计时器(Hello/Dead间隔、SPF节流、LSA计时器)、度量值(参考带宽、接口Cost、最大度量值)及高级配置(前缀抑制、被动接口、虚链路、认证)。旨在优化网络性能、收敛速度和安全性,通过灵活配置提升OSPF路由效率和稳定性,并通过配置示例和show命令输出进行了验证。
4. 计时器相关配置
4.1 Hello和Dead间隔
链路两端的接口的Hello和Dead间隔必须一致,否则邻居起不来。除了默认的值外,还可以单独设置Hello间隔,最小值为1秒,Dead间隔一般为Hello间隔的4倍。这样可以提高网络收敛的速度,但是也会增加CPU的负荷。
还有有一种方式,就是配置Fast Hello Packets,方法是配置Dead间隔为1秒,然后设置Dead间隔是Hello间隔的几倍。这样就能把Hello间隔设置在秒级以下了。不过,一般是不建议更改默认的Hello和Dead间隔。
# 单独修改Hello和Dead间隔
R1(config-if)#ip ospf hello-interval 1
R1(config-if)#ip ospf dead-interval 4R1#show ip ospf interface GigabitEthernet1 | in TimerTimer intervals configured, Hello 1, Dead 4, Wait 4, Retransmit 5# 可以看出最多可以设置到20倍,也就是Hello间隔为50毫秒。
R1(config-if)#ip ospf dead-interval minimal hello-multiplier ?<3-20> Number of Hellos sent within 1 second
4.2 Fast Hello和BFD对比
常规的做法使用BFD来检测链路的状态,联动来来建立和移除OSPF邻居。如果链路反复翻动,频繁地更新SLA,导致LSA序列号快速增长。这时候,通常会在接口下使能接口抑制(Dampening),通过惩罚反复翻动的接口,来使网络变得更加稳定。
虽然Fast Hello也能达到相同的目的,但是选择BFD的原因是:
- BFD是独立于协议的,意味着它可以同时检测多种路由协议的转发路径。但是,独立的则意味着需要单独进行配置,全局启用,用于接口,再关联具体的路由协议。
- Fast Hello的配置不太灵活,BFD可以直接指定BFD的Hello间隔和Dead间隔,可以到毫秒级。
- OSPF的Hello包包括的字段很多,50毫秒级的Fast Hello比较耗费CPU资源。而BFD的Hello包就小了许多,状态机也比较简单。
4.3 等待,重传和传输延迟时间
从下面的show输出,可以看出,除了Hello和Dead以外,还有Wait和Retransmit。
R1#show ip ospf interface Gi2 | in TimerTimer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5# 手工设置重传时间
R1(config-if)#ip ospf retransmit-interval ?<1-65535> Seconds# 手工设置传输延迟
R1(config-if)#ip ospf transmit-delay ?<1-65535> Seconds
这个Wait的等待时间是用于多路访问网络进行选举DR/BDR前的等待时间。之前有讲过默认是40秒,那是因为以太网默认的Dead间隔是40秒,而这个Wait等待时间永远等于Dead间隔。就像在4.1中的单独设置Hello和Dead间隔的时候,这个Wait等待时间也发生了变化。
当一个路由器发送LSA给邻居的时候,它会期待一个LSAck这么一个确认信息。如果在一段时间内,没有收到这个确认信息,则会重传这个LSA。这个重传时间的默认值是5秒,且不受网络类型的影响。这个时间可以进行单独设置。更改这个计时器时间并不会破坏OSPF的邻居关系。
最后还有一个传输延迟的设置,这个是用于矫正LSA通过慢速的链路的时间来反应LSA真正的老化时间。路由器生成LSA的时候,Age时间是0秒,对端收到的时候Age为1秒,这个1秒是默认值。对于老的WAN链路或是卫星链路,传输SLA的时间会大于1秒。为了矫正这部分时间差,可以手工设置这个delay的秒数。如果链路传输这个SLA需要5秒,希望对端路由器收到这个SLA的时候Age为5,则需要设置这个transmit-delay为5。一般情况下不会设置这个参数。
4.4 LSA相关的计时器
在极少的情况下,会更改下面的计时器的值。
4.4.1 SPF计算节流时间
下面的命令后面有3个参数。
- 第一个参数是从收到拓扑变更的事件后到SPF开始计算的延迟时间,默认是50毫秒。如果在这个时间内收到了其他的LSA,可以进行一次SPF计算,包括这个延迟时间内收到的所有的LSA。
- 第二个参数是从第一次SPF计算到第二次SPF计算的最小等待时间,默认是200毫秒。类似于物理接口的抑制(Dampening),在这个间隔时间内,如果再次收到一个LSA,则这个时间翻倍,以2的倍数进行增长,直到达到最大的等待时间。
- 第三个参数是两次SPF计算的最大等待时间,在到达这个时间后,则等待时间不变。当网络稳定时间超过了最大等待时间,则会恢复到未节流的状态。这点和物理接口的抑制的机制就有差别了,没有半衰期的说法。
R1#show ip ospf Initial SPF schedule delay 50 msecsMinimum hold time between two consecutive SPFs 200 msecsMaximum wait time between two consecutive SPFs 5000 msecsR1(config-router)#timers throttle spf ?<1-600000> Delay between receiving a change to SPF calculation inmillisecondsR1(config-router)#timers throttle spf 50 ?<1-600000> Delay between first and second SPF calculation in millisecondsR1(config-router)#timers throttle spf 50 200 ?<1-600000> Maximum wait time in milliseconds for SPF calculationsR1(config-router)#timers throttle spf 50 200 5000 ?<cr> <cr>
4.4.2 LSA相关计时器
- LSA到达计时器: 路由器接受相同LSA的最小间隔。如果在这个间隔内收到了相同的LSA(相同的LSA ID,宣告路由器和序列号),则会忽略这个LSA。如果是新的序列号的LSA,则不受这个计时器限制。
- LSA组抑制计时器:在计时器未过期前,将自己更新或新产生的LSA放到一个queue里。在计时器过期后,将它们统一发出。
- LSA泛洪抑制计时器:控制OSPF将LSA从接口发出的速率。防止接口因为快速泛洪LSA而导致链路变慢或拥塞。
- LSA重传抑制计时器:当接口发送完一个LSA后没有收到确认,这个计时器规定了重传开始的时间。
R1#show ip ospf Minimum LSA arrival 100 msecsLSA group pacing timer 240 secsInterface flood pacing timer 33 msecsRetransmission pacing timer 66 msecsR1(config-router)#timers lsa-arrival ?<0-600> The minimum interval in sec between accepting the same LSAR1(config-router)#timers lsa arrival ?<0-600000> The minimum interval in milliseconds between accepting the sameLSAR22(config-router)#timers pacing lsa-group ?<10-1800> Interval in sec between group of LSA being refreshed or maxagedR22(config-router)#timers pacing flood ?<5-100> The minimum interval in msec to pace limit flooding on interfaceR22(config-router)#timers pacing retransmission ?<5-200> The minimum interval in msec between neighbor retransmissions
5. AD/Metric相关配置
之前说过,OSPF默认按100M接口的带宽设为Cost 1。对于现代网络来说,1G和10G口已经普及了,按默认来说,它们Cost也是1,这样OSPF就无法选出真实的最优路径了。
5.1 更改默认的参考带宽
在默认情况下,可以看到1G的Cost值是1。当将参考带宽改成10G的时候,系统提示要将所有路由器的参考带宽要改成一致的。这样所有路由器计算Cost的公式就是一致的了。再查看1G接口的Cost值就变成10了。
R1#show ip ospf interface Gi1 | in CostProcess ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1# 可以看到参考带宽的单位是mbps。
R1(config-router)#auto-cost reference-bandwidth ? <1-4294967> The reference bandwidth in terms of Mbits per second# 将参考带宽改成10G。
R1(config-router)#auto-cost reference-bandwidth 10000
% OSPF: Reference bandwidth is changed. Please ensure reference bandwidth is consistent across all routers.R1#show ip ospf interface Gi1 | in CostProcess ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 10
5.2 更改接口的Cost值
更改接口的Cost值是单向的,意味着去程和回程的总的Cost值不一致。可以在链路两端都更改Cost值,来保持去程和回城的Cost值一致,不然有可能会出现去程和回程的路径不一致的现象。
# 更改一个接口的Cost值,只能影响它作为出接口路径的总的Cost值。
R1(config-if)#ip ospf cost 888R1#show ip ospf interface Gi1 | in CostProcess ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 888
5.3 其他Cost设置方式
还有一些应用场景比较低的使用方法。
譬如在NBMA网络里,前面有说需要在OSPF进程下指定邻居的地址。也可以在指定到邻居的Cost。
R1(config-if)#ip ospf network non-broadcast
R1(config-if)#router ospf 1
R1(config-router)# neighbor 172.16.0.2 cost 180
或是在ABR上指定特殊区域的Cost值,用于影响下发到特殊区域的默认路由的Cost值。
# 特殊区域路由器收到的默认路由的Metric值是2。
R31#show ip route
O*IA 0.0.0.0/0 [110/2] via 172.16.3.1, 2d09h, GigabitEthernet1# 在ABR上设置特殊区域的Cost值,可以看到说明是影响特殊区域的外部路由的Metric
R4(config-router)#area 3 default-cost ?<0-16777214> Stubs advertised external route metricR4(config-router)#area 3 default-cost 100# 设置完默认的Cost为100后,默认路由的Metric变成了101。因为从原来的1变成了100,增加了99。
O*IA 0.0.0.0/0 [110/101] via 172.16.3.1, 00:01:21, GigabitEthernet1
5.4 更改默认AD值
OSPF不像EIGRP和BGP,对内部路由和外部路由有不同的AD值。但是可以手工设置域内,域间和外部路由的AD值,取值范围为1-255。
R4(config-router)#distance ospf ?external External type 5 and type 7 routesinter-area Inter-area routesintra-area Intra-area routes
5.5 最大度量值
可以将自己的Router LSA里的Metric变得最大,主要用于设备维护升级或设备重启后延迟参与OSPF路由。
- 默认不加参数,就是互联链路的Metric变成最大。其余的选项是在此基础上增加类型的支持。
R13(config-router)#max-metric router-lsa ?external-lsa Override external-lsa metric with max-metric valueinclude-stub Set maximum metric for stub links in router-LSAson-startup Set maximum metric temporarily after rebootsummary-lsa Override summary-lsa metric with max-metric value<cr> <cr># 正常的Router LSA。
R23#show ip ospf database router 1.1.1.23Number of Links: 3Link connected to: a Stub Network(Link ID) Network/subnet number: 1.1.1.23(Link Data) Network Mask: 255.255.255.255Number of MTID metrics: 0TOS 0 Metrics: 1Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.13(Link Data) Router Interface address: 172.16.2.13Number of MTID metrics: 0TOS 0 Metrics: 1Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.9(Link Data) Router Interface address: 172.16.2.10Number of MTID metrics: 0TOS 0 Metrics: 1# 设置完max-metric默认值,所有的Transit的链路Metric都变成了65535。
R23(config-router)#max-metric router-lsaR23#show ip ospf database router 1.1.1.23Number of Links: 3Link connected to: a Stub Network(Link ID) Network/subnet number: 1.1.1.23(Link Data) Network Mask: 255.255.255.255Number of MTID metrics: 0TOS 0 Metrics: 1Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.13(Link Data) Router Interface address: 172.16.2.13Number of MTID metrics: 0TOS 0 Metrics: 65535Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.9(Link Data) Router Interface address: 172.16.2.10Number of MTID metrics: 0TOS 0 Metrics: 65535
- 加include-stub,就是额外将末节网络的Metric变成最大。
# 再加上include-stub之后,直连的Stub网络的Metric也变成65535了。
R23#show ip ospf database router 1.1.1.23Number of Links: 3Link connected to: a Stub Network(Link ID) Network/subnet number: 1.1.1.23(Link Data) Network Mask: 255.255.255.255Number of MTID metrics: 0TOS 0 Metrics: 65535Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.13(Link Data) Router Interface address: 172.16.2.13Number of MTID metrics: 0TOS 0 Metrics: 65535Link connected to: a Transit Network(Link ID) Designated Router address: 172.16.2.9(Link Data) Router Interface address: 172.16.2.10Number of MTID metrics: 0TOS 0 Metrics: 65535
- 加external-lsa,就是额外将外部网络的Metric变成最大,仅限于ASBR。
# 在没加external-lsa的时候,外部路由的Metric还是1,加完之后就变成了16711680。
R13#show ip ospf database external 100.0.0.0 | in MetricMetric Type: 2 (Larger than any link state path)Metric: 1 R13(config-router)#max-metric router-lsa external-lsaR13#show ip ospf database external 100.0.0.0 | in MetricMetric Type: 2 (Larger than any link state path)Metric: 16711680
- 加summary-lsa,就是额外将3类LSA的Metric变成最大,仅限于ABR。
# 在没加summary-lsa的时候,3类路由的Metric还是2,加完之后就变成了16711680。
R4#show ip ospf database summary 1.1.1.31 | in Metric MTID: 0 Metric: 2 R4(config-router)#max-metric router-lsa summary-lsa R4#show ip ospf database summary 1.1.1.31 | in MetricMTID: 0 Metric: 16711680
- on-startup的参数:上述的参数可以叠加使用,加上on-startup的参数后,会在重启后多少时间内将这个参数前面的参数给Metric最大化。此外加上wait-for-bgp的参数,就是不仅要等待设置的时间还要等待BGP收敛完成,这时一个AND的条件。如果只用wait-for-bgp,也可不用加时间。
R4(config-router)#max-metric router-lsa include-stub summary-lsa on-startup ?<5-86400> Time, in seconds, router-LSAs are originated with max-metricwait-for-bgp Let BGP decide when to originate router-LSA with normal metric
6. 其他
6.1 前缀抑制
通过在OSPF进程下开启prefix-suppression来移除所有的链路路由,只留下末节路由,譬如Loopback地址。
- 对于多路访问网络,譬如网络类型如广播的,通过将2类LSA里的掩码改成/32位来通知其他路由器不要将此路由添加到路由表,但是依然可以使用这条链路进行SPF的计算。
- 对于点到点网络,则会将生成的Stub网络移除。则不会将这个链路的网段添加到路由表。
R23(config-router)#prefix-suppression # 在多网访问网络中,正常携带了这个网络的掩码。当前缀抑制启用后,网络掩码转变为/32位。R22# show ip ospf database network 172.16.2.5OSPF Router with ID (1.1.1.22) (Process ID 1)Net Link States (Area 2)LS age: 1346Options: (No TOS-capability, DC)LS Type: Network LinksLink State ID: 172.16.2.5 (address of Designated Router)Advertising Router: 1.1.1.21LS Seq Number: 80000091Checksum: 0x492Length: 32Network Mask: /32Attached Router: 1.1.1.21Attached Router: 1.1.1.22# 点对点网络正常的1类LSA包括的信息,除了有点到点连到的邻居外,还有链路的/30位的网段。当前缀抑制启用后,这个Stub Network会从1类LSA里移除。R1#show ip ospf database router 1.1.1.3省略Number of Links: 4Link connected to: another Router (point-to-point)(Link ID) Neighboring Router ID: 1.1.1.1(Link Data) Router Interface address: 172.16.0.2Number of MTID metrics: 0TOS 0 Metrics: 1Link connected to: a Stub Network(Link ID) Network/subnet number: 172.16.0.0(Link Data) Network Mask: 255.255.255.252Number of MTID metrics: 0TOS 0 Metrics: 1
6.2 被动接口
在路由器上可以通过设置被动接口来决定哪些接口不需要参与OSPF建邻居的过程。对于连接到非路由器的接口,譬如终端设备,可以将此接口设置成被动接口。它的好处是:
- 不会在此接口发送Hello包,防止未经授权的设备和本路由器建立邻居关系。
- 由于不会在被动接口上收发Hello包,减少了一些协议的开销,减轻了CPU的负担
配置方式分为两种,既可以直接passive掉一些接口,也可以默认passive全部接口,再no passive需要建立邻居的接口,这点和EIGRP的配置很像。
# passive单独的接口
R23(config-router)#passive-interface Gi1# passive所有,单独no passive特定接口
R23(config-router)#passive-interface default
R23(config-router)#no passive-interface Gi
6.3 非连续区域和虚链路
非连续区域包含三种情况,非连续的Area 0,非连续的其他区域,以及其他区域不直连Area 0。
对于非连续的Area 0中间隔的是其他OSPF区域,或是其他区域通过另一个其他区域连接到Area 0的这两种情况,可以使用虚电路来解决。在两个ABR之间建立虚连接,可以使得Area 0直连,或是其他区域直连Area 0。下面的例子是Area 3通过Area 2连接到Area 0。
R1#show run | s r os
router ospf 1router-id 1.1.1.1area 1 virtual-link 1.1.1.12R12#show run | s r os
router ospf 1router-id 1.1.1.12area 1 virtual-link 1.1.1.1R12#show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface
1.1.1.1 0 FULL/ - - 172.16.1.1 OSPF_VL0
如果连个区域被非OSPF区域隔开,只要2个ASBR之间有IP可达性,可以使用GRE隧道来建立OSPF邻居,进而保持区域的连续性。
而非连续的其他区域则是OSPF允许的存在,譬如两个Area 1分别连接到Area 0。Area 0会负责搜集各个其他区域的3类LSA,并传给其他区域。
6.4 认证
OSPF支持接口下和区域内进行认证。在开始讲OSPF的报头的时候,里面有认证类型和认证信息的字段。
- 认证类型为0,则认证信息部分不被使用。
- 认证类型为1,则认证信息部分存储明文密码。
# 接口下启用明文密码。
R31(config-if)#ip ospf authentication
R31(config-if)#ip ospf authentication-key cisco123# 可以在接口下看到明文密码验证启用了。
R31#show ip ospf interface gigabitEthernet 2 | in auth Simple password authentication enabled
- 认证类型为2,则认证信息部分存储密文的元信息,包括Key ID,认证数据的长度以及序列号。
- 算法包括MD5和HMAC-SHA。
- 实际的消息摘要(哈希值)则放在OSPF包的最后,不在报头里。
- 哈希值的长度取决于算法。
- MD5的哈希值只取决于内容信息本身。HMAC-SHA引入了预共享密钥。
# 接口下启用密文MD5密码。
R31(config-if)#ip ospf message-digest-key 1 md5
R31(config-if)#ip ospf message-digest-key 1 md5 cisco123# 可以在接口下看到秘文密码验证启用了。
R31#show ip ospf interface Gi2 | in auth Cryptographic authentication enabled# 对HMAC-SHA算法,需要先配预共享密钥。如果没配置时间,就是永久有效。
R31(config)#key chain ospfkey
R31(config-keychain)#key 1
R31(config-keychain-key)#key-string CiscoOspfKey
R31(config-keychain-key)#cryptographic-algorithm hmac-sha-256
R31(config-keychain-key)#send-lifetime local 00:00:00 Jan 1 2025 00:00:00 Jan 1 2026
R31(config-keychain-key)#accept-lifetime local 00:00:00 Jan 1 2025 00:00:00 Jan 1 2026R31#show key chain
Key-chain ospfkey:key 1 -- text "CiscoOspfKey"cryptographic-algorithm: hmac-sha-256accept lifetime (00:00:00 UTC Jan 1 2025) - (00:00:00 UTC Jan 1 2026) [valid now]send lifetime (00:00:00 UTC Jan 1 2025) - (00:00:00 UTC Jan 1 2026) [valid now]# 应用到接口。可以看到Key Chain的名称,使用的Key和算法。
R31(config-if)#ip ospf authentication key-chain ospfkey R31#show ip ospf interface Gi2Cryptographic authentication enabledSending SA: Key 1, Algorithm HMAC-SHA-256 - key chain ospfkey
在RFC2328中写到,哈希会被加到OSPF包的末尾。在实际的抓包中发现,Auth Crypt Data也包含在OSPF包的报头中。查看RFC5613,有一个新增的Cryptographic Authentication TLV,这我们抓包的显示就一致了。查看了一下其他的资料,OSPF包报头是验证OSPF包的有效性的,CA-TLV是验证LLS Data Block的。
后记: 还有好多特性并没有提及,譬如跟MPLS VPN相关的,跟SR相关的,多区域,NSR,GR等等。在这里就不大而全了。这个系列已经足够覆盖到日常工作中用到的大部分的知识了。
📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site