17.3 IPv6路由基础-OSPFv3

关于OSPFv3的详尽描述出现在RFC2740中,OSPFv3是OSPF Version 3的简称,OSPFv3是运行于IPv6的OSPF路由协议,OSPFv3在OSPFv2基础上进行了修改,是一个独立的路由协议。当然我们可以这样认为OSPFv3的关系和OSPFv2的关系类似于RIPng和RIPv2的关系,OSPFv3依旧使用SPF算法、LSA泛洪、DR机制、区域和特殊区域等,同时OSPFv3也不向后兼容OSPFv2.
除了相同点OSPFv3和OSPFv2也有很多不同点,比如OSPFv3不再支持认证(RIPng也是如此),OSPFv3增加和改变了某些LSA的功能,比如大部分OSPFv3的LSA不在携带前缀信息,LSA的结构也做了较大改变,在OSPFv3中也增加了链路本地地址的使用,这一点和RIPng相同,这些地址总是以FE80::/10开头的)作为源地址和下一跳地址出现;OSPFv3增加了每个链路上实例的概念,在同一个链路上实例相同的OSPF进程才可以建立邻居。
另外OSPFv3在升级时相比其他的IPv6协议更加麻烦,因为OSPF完全依赖IP层,而其他协议,比如RIPng依赖UDP,BGP for IPv6工作在TCP层面。

17.3.1 OSPFv3基础

OSPFv3的一些基础知识:
 OSPFv3协议号仍然为89,在IPv6 Next Header里标识。
 OSPFv3以组播地址发送协议报文,而IPv6 Hop Limit限定为1;OSPFv3中Virtual-Link则通过单播发送更新
 OSPFv3依旧采用组播方式(也可以通过单播方式)发送Hello报文:AllSPfRouters:FF02::5和AllDRouters:FF02::6
OSPFv3沿用了OSPF2的区域概念,比如图17-14中,读者可以看到骨干区域0以及其中的区域骨干路由器(Backbone Router);可以看到普通区域1、2、3、4等以及连接普通区域和骨干区域的区域边界路由器ABR;可以看到引入isis协议的AS边界路由器ASBR设备;读者不能从图中看到本书不涉及的特殊区域。

华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第1张图片

图17-14 OSPFv3区域示意图
通过包头的TYPE字段来标识5种报文类型,其作用如表17-4所示,一个OSPFv3的报文由OSPFv3的报头和具体的报文类型组成,如图17-15所示
华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第2张图片

图17-15 OSPFv3的报文头部
OSPFv3的协议包头中各个字段按顺序描述如下:
 Version,1字节。表示OSPF版本号,设置为3。
 Type,1字节,该部分即表17-4所描述的内容。
 Packet length,2字节长。OSPF协议包的长度,单位为字节。包括OSPF标准包头长度。
 Router ID,4字节长。发送此报文的路由器的Router ID。
 Area ID,32位区域号。标识这个包属于哪个区域。每个OSPF包只能属于一个区域。通过virtual link传输的OSPF包标记骨干区域号。
 Checksum,使用IPv6标准16位校验和。校验内容包括前导的IPv6伪头和OSPF协议包头。伪头中的Upper-Layer Packet Length字段值等于OSPF包头中的Packet length字段值。如果包长度不是16位的整数倍,则用0填充后进行计算。计算校验和时校验和字段本身设置为0。
 Instance ID,1字节。缺省值为0。允许在一个链路上运行多个OSPFv3的实例。每个实例应该具有唯一的Instance ID。Instance ID只在本地链路上有意义。如果接收到的OSPF包的Instance ID和本接口的Instance ID不同,则丢弃这个包。
 保留位,8位的保留位。必须为0。
