编辑
2025-10-08
网工之路
00

目录

4. 计时器相关配置
4.1 Hello和Dead间隔
4.2 Fast Hello和BFD对比
4.3 等待,重传和传输延迟时间
4.4 LSA相关的计时器
4.4.1 SPF计算节流时间
4.4.2 LSA相关计时器
5. AD/Metric相关配置
5.1 更改默认的参考带宽
5.2 更改接口的Cost值
5.3 其他Cost设置方式
5.4 更改默认AD值
5.5 最大度量值
6. 其他
6.1 前缀抑制
6.2 被动接口
6.3 非连续区域和虚链路
6.4 认证

ospf404.jpeg

本文深入探讨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间隔。

bash
# 单独修改Hello和Dead间隔 R1(config-if)#ip ospf hello-interval 1 R1(config-if)#ip ospf dead-interval 4 R1#show ip ospf interface GigabitEthernet1 | in Timer Timer 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。

bash
R1#show ip ospf interface Gi2 | in Timer Timer 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个参数。

  1. 第一个参数是从收到拓扑变更的事件后到SPF开始计算的延迟时间,默认是50毫秒。如果在这个时间内收到了其他的LSA,可以进行一次SPF计算,包括这个延迟时间内收到的所有的LSA。
  2. 第二个参数是从第一次SPF计算到第二次SPF计算的最小等待时间,默认是200毫秒。类似于物理接口的抑制(Dampening),在这个间隔时间内,如果再次收到一个LSA,则这个时间翻倍,以2的倍数进行增长,直到达到最大的等待时间。
  3. 第三个参数是两次SPF计算的最大等待时间,在到达这个时间后,则等待时间不变。当网络稳定时间超过了最大等待时间,则会恢复到未节流的状态。这点和物理接口的抑制的机制就有差别了,没有半衰期的说法。
bash
R1#show ip ospf Initial SPF schedule delay 50 msecs Minimum hold time between two consecutive SPFs 200 msecs Maximum wait time between two consecutive SPFs 5000 msecs R1(config-router)#timers throttle spf ? <1-600000> Delay between receiving a change to SPF calculation in milliseconds R1(config-router)#timers throttle spf 50 ? <1-600000> Delay between first and second SPF calculation in milliseconds R1(config-router)#timers throttle spf 50 200 ? <1-600000> Maximum wait time in milliseconds for SPF calculations R1(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后没有收到确认,这个计时器规定了重传开始的时间。
bash
R1#show ip ospf Minimum LSA arrival 100 msecs LSA group pacing timer 240 secs Interface flood pacing timer 33 msecs Retransmission pacing timer 66 msecs R1(config-router)#timers lsa-arrival ? <0-600> The minimum interval in sec between accepting the same LSA R1(config-router)#timers lsa arrival ? <0-600000> The minimum interval in milliseconds between accepting the same LSA R22(config-router)#timers pacing lsa-group ? <10-1800> Interval in sec between group of LSA being refreshed or maxaged R22(config-router)#timers pacing flood ? <5-100> The minimum interval in msec to pace limit flooding on interface R22(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了。

bash
R1#show ip ospf interface Gi1 | in Cost Process 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 Cost Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 10

5.2 更改接口的Cost值

更改接口的Cost值是单向的,意味着去程和回程的总的Cost值不一致。可以在链路两端都更改Cost值,来保持去程和回城的Cost值一致,不然有可能会出现去程和回程的路径不一致的现象。

bash
# 更改一个接口的Cost值,只能影响它作为出接口路径的总的Cost值。 R1(config-if)#ip ospf cost 888 R1#show ip ospf interface Gi1 | in Cost Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 888

5.3 其他Cost设置方式

还有一些应用场景比较低的使用方法。

譬如在NBMA网络里,前面有说需要在OSPF进程下指定邻居的地址。也可以在指定到邻居的Cost。

bash
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值。

bash
# 特殊区域路由器收到的默认路由的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 metric R4(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。

bash
R4(config-router)#distance ospf ? external External type 5 and type 7 routes inter-area Inter-area routes intra-area Intra-area routes

5.5 最大度量值

可以将自己的Router LSA里的Metric变得最大,主要用于设备维护升级或设备重启后延迟参与OSPF路由。

  • 默认不加参数,就是互联链路的Metric变成最大。其余的选项是在此基础上增加类型的支持。
bash
R13(config-router)#max-metric router-lsa ? external-lsa Override external-lsa metric with max-metric value include-stub Set maximum metric for stub links in router-LSAs on-startup Set maximum metric temporarily after reboot summary-lsa Override summary-lsa metric with max-metric value <cr> <cr> # 正常的Router LSA。 R23#show ip ospf database router 1.1.1.23 Number of Links: 3 Link connected to: a Stub Network (Link ID) Network/subnet number: 1.1.1.23 (Link Data) Network Mask: 255.255.255.255 Number of MTID metrics: 0 TOS 0 Metrics: 1 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.13 (Link Data) Router Interface address: 172.16.2.13 Number of MTID metrics: 0 TOS 0 Metrics: 1 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.9 (Link Data) Router Interface address: 172.16.2.10 Number of MTID metrics: 0 TOS 0 Metrics: 1 # 设置完max-metric默认值,所有的Transit的链路Metric都变成了65535。 R23(config-router)#max-metric router-lsa R23#show ip ospf database router 1.1.1.23 Number of Links: 3 Link connected to: a Stub Network (Link ID) Network/subnet number: 1.1.1.23 (Link Data) Network Mask: 255.255.255.255 Number of MTID metrics: 0 TOS 0 Metrics: 1 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.13 (Link Data) Router Interface address: 172.16.2.13 Number of MTID metrics: 0 TOS 0 Metrics: 65535 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.9 (Link Data) Router Interface address: 172.16.2.10 Number of MTID metrics: 0 TOS 0 Metrics: 65535
  • 加include-stub,就是额外将末节网络的Metric变成最大。
