本文深入探讨OSPF计时器(Hello/Dead间隔、SPF节流、LSA计时器)、度量值(参考带宽、接口Cost、最大度量值)及高级配置(前缀抑制、被动接口、虚链路、认证)。旨在优化网络性能、收敛速度和安全性,通过灵活配置提升OSPF路由效率和稳定性,并通过配置示例和show命令输出进行了验证。
链路两端的接口的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
常规的做法使用BFD来检测链路的状态,联动来来建立和移除OSPF邻居。如果链路反复翻动,频繁地更新SLA,导致LSA序列号快速增长。这时候,通常会在接口下使能接口抑制(Dampening),通过惩罚反复翻动的接口,来使网络变得更加稳定。
虽然Fast Hello也能达到相同的目的,但是选择BFD的原因是:
从下面的show输出,可以看出,除了Hello和Dead以外,还有Wait和Retransmit。
bashR1#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。一般情况下不会设置这个参数。
在极少的情况下,会更改下面的计时器的值。
下面的命令后面有3个参数。
bashR1#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>
bashR1#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
之前说过,OSPF默认按100M接口的带宽设为Cost 1。对于现代网络来说,1G和10G口已经普及了,按默认来说,它们Cost也是1,这样OSPF就无法选出真实的最优路径了。
在默认情况下,可以看到1G的Cost值是1。当将参考带宽改成10G的时候,系统提示要将所有路由器的参考带宽要改成一致的。这样所有路由器计算Cost的公式就是一致的了。再查看1G接口的Cost值就变成10了。
bashR1#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
更改接口的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
还有一些应用场景比较低的使用方法。
譬如在NBMA网络里,前面有说需要在OSPF进程下指定邻居的地址。也可以在指定到邻居的Cost。
bashR1(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
OSPF不像EIGRP和BGP,对内部路由和外部路由有不同的AD值。但是可以手工设置域内,域间和外部路由的AD值,取值范围为1-255。
bashR4(config-router)#distance ospf ?
external External type 5 and type 7 routes
inter-area Inter-area routes
intra-area Intra-area routes
可以将自己的Router LSA里的Metric变得最大,主要用于设备维护升级或设备重启后延迟参与OSPF路由。
bashR13(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
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
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
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
bashR4(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
通过在OSPF进程下开启prefix-suppression来移除所有的链路路由,只留下末节路由,譬如Loopback地址。
bashR23(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
在路由器上可以通过设置被动接口来决定哪些接口不需要参与OSPF建邻居的过程。对于连接到非路由器的接口,譬如终端设备,可以将此接口设置成被动接口。它的好处是:
配置方式分为两种,既可以直接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
非连续区域包含三种情况,非连续的Area 0,非连续的其他区域,以及其他区域不直连Area 0。
对于非连续的Area 0中间隔的是其他OSPF区域,或是其他区域通过另一个其他区域连接到Area 0的这两种情况,可以使用虚电路来解决。在两个ABR之间建立虚连接,可以使得Area 0直连,或是其他区域直连Area 0。下面的例子是Area 3通过Area 2连接到Area 0。
bashR1#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,并传给其他区域。
OSPF支持接口下和区域内进行认证。在开始讲OSPF的报头的时候,里面有认证类型和认证信息的字段。
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
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的。
后记:还有好多特性并没有提及,譬如跟MPLS VPN相关的,跟SR相关的,多区域,NSR,GR等等。在这里就不大而全了。这个系列已经足够覆盖到日常工作中用到的大部分的知识了。
本文作者:潘晓可
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!