表17-4 OSPFv3的报文类型和作用
报文类型 报文功能
Hello报文 周期性发送,用来发现和维持OSPFv3邻居关系。
DD报文(Database Description packet) 描述了本地LSDB的摘要信息,用于两台设备进行数据库同步。
LSR报文(Link State Request packet) 用于向对方请求所需的LSA。
设备只有在OSPFv3邻居双方成功交换DD报文后才会向对方发出LSR报文。
LSU报文(Link State Update packet) 向对方发送其所需要的LSA。包含了具体的更新内容
LSAck报文(Link State Acknowledgment packet) 用来对收到的LSA进行确认。OSPF中显式确认方式
OSPFv3的魅力所在更集中于LSA,OSPFv3的重要的LSA类型包括1类,2类,3类,4类,5类,7类,额外的增加了新的8类和9类LSA,关于这部分的讨论并不在本书阐述(请读者关注乾颐堂系列华为丛书的HCNP和HCIE部分),我们仅在此处列出各种LSA的基本功能,如表17-5所示。
表17-5 OSPFv3的LSA类型
LSA类型 LSA作用
Router-LSA(Type1) 设备会为每个运行OSPFv3接口所在的区域产生一个LSA,描述了设备的链路状态和开销,在所属的区域内传播。
Network-LSA(Type2) 由DR产生,描述本链路的链路状态,在所属的区域内传播。
Inter-Area-Prefix-LSA(Type3) 由ABR产生,描述区域内某个网段的路由,并通告给其他相关区域。
Inter-Area-Router-LSA(Type4) 由ABR产生,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。
AS-external-LSA(Type5) 由ASBR产生,描述到AS外部的路由,通告到所有的区域(除了Stub区域和NSSA区域)。
NSSA LSA(Type7) 由ASBR产生,描述到AS外部的路由,仅在NSSA区域内传播。
Link-LSA(Type8) 每个设备都会为每个链路产生一个Link-LSA,描述到此Link上的link-local地址、IPv6前缀地址,并提供将会在Network-LSA中设置的链路选项,它仅在此链路内传播。
Intra-Area-Prefix-LSA(Type9) 每个设备及DR都会产生一个或多个此类LSA,在所属的区域内传播。
• 设备产生的此类LSA,描述与Route-LSA相关联的IPv6前缀地址。
• DR产生的此类LSA,描述与Network-LSA相关联的IPv6前缀地址。

17.3.2 OSPFv3报文格式

在上一小节,我们讨论了OSPFv3报文的头部,接下来我们来查看OSPFv3具体的报文。
1.Hello报文
Hello报文作用参照表17-4,报文结构参见图17-16
华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第3张图片

图17-16 OSPFv3的Hello报文
该报文各字段含义:
 Interface ID: 接口标识, 在路由器上唯一标识接口
 Rtr Priority: 路由器优先级
 HelloInterval: 发送Hello 报文的间隔
 RouterDeadInterval: 此计时器超时后, 邻居Down掉
 Neighbor ID: 邻居的Router ID
 Options: V6:为0时, 不参加路由计算
 E-在Hello报文中, 此位为0时, 表示此区域不传播AS-External-LSA,E为0是,表示接收AS外部LSA。
 MC-是否支持组播
 N-Type-7 LSA 处理相关(NSSA特殊区域,不在本书讨论范围)
 R-代表起源设备是否是活动的,如果该位被清除了,那么该节点不能被OSPF计算
 DC-该为代表路由器处理按需链路的能力
2.DBD数据库描述报文
DBD报文作用参照表17-4,DBD报文的结构参见图17-17

华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第4张图片

图17-17 OSPFv3的DBD报文结构
该报文各字段含义:
 Options:与Hello报文中的Options相同
 Interface MTU:本地接口的MTU值
 I: Initial,初始化位,为1时表明是第一个DD报文
 M: More,表明是否还有更多的DBD报文
 MS:主/从位(Master/Slave),为1时,表明为主(Master)
 DD sequence number:DD报文的序列号,用于隐式确认
 List of LSA Header:LSA头部的集合, 用于接受方检查LS数据库
