开放最短路径优先 v3 - OSPFv3

OSPFv3 是 OSPFv2 的修订版本,支持 IPv6 地址族。

IETF 定义了 OSPFv3 的扩展,以支持多个地址族(IPv6 和 IPv4)。FRR 不支持多个地址族。

基本 OSPFv3 配置

您可以使用编号接口或未编号接口配置 OSPF

当您启用或禁用 OSPF 时,FRR 服务将重新启动,这可能会影响流量。

NVUE 命令不支持 OSPFv3。

OSPFv3 编号

要使用编号接口配置 OSPF,您需要指定路由器 ID、IP 子网前缀和区域地址。交换机上 IP 地址与网络子网匹配的所有接口都将进入指定的区域。OSPF 尝试在这些接口上发现其他 OSPF 路由器。Cumulus Linux 将所有匹配的接口网络地址添加到 Type-1 路由器 LSA,并通告给发现的邻居,以实现正确的可达性。

如果您不想在某些接口上建立 OSPF 邻接关系,但又想在 OSPF 数据库中通告这些网络,则可以将这些接口配置为被动接口。被动接口会创建一个数据库条目,但不发送或接收 OSPF hello 数据包。例如,在数据中心拓扑中,面向主机的接口不需要运行 OSPF,但是,您必须将相应的 IP 地址通告给邻居。

以下示例命令在 leaf01 和 spine01 上配置编号的 OSPF。

leaf01spine01
  • 环回地址为 2001:db8::a0a:0a01/128
  • swp51 上的 IP 地址为 2001:db8::a00:0101/127
  • 路由器 ID 为 10.10.10.1
  • 交换机上 IP 地址与子网 2001:db8::a0a:0a01/128 和 IP 地址为 2001:db8::a00:0101/127 的 swp51 匹配的所有接口都在区域 0.0.0.0 中
  • swp1 和 swp2 是被动接口
  • 环回地址为 2001:db8::a0a:0a65/128
  • swp1 上的 IP 地址为 22001:db8::a00:0100/127
  • 路由器 ID 为 10.10.10.101
  • 交换机上 IP 地址与子网 2001:db8::a0a:0a65/128 和 IP 地址为 2001:db8::a00:0100/127 的 swp1 匹配的所有接口都在区域 0.0.0.0 中。
  1. 编辑 /etc/frr/daemons 文件以启用 ospf6 守护程序,然后启动 FRR 服务(请参阅 FRRouting)。

  2. 编辑 /etc/network/interfaces 文件以配置环回和 swp51 的 IP 地址

cumulus@leaf01:~$ sudo nano /etc/network/interfaces
...
auto lo
iface lo inet loopback
  address 2001:db8::a0a:0a01/128

auto swp51
iface swp51
  address 2001:db8::a00:0101/127
  1. 运行 ifreload -a 命令以加载新配置

    cumulus@leaf01:~$ sudo ifreload -a
    
  2. 从 vtysh shell,配置 OSPF

    cumulus@leaf01:~$ sudo vtysh
    ...
    leaf01# configure terminal
    leaf01(config)# router ospf6
    leaf01(config-ospf6)# ospf6 router-id 10.10.10.1
    leaf01(config-ospf6)# interface lo area 0.0.0.0
    leaf01(config-ospf6)# interface swp51 area 0.0.0.0
    leaf01(config-ospf6)# exit
    leaf01(config)# interface swp1
    leaf01(config-if)# ipv6 ospf6 passive
    leaf01(config-if)# exit
    leaf01(config)# interface swp2
    leaf01(config-if)# ipv6 ospf6 passive
    leaf01(config-if)# end
    leaf01# write memory
    leaf01# exit
    
  1. 编辑 /etc/frr/daemons 文件以启用 ospf6 守护程序,然后启动 FRR 服务(请参阅 FRRouting)。

  2. 编辑 /etc/network/interfaces 文件以配置环回和 swp1 的 IP 地址

    cumulus@spine01:~$ sudo nano /etc/network/interfaces
    ...
    auto lo
    iface lo inet loopback
      address 2001:db8::a0a:0a65/128
    
    auto swp1
    iface swp1
      address 2001:db8::a00:0100/127
    
  3. 运行 ifreload -a 命令以加载新配置

    cumulus@spine01:~$ sudo ifreload -a
    
  4. 从 vtysh shell,配置 OSPF

    cumulus@spine01:~$ sudo vtysh
    ...
    spine01# configure terminal
    spine01(config)# router ospf6
    spine01(config-ospf6)# ospf6 router-id 10.10.10.101
    spine01(config-ospf6)# interface lo area 0.0.0.0
    spine01(config-ospf6)# interface swp1 area 0.0.0.0
    spine01(config-ospf6)# end
    spine01# write memory
    spine01# exit
    

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
router ospf6
 ospf6 router-id 10.10.10.1
 interface lo area 0.0.0.0
 interface swp51 area 0.0.0.0