bash
# 再加上include-stub之后,直连的Stub网络的Metric也变成65535了。 R23#show ip ospf database router 1.1.1.23 Number of Links: 3 Link connected to: a Stub Network (Link ID) Network/subnet number: 1.1.1.23 (Link Data) Network Mask: 255.255.255.255 Number of MTID metrics: 0 TOS 0 Metrics: 65535 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.13 (Link Data) Router Interface address: 172.16.2.13 Number of MTID metrics: 0 TOS 0 Metrics: 65535 Link connected to: a Transit Network (Link ID) Designated Router address: 172.16.2.9 (Link Data) Router Interface address: 172.16.2.10 Number of MTID metrics: 0 TOS 0 Metrics: 65535
  • 加external-lsa,就是额外将外部网络的Metric变成最大,仅限于ASBR。
bash
# 在没加external-lsa的时候,外部路由的Metric还是1,加完之后就变成了16711680。 R13#show ip ospf database external 100.0.0.0 | in Metric Metric Type: 2 (Larger than any link state path) Metric: 1 R13(config-router)#max-metric router-lsa external-lsa R13#show ip ospf database external 100.0.0.0 | in Metric Metric Type: 2 (Larger than any link state path) Metric: 16711680
  • 加summary-lsa,就是额外将3类LSA的Metric变成最大,仅限于ABR。
bash
# 在没加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 Metric MTID: 0 Metric: 16711680
  • on-startup的参数:上述的参数可以叠加使用,加上on-startup的参数后,会在重启后多少时间内将这个参数前面的参数给Metric最大化。此外加上wait-for-bgp的参数,就是不仅要等待设置的时间还要等待BGP收敛完成,这时一个AND的条件。如果只用wait-for-bgp,也可不用加时间。
bash
R4(config-router)#max-metric router-lsa include-stub summary-lsa on-startup ? <5-86400> Time, in seconds, router-LSAs are originated with max-metric wait-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网络移除。则不会将这个链路的网段添加到路由表。
bash
R23(config-router)#prefix-suppression # 在多网访问网络中,正常携带了这个网络的掩码。当前缀抑制启用后,网络掩码转变为/32位。 R22# show ip ospf database network 172.16.2.5 OSPF Router with ID (1.1.1.22) (Process ID 1) Net Link States (Area 2) LS age: 1346 Options: (No TOS-capability, DC) LS Type: Network Links Link State ID: 172.16.2.5 (address of Designated Router) Advertising Router: 1.1.1.21 LS Seq Number: 80000091 Checksum: 0x492 Length: 32 Network Mask: /32 Attached Router: 1.1.1.21 Attached 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: 4 Link connected to: another Router (point-to-point) (Link ID) Neighboring Router ID: 1.1.1.1 (Link Data) Router Interface address: 172.16.0.2 Number of MTID metrics: 0 TOS 0 Metrics: 1 Link connected to: a Stub Network (Link ID) Network/subnet number: 172.16.0.0 (Link Data) Network Mask: 255.255.255.252 Number of MTID metrics: 0 TOS 0 Metrics: 1

6.2 被动接口

在路由器上可以通过设置被动接口来决定哪些接口不需要参与OSPF建邻居的过程。对于连接到非路由器的接口,譬如终端设备,可以将此接口设置成被动接口。它的好处是:

  • 不会在此接口发送Hello包,防止未经授权的设备和本路由器建立邻居关系。
  • 由于不会在被动接口上收发Hello包,减少了一些协议的开销,减轻了CPU的负担

配置方式分为两种,既可以直接passive掉一些接口,也可以默认passive全部接口,再no passive需要建立邻居的接口,这点和EIGRP的配置很像。

bash
# 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。

bash
R1#show run | s r os router ospf 1 router-id 1.1.1.1 area 1 virtual-link 1.1.1.12 R12#show run | s r os router ospf 1 router-id 1.1.1.12 area 1 virtual-link 1.1.1.1 R12#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,则认证信息部分存储明文密码。
bash
# 接口下启用明文密码。 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引入了预共享密钥。
bash
# 接口下启用密文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 2026 R31#show key chain Key-chain ospfkey: key 1 -- text "CiscoOspfKey" cryptographic-algorithm: hmac-sha-256 accept 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 Gi2 Cryptographic authentication enabled Sending 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的。

ospf403.jpeg

后记:还有好多特性并没有提及,譬如跟MPLS VPN相关的,跟SR相关的,多区域,NSR,GR等等。在这里就不大而全了。这个系列已经足够覆盖到日常工作中用到的大部分的知识了。

本文作者:潘晓可

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!