3.LSR报文
LSR报文的作用参见表17-4,LSR报文的结构参见图17-18

华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第5张图片

图17-18 OSPFv3的LSR报文结构

该报文各字段含义:
 LS Type,链路状态类型(包括1类、2类、3类、4类、5类、7类、8类、9类LSA等)
 Link State ID, LSA的标识
 Advertising Router,通告路由器,产生LSA的设备
4.LSU
链路状态更新的作用参见表17-4,LSU的报文结构参见图17-19

华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第6张图片
图17-19 OSPFv3的LSU报文结构
内容为具体的LSA条目
5.LSAck
链路状态确认报文作用参见表17-4,LSAck的报文结构参见图17-20
华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第7张图片
图17-20 OSPFv3的LSAck报文

17.3.3 OSPFv3基本配置实例

我们在图17-21上实施OSPFv3的配置,使得全网所有路由器学习到相互的IPv6路由,在本实例中我们仅仅创建area 0。

华为设备OSPF理论基础和实现实验(迎接IPv6数通时代的重要协议)_第8张图片
图17-21 OSPFv3实施拓扑图

[R1]OSPFv3 //启动OSPFv3进程,默认的进程ID为1 
[R1-OSPFv3-1]router-id 11.1.1.1 //OSPFv3的路由器ID为一个IPv4格式的标识,默认情况下如果该设备仅仅配置了IPv6协议栈,而没有配置IPv4地址,那么OSPFv3不会得到OSPFv3的路由器ID,那么此时OSPFv3进程无法启动,强烈推荐读者在现实网络手工创建路由器ID
[R1-OSPFv3-1]area 0 //创建OSPFv3的骨干区域
[R1-OSPFv3-1-area-0.0.0.0]q
[R1-OSPFv3-1]
[R1-OSPFv3-1]int s2/0/0
[R1-Serial2/0/0]OSPFv3 1 area 0 ?
  instance  Interface instance
        Please press ENTER to execute command 
[R1-Serial2/0/0]OSPFv3 1 area 0 //使能物理接口的OSPFv3放到骨干区域中,同时该接口的网络也会被通告出去
[R1-Serial2/0/0]int lo0
[R1-LoopBack0]OSPFv3 1 area 0
[R1-LoopBack0]int g0/0/0
[R1-GigabitEthernet0/0/0]OSPFv3 1 area 0
#
[R2]OSPFv3 
[R2-OSPFv3-1]router-id 22.1.1.1
[R2-OSPFv3-1]area 0
[R2-OSPFv3-1-area-0.0.0.0]int g0/0/0
[R2-GigabitEthernet0/0/0]OSPFv3 1 area 0
[R2-GigabitEthernet0/0/0]int lo0
[R2-LoopBack0]OSPFv3 1 area 0
#
[R3]OSPFv3
[R3-OSPFv3-1]router-id 33.1.1.1
[R3-OSPFv3-1]area 0
[R3-OSPFv3-1-area-0.0.0.0]int lo0
[R3-LoopBack0]OSPFv3 1 area 0
[R3-LoopBack0]int g0/0/0
[R3-GigabitEthernet0/0/0]OSPFv3 1 area 0
#
[R4]OSPFv3
[R4-OSPFv3-1]router-id 44.1.1.1
[R4-OSPFv3-1]area 0
[R4-OSPFv3-1-area-0.0.0.0]int lo0
[R4-LoopBack0]OSPFv3 1 area 0
[R4-LoopBack0]int s2/0/0
[R4-Serial2/0/0]OSPFv3 1 area 0
验证OSPFv3的邻居
display OSPFv3 peer //R1上正常的建立了三个邻居
OSPFv3 Process (1)
OSPFv3 Area (0.0.0.0)
Neighbor ID     Pri  State            Dead Time Interface            Instance ID
22.1.1.1          1  Full/Backup      00:00:31  GE0/0/0                        0
33.1.1.1          1  Full/DROther     00:00:35  GE0/0/0                        0
44.1.1.1          1  Full/-           00:00:36  S2/0/0                         0
display OSPFv3 lsdb //验证OSPFv3数据库的状态,关于细节我们在后续华为书籍描述和讨论