interface swp1
 ipv6 ospf6 passive
interface swp2
 ipv6 ospf6 passive
...
...
router ospf6
 ospf router-id 10.10.10.101
 interface lo area 0.0.0.0
 interface swp1 area 0.0.0.0
...

OSPFv3 未编号

未编号接口是没有唯一 IP 地址的接口;多个接口共享同一个 IP 地址。

要配置未编号接口,请获取另一个接口(称为锚点)的 IP 地址,并将其用作未编号接口的 IP 地址。锚点通常是交换机上的环回接口。

OSPFv3 未编号仅支持点对点接口

以下示例命令在 leaf01 和 spine01 上配置未编号的 OSPFv3。

leaf01spine01
  • 环回地址为 2001:db8::a0a:0a01/128
  • 路由器 ID 为 10.10.10.1
  • OSPF 在环回接口和区域 0.0.0.0 中的 swp51 上
  • swp1 和 swp2 是被动接口
  • swp51 是点对点接口(未编号接口需要点对点)
    • 环回地址为 2001:db8::a0a:0a65/128
    • 路由器 ID 为 10.10.10.101
    • OSPF 在环回接口和区域 0.0.0.0 中的 swp1 上
    • swp1 是点对点接口(未编号接口需要点对点)
      1. 编辑 /etc/frr/daemons 文件以启用 ospf6 守护程序,然后启动 FRR 服务(请参阅 FRRouting)。

      2. 编辑 /etc/network/interfaces 文件以配置环回和 swp51 的 IP 地址

      cumulus@leaf01:~$ sudo nano /etc/network/interfaces
      ...
      auto lo
      iface lo inet loopback
        address 2001:db8::a0a:0a01/128
      
      auto swp1
      iface swp1
        address 2001:db8::a0a:0a01/128
      
      1. 运行 ifreload -a 命令以加载新配置

        cumulus@leaf01:~$ sudo ifreload -a
        
        
      2. 从 vtysh shell,配置 OSPFv3

      cumulus@leaf01:~$ sudo vtysh
      ...
      leaf01# configure terminal
      leaf01(config)# router ospf6
      leaf01(config-ospf6)# ospf6 router-id 10.10.10.1
      leaf01(config-ospf6)# interface lo area 0.0.0.0
      leaf01(config-ospf6)# interface swp51 area 0.0.0.0
      leaf01(config-ospf6)# exit
      leaf01(config)# interface swp1
      leaf01(config-if)# ipv6 ospf6 passive
      leaf01(config-if)# exit
      leaf01(config)# interface swp2
      leaf01(config-if)# ipv6 ospf6 passive
      leaf01(config-if)# exit
      leaf01(config)# interface swp51
      leaf01(config-if)# ipv6 ospf6 network point-to-point
      leaf01(config-if)# end
      leaf01# write memory
      leaf01# exit
      
      1. 编辑 /etc/frr/daemons 文件以启用 ospf6 守护程序,然后启动 FRR 服务(请参阅 FRRouting)。

      2. 编辑 /etc/network/interfaces 文件以配置环回和 swp1 的 IP 地址

      cumulus@spine01:~$ sudo nano /etc/network/interfaces
      ...
      auto lo
      iface lo inet loopback
        address 2001:db8::a0a:0a65/128
      
      auto swp1
      iface swp1
        address 2001:db8::a0a:0a65/128
      
      1. 运行 ifreload -a 命令以加载新配置

        cumulus@spine01:~$ sudo ifreload -a
        
      2. 从 vtysh shell,配置 OSPFv3

      cumulus@spine01:~$ sudo vtysh
      ...
      spine01# configure terminal
      spine01(config)# router ospf6
      spine01(config-ospf6)# ospf router-id 10.10.10.101
      spine01(config-ospf6)# interface lo area 0.0.0.0
      spine01(config-ospf6)# interface swp1 area 0.0.0.0
      spine01(config-ospf6)# exit
      spine01(config)# interface swp1
      spine01(config-if)# ipv6 ospf6 network point-to-point
      spine01(config-if)# end
      spine01# write memory
      spine01# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf6 router-id 10.10.10.1
       interface lo area 0.0.0.0
       interface swp51 area 0.0.0.0
      interface swp1
       ipv6 ospf6 passive
      interface swp2
       ipv6 ospf6 passive
      interface swp51
       ipv6 ospf6 network point-to-point
      ...
      
      ...
      router ospf6
       ospf6 router-id 10.10.10.101
       interface lo area 0.0.0.0
       interface swp1 area 0.0.0.0
      interface swp1
       ipv6 ospf6 network point-to-point
      ...
      

      可选 OSPFv3 配置

      本节介绍可选配置。本节中提供的步骤假定您已按照上面的基本 OSPF 配置中所述配置了基本 OSPFv3。

      接口参数

      您可以为每个接口定义以下 OSPF 参数

      • 网络类型(点对点或广播)。广播是默认设置。除非您打算将以太网介质用作具有多个连接路由器的 LAN,否则将接口配置为点对点。点对点提供简化的邻接状态机,因此无需 DR/BDR 选举和LSA 反射。有关更多信息,请参阅 RFC5309

        OSPFv3 未编号需要点对点。

      • Hello 间隔。在接口上发送 hello 数据包之间的秒数。默认值为 10 秒。
      • 死亡间隔。邻居停止听到 hello 数据包后声明路由器关闭之前的秒数。默认值为 40 秒。
      • 在广播接口上成为 OSPF DR 的优先级。默认优先级为 1。
      • 通告前缀列表。前缀列表定义出站路由过滤器。
      • 成本。成本决定了到目标的最短路径。

      以下命令示例将 swp51 上的网络类型设置为点对点。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# interface swp51
      switch(config-if)# ipv6 ospf6 network point-to-point
      switch(config-if)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      interface swp51
       ipv6 ospf6 network point-to-point
      ...
      

      以下命令示例将 swp51 的 hello 间隔设置为 5 秒,死亡间隔设置为 60 秒,优先级设置为 5。hello 间隔和死亡间隔可以是 1 到 65535 秒之间的任何值。优先级可以是 0 到 255 之间的任何值(0 将接口配置为永远不会成为广播接口上的 OSPF 指定路由器 (DR))。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# interface swp51
      switch(config-if)# ipv6 ospf6 hello-interval 5
      switch(config-if)# ipv6 ospf6 network dead-interval 60
      switch(config-if)# ipv6 ospf6 network priority 5
      switch(config-if)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      interface swp51
       ipv6 ospf6 hello-interval 5
       ipv6 ospf6 dead-interval 60
       ipv6 ospf6 priority 5
      ...
      

      以下示例命令使用名为 myfilter 的 IPv6 通告前缀列表配置接口 swp51

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# interface swp51
      switch(config-if)# ipv6 ospf6 advertise prefix-list myfilter
      switch(config-if)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      interface swp51
        ipv6 ospf6 advertise prefix-list myfilter
      ...
      

      以下示例命令配置 swp51 的成本。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# interface swp51
      switch(config-if)# ipv6 ospf6 cost 1
      switch(config-if)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      interface swp51
        ipv6 ospf6 cost 1
      ...
      

      要显示配置的 OSPF 接口参数值,请运行 vtysh show ipv6 ospf6 interface 命令。

      SPF 计时器默认值

      OSPF3 使用以下默认计时器来防止连续的 SPF 使 CPU 负担过重

      • 从初始事件到 SPF 运行的 0 毫秒
      • 连续 SPF 运行之间 50 毫秒(该数字随每个 SPF 加倍,直到达到 SPF 运行之间的最大时间)
      • SPF 之间最大 5000 毫秒

      以下示例命令将从初始事件到 SPF 运行的毫秒数更改为 80,将连续 SPF 运行之间的毫秒数更改为 100,并将 SPF 之间最大毫秒数更改为 6000。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# timers throttle spf 80 100 6000
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf router-id 10.10.10.1
       passive-interface swp1
       passive-interface swp2
       network swp51 area 0.0.0.0
       timers throttle spf 80 100 6000
      ...
      

      要查看配置的 SPF 计时器值,请运行 vtysh show ipv6 ospf6 命令。

      配置 OSPFv3 区域

      您可以使用不同的区域来控制路由。您可以

      • 限制 OSPFv3 区域到达另一个区域。
      • 通过为特定地址范围内的所有路由创建摘要路由来管理路由表的大小。

      以下部分提供了命令示例。

      以下示例命令从路由表中删除 3:3::/64 路由。如果表中没有路由,则该网络中的任何目的地都不可达。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# area 0.0.0.0 range 3:3::/64 not-advertise
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      以下示例命令为 2001::/64 范围内的所有路由创建摘要路由

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# area 0.0.0.0 range 2001::/64 advertise
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      您还可以配置摘要路由的成本,Cumulus Linux 使用该成本来确定到目标的最短路径。成本值必须介于 0 到 16777215 之间。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# area 0.0.0.0 range 2001::/64 cost 160
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
        ospf6 router-id 10.10.10.1
        area 0.0.0.0 range 3:3::/64 not-advertise
        area 0.0.0.0 range 2001::/64 advertise
        area 0.0.0.0 range 2001::/64 cost 160
      ...
      

      Stub 区域

      外部路由是从另一个协议重新分发到 OSPF 中的路由。它们具有 AS 范围的洪泛范围。通常,外部链路状态占 LSDB 的很大一部分。Stub区域通过不洪泛 AS 外部 LSA 来减小 LSDB 大小。

      所有路由器都必须同意某个区域是 Stub 区域,否则它们不会成为 OSPF 邻居。

      要配置 Stub 区域

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# area 0.0.0.1 stub
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf6 router-id 10.10.10.63
       area 0.0.0.1 stub
      ...
      

      Stub 区域仍然接收有关属于同一 OSPF 域的其他区域的网络的信息。如果未配置摘要(或摘要不全面),则信息可能会使节点不堪重负。完全 Stub 区域解决了这个问题。完全 Stub 区域中的路由器在其 LSDB 中保留有关其区域内路由的信息。

      要配置完全 Stub 区域

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# area 0.0.0.1 stub no-summary
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf6 router-id 10.10.10.63
       area 0.0.0.1 stub no-summary
      ...
      

      以下是区域类型差异的简要摘要

      类型行为
      正常非零区域LSA 类型 1、2、3、4 区域范围、类型 5 外部、区域间路由摘要
      Stub 区域LSA 类型 1、2、3、4 区域范围、无类型 5 外部、区域间路由摘要
      完全 Stub 区域LSA 类型 1、2 区域范围、默认摘要、不允许类型 3、4、5 LSA 类型

      自动成本参考带宽

      当您设置自动成本参考带宽时,Cumulus Linux 会动态计算 OSPF 接口成本以支持更高速度的链路。100Gbps 链路速度的默认值为 100000。链路速度低于 100Gbps 的接口的成本更高。

      为避免路由环路,请将带宽设置为所有 OSPF 路由器上的一致值。

      以下示例命令配置 90Gbps 链路速度的自动成本参考带宽

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# auto-cost reference-bandwidth 90000
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf6 router-id 10.10.10.1
       interface lo area 0.0.0.0
       interface swp51 area 0.0.0.0
       auto-cost reference-bandwidth 90000
      ...
      

      管理距离

      当两个不同的协议为同一目标提供路由信息时,Cumulus Linux 使用管理距离来选择要使用的路由协议。距离越小,协议越可靠。例如,如果交换机从管理距离为 110 的 OSPFv3 接收到一条路由,并从管理距离为 100 的 BGP 接收到同一条路由,则交换机选择 BGP。

      Cumulus Linux 提供了多个命令来更改 OSPF 路由的管理距离。默认值为 110。

      此示例命令设置一组路由的距离,而不是特定路由。

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# distance 254
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      此示例命令将内部路由的 OSPF 管理距离更改为 150,将外部路由的 OSPF 管理距离更改为 220

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# distance ospf6 intra-area 150 inter-area 150 external 220
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      此示例命令将内部路由的 OSPF 管理距离更改为 150,以路由器的同一区域内的子网或网络

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# distance ospf6 intra-area 150
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      此示例命令将内部路由的 OSPF 管理距离更改为 150,以路由器属于的区域中的子网

      cumulus@switch:~$ sudo vtysh
      ...
      switch# configure terminal
      switch(config)# router ospf6
      switch(config-ospf6)# distance ospf6 inter-area 150
      switch(config-ospf6)# end
      switch# write memory
      switch# exit
      

      vtysh 命令将配置保存到 /etc/frr/frr.conf 文件中。例如

      ...
      router ospf6
       ospf6 router-id 10.10.10.1
       interface lo area 0.0.0.0
       distance ospf6 intra-area 150 inter-area 150 external 220
      ...
      

      故障排除

      Cumulus Linux 提供了多个 OSPFv3 故障排除命令

      目的
      vtysh 命令
      显示邻居状态show ipv6 ospf6 neighbor
      验证 LSDB 在网络中的所有路由器上是否相同show ipv6 ospf6 database
      确定 Cumulus Linux 未正确转发 OSPF 路由的原因show ipv6 ospf6 route
      显示 OSPF 接口show ipv6 ospf6 interface
      帮助可视化网络视图show ipv6 ospf6 spf tree
      显示有关 OSPFv3 进程的信息show ipv6 ospf6

      以下示例显示了 vtysh show ipv6 ospf6 neighbor 命令输出

      cumulus@leaf01:mgmt:~$ sudo vtysh
      ...
      leaf01# show ipv6 ospf6 neighbor
      Neighbor ID     Pri    DeadTime    State/IfState         Duration I/F[State]
      10.10.10.101      1    00:00:34     Full/BDR             00:02:58 swp51[DR]
      

      以下示例显示了 vtysh show ipv6 ospf6 route 命令输出

      cumulus@leaf01:mgmt:~$ sudo vtysh
      ...
      leaf01# show ipv6 ospf6 route
      Codes: K - kernel route, C - connected, S - static, R - RIPng,
             O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table,
             v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR,
             f - OpenFabric,
             > - selected route, * - FIB route, q - queued route, r - rejected route
      
      O   2001:db8::a00:100/127 [110/100] is directly connected, swp51, weight 1, 00:00:20
      O   2001:db8::a0a:a01/128 [110/10] is directly connected, lo, weight 1, 00:01:40
      O>* 2001:db8::a0a:a65/128 [110/110] via fe80::4638:39ff:fe00:2, swp51, weight 1, 00:00:15
      

      要捕获 OSPF 数据包,请运行 sudo tcpdump -v -i swp1 ip proto ospf6 命令。