* indicates STALE LSA

           OSPFv3 Router with ID (11.1.1.1) (Process 1)
               Link-LSA (Interface GigabitEthernet0/0/0)

Link State ID   Origin Router    Age   Seq#       CkSum  Prefix
0.0.0.3         11.1.1.1         1082  0x80000001 0xa563      1
0.0.0.3         22.1.1.1         0891  0x80000001 0x7c2b      1
0.0.0.3         33.1.1.1         0866  0x80000001 0xf12d      0

               Link-LSA (Interface Serial2/0/0)

Link State ID   Origin Router    Age   Seq#       CkSum  Prefix
0.0.0.14        11.1.1.1         1094  0x80000001 0xe825      1
0.0.0.13        44.1.1.1         0956  0x80000001 0x2d2f      1

               Router-LSA (Area 0.0.0.0)

Link State ID   Origin Router    Age   Seq#       CkSum    Link
0.0.0.0         11.1.1.1         0860  0x80000009 0xff69      2
0.0.0.0         22.1.1.1         0860  0x80000006 0xf1fa      1
0.0.0.0         33.1.1.1         0860  0x80000005 0x9052      1
0.0.0.0         44.1.1.1         0946  0x80000004 0x5342      1

               Network-LSA (Area 0.0.0.0)

Link State ID   Origin Router    Age   Seq#       CkSum
0.0.0.3         11.1.1.1         0860  0x80000002 0x4681

               Intra-Area-Prefix-LSA (Area 0.0.0.0)

Link State ID   Origin Router    Age   Seq#       CkSum  Prefix  Reference
0.0.0.1         11.1.1.1         0855  0x8000000c 0x6709      2  Router-LSA
0.0.0.2         11.1.1.1         0859  0x80000002 0x4c13      1  Network-LSA
0.0.0.1         22.1.1.1         0860  0x80000004 0x55ac      1  Router-LSA
0.0.0.1         33.1.1.1         0858  0x80000003 0xe4f5      1  Router-LSA
0.0.0.1         44.1.1.1         0940  0x80000004 0x847b      2  Router-LSA
display IPv6 routing-table protocol OSPFv3 //验证OSPFv3得到的路由表
Public Routing Table : OSPFv3
Summary Count : 6

OSPFv3 Routing Table's Status : < Active >
Summary Count : 3 

 Destination  : 2022::2                         PrefixLength : 128
 NextHop      : FE80::2E0:FCFF:FEE9:98F         Preference   : 10
 Cost         : 1                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

 Destination  : 2033::3                         PrefixLength : 128
 NextHop      : FE80::2E0:FCFF:FEE7:1F8A        Preference   : 10
 Cost         : 1                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

 Destination  : 2044::4                         PrefixLength : 128
 NextHop      : FE80::E0:FCB3:3FCA:1            Preference   : 10
 Cost         : 48                              Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : Serial2/0/0                     Flags        : D

OSPFv3 Routing Table's Status : < Inactive > //如下几条OSPFv3学习的路由是inactive的,即没有放入OSPFv3的路由表,这是因为如下的路由被通告到了OSPFv3,但是由于OSPFv3的内部路由优先级为10,并不如直连路由的优先级0优先,故而为inactive
Summary Count : 3

 Destination  : 2011::1                         PrefixLength : 128
 NextHop      : ::                              Preference   : 10
 Cost         : 0                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : LoopBack0                       Flags        :  

 Destination  : 2014::                          PrefixLength : 64
 NextHop      : ::                              Preference   : 10
 Cost         : 48                              Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : Serial2/0/0                     Flags        :  

 Destination  : 2123::                          PrefixLength : 64
 NextHop      : ::                              Preference   : 10
 Cost         : 1                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        :  
tracert IPv6 2044::4 //验证数据包的通断情况,此时R2的数据报文可以正确的转发到R4的环回口
 traceroute to 2044::4  30 hops max,60 bytes packet
 1 2123::1 20 ms  10 ms  10 ms 
 2 2044::4 40 ms  10 ms  10 ms

17.3.4 OSPFv3实例ID实例

OSPFv3的报文头部增加了实例ID字段,该字段必须相同才可以建立邻居和更新路由,该字段可以用于在一个多点接入网络控制邻居关系的多样性

[R3-GigabitEthernet0/0/0]undo OSPFv3 1 area 0 //去掉R3物理接口的OSPFv3配置,其中实例部分并没显示,它为整数形式,取值范围是0~255,缺省值是0
[R3-GigabitEthernet0/0/0]OSPFv3 1 area 0 instance 1 //修改该接口的实例从默认的0变为实例1,那么此时该设备发送的OSPFv3报文的实例ID不同于R1和R2,所以邻居会消失
[R3-GigabitEthernet0/0/0]dis OSPFv3 peer //OSPFv3的邻居已经消失
[R3-GigabitEthernet0/0/0]
[R3]display OSPFv3 interface GigabitEthernet 0/0/0 //通过该命令读者可以看到实例ID
GigabitEthernet0/0/0 is up, line protocol is up
  Interface ID 0x3
  Interface MTU 1500 
  IPv6 Prefixes
    FE80::2E0:FCFF:FEE7:1F8A (Link-Local Address)
  OSPFv3 Process (1), Area 0.0.0.0, Instance ID 1 //此位置的OSPFv3实例为1
    Router ID 33.1.1.1, Network Type BROADCAST, Cost: 1
    Transmit Delay is 1 sec, State DR, Priority 1
    Designated Router (ID) 33.1.1.1
    Interface Address FE80::2E0:FCFF:FEE7:1F8A
    No backup designated router on this link
    Timer interval configured, Hello 10, Dead 40, Wait 40, Retransmit 5
       Hello due in 00:00:03
    Neighbor Count is 0, Adjacent neighbor count is 0
    Interface Event 2, Lsa Count 1, Lsa Checksum 0xf12d
    Interface Physical BandwidthHigh 0, BandwidthLow 1000000000
查看R1,我们预期R1将不会和R3建立邻居
display OSPFv3 peer 
OSPFv3 Process (1)
OSPFv3 Area (0.0.0.0)
Neighbor ID     Pri  State            Dead Time Interface            Instance ID
22.1.1.1          1  Full/Backup      00:00:40  GE0/0/0                       0
44.1.1.1          1  Full/-           00:00:37  S2/0/0                         0
读者也可以观察到最后一列中的实例ID为0。观察完毕之后请读者修改R1和R2的接口实例ID为1
[R1-GigabitEthernet0/0/0]undo  OSPFv3 1 area 0.0.0.0
[R1-GigabitEthernet0/0/0]OSPFv3 1 area 0 instance 1
#
[R2-GigabitEthernet0/0/0]undo  OSPFv3 1 area 0.0.0.0
[R2-GigabitEthernet0/0/0]OSPFv3 1 area 0 instance 1
验证OSPFv3的邻居和路由情况如下:
[R2]display OSPFv3 peer 
OSPFv3 Process (1)
OSPFv3 Area (0.0.0.0)
Neighbor ID     Pri  State            Dead Time Interface            Instance ID
11.1.1.1          1  Full/Backup      00:00:32  GE0/0/0                        1
33.1.1.1          1  Full/DR          00:00:36  GE0/0/0                        1
[R2]display IPv6 routing-table protocol ospf
Public Routing Table : OSPFv3
Summary Count : 6

OSPFv3 Routing Table's Status : < Active >
Summary Count : 4 

 Destination  : 2011::1                         PrefixLength : 128
 NextHop      : FE80::2E0:FCFF:FE51:9D1         Preference   : 10
 Cost         : 1                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

 Destination  : 2014::                          PrefixLength : 64
 NextHop      : FE80::2E0:FCFF:FE51:9D1         Preference   : 10
 Cost         : 49                              Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

 Destination  : 2033::3                         PrefixLength : 128
 NextHop      : FE80::2E0:FCFF:FEE7:1F8A        Preference   : 10
 Cost         : 1                               Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

 Destination  : 2044::4                         PrefixLength : 128
 NextHop      : FE80::2E0:FCFF:FE51:9D1         Preference   : 10
 Cost         : 49                              Protocol     : OSPFv3
 RelayNextHop : ::                              TunnelID     : 0x0
 Interface    : GigabitEthernet0/0/0            Flags        : D

OSPFv3 Routing Table's Status : < Inactive >
Summary Count : 2

 Destination  : 2022::2                         PrefixLength : 128
 NextHop      : ::                              Preference   : 10

Cost : 0 Protocol : OSPFv3
RelayNextHop : :: TunnelID : 0x0
Interface : LoopBack0 Flags :

Destination : 2123:: PrefixLength : 64
NextHop : :: Preference : 10
Cost : 1 Protocol : OSPFv3
RelayNextHop : :: TunnelID : 0x0
Interface : GigabitEthernet0/0/0 Flags

17.3.5 OSPFv3认证

OSPFv3本身没有认证(Authentication)功能。因此,OSPFv3报文头中去掉了AuType和Authentication字段。相应的,所有的OSPF区域和接口数据结构都去掉了认证相关域(field)。
OSPFv3的认证依赖于IPv6报文的认证头和IP封装安全有效载荷报头。OSPFv3通过这些IP报文头来确保路由交换的完整性和认证/保密。
OSPFv3报文利用IPv6标准的16位完整校验和防止报文数据的随机错误。该校验和覆盖了整个OSPF报文和伪IPv6头。
很不愉快的告诉读者,在本书成稿时,eNSP还不支持OSPFv3的认证配置,其配置命令格式为:
操作步骤

配置区域的认证方式
执行命令system-view,进入系统视图。
执行命令OSPFv3 [ process-id ],进入OSPFv3进程视图。
执行命令area area-id,进入OSPFv3区域视图。
执行命令authentication-mode { hmac-sha256 key-id key-id { plain plain-text | [ cipher ] cipher-text } | keychain keychain-name },配置OSPFv3区域的认证模式。
使用区域认证时,一个区域中所有的路由器在该区域下的认证模式和口令必须一致。
配置进程的认证方式
执行命令system-view,进入系统视图。
执行命令OSPFv3 [ process-id ],进入OSPFv3进程视图。
执行命令authentication-mode { hmac-sha256 key-id key-id { plain plain-text | [ cipher ] cipher-text } | keychain keychain-name },配置OSPFv3进程的认证模式。
配置接口验证方式
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number,进入接口视图。
执行命令OSPFv3 authentication-mode { hmac-sha256 key-id key-id { plain plain-text | [ cipher ] cipher-text } | keychain keychain-name } [ instance instance-id ],配置OSPFv3接口的认证模式。
接口验证方式的优先级高于区域验证方式的优先级。
除Keychain认证模式外,同一网段的接口的认证模式和口令必须相同,不同网段可以不同

17.4 小结

我们用一章来讲解了基本的IPv6知识以及两种基本的IPv6协议栈下的动态路由协议RIPng和OSPFv3。作为下一代网络技术的IPv6在现代网络中依旧处于方兴未艾的地位,但是很多大型公司(比如谷歌、亚马逊)等已经开始部署IPv6,国内的很多运营商在逐步的把IPv6商业化。IPv6在HCNA以及HCIE认证考试中是必考项。