OSPF,open shortest path first, 开放最短路径优先,
OSPF协议基于IP协议,协议号为89,紧跟EIGRP的88。
先前介绍的两款协议RIP和EIGRP同属于距离矢量型(DV型)路由协议,
OSPF则和前两款不同,属于链路状态型(LS)路由协议,更加侧重于链路状态的发送,而不单单是传递路由条目。 OSPF是当前企业现网环境中运用最广泛的一款协议!
1. Hello报文:用于建立和维护OSPF邻居关系,默认发送间隔10s (30s) 2. DBD报文:链路状态描述报文,简要描述链路状态信息 3. LSR报文:链路状态请求,用于请求链路状态的详细信息 4. LSU:链路状态更新,用于响应LSR 5. LSACK:用于对DBD和LSU的确认
OSPF通过Hello报文建立和维护邻居关系
默认情况下, 在>=1.544M的链路上,Hello包间隔10s发送一次,Dead时间为40s; 在<1.544M的链路上,30s发送一次,Dead时间为120s。
OSPF的Hello时间和Dead时间是可以进行修改的,语法:
Router(config)#interface eX/y Router(config-if)#ip ospf hello-interval x # x为要修改的Hello时间间隔,范围1-65535,单位为s。 Router(config-if)#ip ospf dead-interval y # y为要修改的Dead时间间隔,范围1-65535,单位为s。
如果确需要修改Hello时间和Dead时间,还是建议保持原有的4倍关系会较为稳妥。同时需要注意的是,链路的两端如果有一端修改了Hello时间或Dead时间,另一端不做修改,原先建立好的邻居关系会Down掉。
Down状态:OSPF进程刚刚开始时
Init状态:OSPF进程初始化状态,在此状态下,本地的OSPF路由器已经向外发送了Hello报文,等待接收对端的Hello报文
Two-way(2-way)状态:接收到了对端的Hello报文,判断是否与对端路由器继续发展邻居关系,该状态只会出现在广播网络(即E口、F口、G口链路组成的网络)中
Exstart状态:选举主从关系,决定谁先发送OSPF报文(由主先进行发送,选举的依据是Router-id,一条链路上Router-ID大的为主,先进行发送。
Exchange状态:双方依据Exstart状态选举的主从关系相互传递DBD报文。
Loading状态:双方交换链路状态信息,此过程涉及LSR、LSU和LSAck三部分报文。
Full状态:邻居建立成功。OSPF网络逐渐趋于稳定。
为什么要判断一下是否发展邻居关系?
防止在广播网络出现重复传递同一份LSA的情况。在此状态下发生的事件为DR/BDR的选举。
DR/BDR的选举
DR(Designated router):指定路由器 BDR(backup designated router):备份指定路由器
选举规则:
(1)比较优先级
优先级最高的路由器成为DR,次高的成为BDR
优先级值是基于接口的概念,且默认为1,可做修改:
Router(config)#interface eX/y Router(config-if)#ip ospf priority z # 其中z为可修改的优先级值,范围为0。0代表不参与选举,255则为最大
(2)比较Router-ID
Router-ID最高的成为DR,次高的成为BDR。
Router-ID:就是对路由器的一个标识,表现形式为点分十进制,类似于IP地址
Router-ID的选举规则:
a.看有无经过手工指定,如果有手工指定的Router-id,则**优先选择手工指定的Router-ID** b.如果没有手工指定,则看路由器是否配备环回口IP地址,如果有,则将**环回口IP地址作为Router-ID**。如果一台路由器具备**多个环回口地址**,则选举**环回口地址最大的作为OSPF的Router-ID** c.如果该路由器也未能配备环回口,则优选双up物理接口中的最大的IP地址作为OSPF的Router-ID
需要值得注意的是:
DR/BDR的选举一旦完成,决定好了DR和BDR的归属,再去调整优先级想让新的设备成为DR,则不会生效,因为OSPF是一个较为稳定的协议,如果想要让设备之间进行DR/BDR的重新选举,则需要敲入命令:
Router#clear ip ospf process Reset ALL OSPF processes? [no]:yes # 一定要敲yes或者简写为y,默认行为为no。
DR、BDR、DRothers 之间的通信过程:
DR、BDR监听224.0.0.6,DRothers向224.0.0.6发送。
发送LSA
DRothers监听224.0.0.5,DR、BDR向224.0.0.5发送,
发送LSA
OSPF的设计是为了大型网络及超大型网络来使用的,因此为了节约设备的资源,OSPF将网络划分成了一个又一个的区域,每个区域内的设备只需要掌握本区域内的详细的链路状态信息即可。
区域分为两大区域:骨干区域和非骨干区域
骨干区域:有且仅有一个,area 0 非骨干区域:除area 0以外的其它区域,范围1-4294967295
OSPF的区域是基于接口的概念,所以一台路由器可能接口会属于不同的路由器
OSPF的基本配置:
Router(config)#router ospf Process-ID # 进程号范围1-65535,需要注意的是进程号本地可以存在多个,也就是说OSPF支持多进程。 Router(config-router)#router-id x.x.x.x # 强烈推荐手工指定Router-ID的配置,方便观察邻居关系和排错等;
接下来进入OSPF的宣告环节, 来理解一下宣告的意思:宣告,就是想不想让某个接口参与OSPF进程,若参与,则该接口就会运行OSPF路由协议,定期发送hello包,建立邻居等;不宣告就不参与,就不会与对端形成OSPF邻居了。
OSPF的宣告:
OSPF的宣告方式支持三种方式
1.不精确宣告(网段宣告,不太推荐)
Router(config)#router ospf Process-ID Router(config-router)#network 192.168.1.0 0.0.0.255 area x
2.精确宣告(较为推荐)
Router(config)#router ospf Process-ID Router(config-router)#network 192.168.1.1 0.0.0.0 area x
3.接口宣告(强烈推荐)
Router(config)#interface eX/y Router(config-if)#ip ospf Process-ID area x
OSPF邻居建立的条件:
1.链路两端Hello/Dead Time必须保持一致 2.建立邻居的两个接口必须要处于同一区域中(一条链路上的两个接口必须同属于一个区域) 3.接口的掩码必须要相同 4.Router-ID必须唯一 5.接口两端的优先级不能都为0(只在广播网络中) 6.认证通过
OSPF的路由器角色:
1.DR/BDR、DRothers 2.ABR:区域边界路由器,一台OSPF路由器拥有多个区域时,称为ABR。 3.ASBR:自治系统边界路由器,一台路由器既运行了OSPF,又运行了其它路由协议。
OE1和OE2的区别:
它们代表的是外部路由1和外部路由2,它们的区别就在于是否加内部路由(度量花销)。默认是OE2就是不加内部路由,假设我的网络只有一个出口,那么使用OE1和OE2都一样;
A、如果有多个ASBR宣告一条到达同一外部AS的外部路由时候用只需要比较域外部开销,只需考虑外部开销更小就可以了,不需要考虑内部开销。所以优先选择OE2。
B、单出口(ASBR),计不计算域内开销已经没有意义,所以默认OE2。
C、如果我们只有一个出口那么OE2就能帮我们解决所有问题,如果我们有多个出口这时我们可以使用OE1,它能够让我们在做路由决策的时候变得更加精确。因此多出口,建议用OE1。
OSPF的重分发
在重分发进OSPF的时候,需要加入关键词subnets,才可同时发布子网,否则只会发布主类网络。
Router(config)#router ospf 1 Router(config-router)#redistribute eigrp 1/rip subnets
重分发进OSPF的路由默认类型均为OE2,且Metric值固定为20,无论后续传递多少台路由器,Metric值都保持不变。
如果想要改变重分发进OSPF的路由类型,可在重分发时加入关键字“metric-type 1”,即可变为OE1形式
Router(config)#router ospf 1 Router(config-router)#redistribute eigrp 1/rip subnets metric-type 1
如果重分发进OSPF的路由类型为OE1,则代表Metric值初始为20,后续可能会发生变化。
OSPF的LSA
OSPF路由器之间相互传递的信息是链路状态信息(Link-State)
每台路由器都将链路状态信息存储在链路状态信息库里(Link-State-Database,LSDB),可以通过命令 #show ip ospf databse 查看。
OSPF对这些LS划分了很多种类。
Router Link Stats:
用于描述产生该LSA的路由器的链路状态信息。运行在同一区域内的每台OSPF路由器都会产生一条一类的LSA。所以一类LSA由多少条就可以表明当前区域内存在多少条设备。
Router#show ip ospf database router # 查看一类LSA详细信息
Link-State-ID:用于区分不同的链路状态信息
Advertising Router:表明本LS是哪台OSPF路由器通告的。
Number of Links:表明该LS下的详细链路数目信息
Link Connected to:链路连接的类型
链路链接类型
一共可以有4种类型:
(1)Transit Network(传输网络):拥有OSPF邻居的网络
Link ID:DR的IP地址
Link Data:始发该LSA的路由器的接口地址
(2)Point-to-Point(点到点网络):串口组成的链路
Link ID:邻居路由器的Router-ID
Link Data:始发该LSA的路由器的接口地址
P2P类型的链路必须要两个类型来描述,必须要Stub Network补充描述。(3)Stub network link(末节网络):在OSPF进程中,但是没有OSPF邻居的链路
Link ID:网络号
Link Data:掩码
注意:环回口默认情况下掩码始终为32位。同时环回口网络类型始终为Stub Network(4)Virtual-Link(虚链路):为了解决孤立区域的解决方案
Link ID:邻居路由器的Router-ID
Link Data:从哪个接口与该邻居路由器建立虚链路
Net Link States:网络LSA
只出现于MA(多路访问)网络中,用于对一类LSA补充说明,描述当前网络中存在多少台OSPF路由器,可以根据二类LSA来确定该MA网络中路由器的数量,从而完整的绘制出整个网络的拓扑图。
Router#show ip ospf database network # 查看二类LSA详细信息
Link State ID:表明DR的IP地址
Advertising Router:通告的路由器的Router-ID
Attached Router:本MA网络内路由器的Router-ID
Summary Net Link States:汇总LSA
三类LSA不传递LS,传递的而是其他区域的路由条目。
Router#show ip ospf database summary # 查看三类LSA
Link State ID:网络号
Network Mask:网络号的掩码
Advertising Router:下一跳路由器的Router-ID
通过三类LSA收到的路由代码点都是OIA域间路由
Summary ASB Link States:
用于通告OSPF网络中ASBR的位置,此LSA由ABR产生。
由于五类LSA在传递重分发进OSPF的路由的时候字ADv Router字段值不变,同时非ASBR区域不知道ASBR的具体位置在哪,因此四类LSA需要作为五类LSA的一个补充说明。
Router#show ip ospf database asbr-summary
Link State ID:ASBR路由器的Router-ID
Advertising Router:通告该LSA的路由器的Router-ID
Type-5 AS External Link States:
用于传递重分发进OSPF的路由,由ASBR产生。
NSSA区域专用的LSA,与五类LSA相同。
OSPF的Metric值
的值所有路由入接口值的累加
开销当前链路的带宽
其中,分母100M是可以进行修改的
Router(config)#router ospf 1 Router(config-router)# auto-cost reference-bandwidth x # 单位Mbps
常见的链路类型由E口链路(以太网链路),F口链路(快速以太网链路),G口链路(吉比特以太网链路),其链路带宽值及OSPF接口cost值计算如下表
接口名称 | SERIAL | ETHERNET | FASTETHERNET | GIGABITETHERNET |
---|---|---|---|---|
Bandwidth | 1.544M(S) | 10M(E) | 100M(F) | 1000M(G) |
COST | 64 | 10 | 1 | 1 |
OSPF在设计时因为设计缺陷或将来引入更多新的设备,导致非骨干区域的ABR没有直接连接到骨干区域中,而是连接到了其它的非骨干区域,这个区域就叫做孤立区域。
虚链路是OSPF自带的解决孤立区域的方法,创建好的虚链路自动属于区域0,从而可以将之前被孤立的区域扩展到骨干区域中去。
虚链路的部署:
第一步,确认部署位置,如上图所示,Area 2 被 Area 1孤立。
在该区域的两台ABR上(R2和R3,其中必须是一台设备可以连接到骨干区域,另一台设备连接到孤立区域)
第二步,部署虚链路
R2(config)#router ospf 1 R2(config-router)#area 1 virtual-link 3.3.3.3 # 对端路由器的Router-id R2建立虚链路的邻居是R3 R3(config)#router ospf 1 R3(config-router)#area 1 virtual-link 2.2.2.2 # 对端路由器的Router-id R3建立虚链路的邻居是R2
思路一致,在R2和R3之间建立隧道,在这个隧道中传递OSPF的信息。
R2: R2(config)#int tun 0 R2(config-if)#ip add 172.16.0.1 255.255.255.0 R2(config-if)#tunnel source 23.1.1.2 R2(config-if)#tunnel destination 23.1.1.3 R2(config-if)#ip ospf 1 area 0 # 要将隧道接口宣告进区域0 R3: R3(config)#int tun 0 R3(config)#ip add 172.16.0.2 255.255.255.0 R3(config)#tunnel source 23.1.1.3 R3(config)#tunnel destination 23.1.1.2 R3(config)#ip ospf 1 area 0
可以不必执着与同一进程的OSPF,不如换一种路由协议?或者OSPF换一个进程号?
R3上做双向重分发,将OSPF进程1的路由重分发进OSPF进程2中,OSPF进程2的路由重分发进OSPF进程1中
R3: R3(config)#router ospf 1 R3(config-router)#redisribute ospf 2 subnets (metric-type 1/2) R3: R3(config)#router ospf 2 R3(config-router)#redisribute ospf 1 subnets (metric-type 1/2)
OSPF既支持明文认证,也支持密文认证。
分为接口认证、区域认证和基于钥匙串的认证
接口认证:
1.明文认证
Router(config)#int e0/0 Router(config-if)# ip ospf authentication # 启用链路接口明文认证 Router(config-if)# ip ospf authentication-key cisco # 定义明文密钥
2.密文认证
Router(config)#int e0/0 Router(config-if)# ip ospf authentication message-digest # 启用链路接口密文认证 Router(config-if)# ip ospf message-digest-key 1 md5 cisco # 定义密文密钥
基于key-chain的认证:
Router(config)#key chain A Router(config-keychain)#key 1 Router(config-keychain-key)#key-string cisco # 定义密钥 Router(config-keychain-key)#cryptographic-algorithm md5 #定义加密算法,如md5,或hmac384等 Router(config)#int e0/0 Router(config-if)#ip ospf authentication key-chain A # 接口下调用该钥匙串
区域认证:
需要注意的是,区域认证需要结合链路认证来使用的,同时,如果对一个区域内的某台设备启用了密文认证,则该区域内的所有设备都需要启动区域认证。区域认证又分为明文认证和密文认证。
1.区域明文认证的配置:
Router(config)# router ospf 1 Router(config-router)# area x authentication # 对区域x开启明文认证 Router(config)#interface eX/y Router(config-if)# ip ospf authentication-key cisco # 区域认证需要结合链路认证使用
2.区域密文认证的配置:
Router(config)# router ospf 1 Router(config-router)# area x authentication message-digest # 对区域x开启密文认证 Router(config)#interface eX/y Router(config-if)# ip ospf message-digest-key 1 md5 cisco # 区域认证需要结合链路认证使用。
虚链路认证:
虚链路也是可以启用认证的,同样分为明文认证和密文认证
明文配置:
Router(config)#router ospf 1 Router(config-router)#area 1 virtual-link 3.3.3.3 authentication # 启用虚链路的明文认证 Router(config-router)#area 1 virtual-link 3.3.3.3 authentication-key cisco # 配置明文密钥
密文配置:
Router(config)#router ospf 1
Router(config-router)#area 1 virtual-link 3.3.3.3 authentication message-digest # 启用虚链路的密文认证
Router(config-router)#area 1 virtual-link 3.3.3.3 message-digest-key 1 md5 cisco # 配置密文密钥
Broadcast:广播,以太网。支持广播和组播。需要DR Hello包间隔时间10s,通过组播发现邻居 Point-to-Point:点到点,串行链路,支持广播和组播。不需要DR,Hello包间隔时间10s,通过组播发现邻居 NBMA:非广播多路访问,帧中继。不支持广播和组播。需要DR Hello包间隔时间30s,能依靠单播发现邻居 Point-to-multi-point:点到多点,帧中继。支持广播和组播。不需要DR Hello包间隔时间30s,通过组播发现邻居
网络类型:
广播和组播 | 邻居发现 | DR/BDR | HELLO时间 | |
---|---|---|---|---|
Broadcast | 支持 | 组播 | 需要 | 10 |
Point-To-Point | 支持 | 组播 | 不需要 | 10 |
NBMA | 不支持 | 单播 | 需要 | 30 |
P2MP | 支持 | 组播 | 不需要 | 30 |
不同网络类型是否可以建立邻居和传递路由:
建立邻居 | 传递路由 | |
---|---|---|
Broadcast — P2P | √ | × |
Broadcast - NBMA | × | × |
Broadcast - P2MP | × | × |
P2P — NBMA | × | × |
P2P — P2MP | × | × |
NBMA -P2MP | × | × |
OSPF将末节区域分为4种类型:
(1)stub:末节区域
当一个区域被配置为末节区域后,域外路由会消失,取而代之的是一条默认路由。
连接到末节区域的ABR会将四五类LSA过滤,同时,自动生成一条默认路由下发给该末节区域。
需要注意的是,如果将某一个区域内的一台设备置为Stub路由器,则需要将该区域内的其它设备同时置为Stub路由器,否则OSPF的邻居状态机会卡在Down状态,无法正常建立邻居关系。同时,有两个禁忌:
a.Area 0不能被配置为末节区域 b.存在ASBR的区域不能被配置为末节区域
配置语法:
Router(config)# router ospf process-id Router(config-router)# area x stub # 将区域x置为末节区域
(2)Totally Sutb:完全末节区域
在该区域中,ABR除了会将四五类LSA(域外路由)过滤之外,还会将三类LSA(域间路由)也过滤掉。
配置语法:
Router(config)# router ospf process-id Router(config-router)# area x stub no-summary # 将区域x置为完全末节区域
(3)NSSA:Not-So-Stubby-Area:非纯末节区域
由于传统的末节区域会将四五类LSA进行过滤,因此在重分发路由时,可以选用第二种解决方案:就是NSSA区域,NSSA区域依旧会过滤掉四五类LSA,只不过属于NSSA区域的ASBR会将域外路由(重分发进OSPF)的路由放入Type7-LSA中在NSSA区域中传递。
当ABR收到了七类LSA后,同时ABR需要将该七类LSA发向正常区域时,会将该七类LSA重新变回五类LSA,在正常区域中传递。
配置语法:
Router(config)# router ospf process-id Router(config-router)# area x nssa # 将区域x置为非纯末节区域
但会带来一个问题,NSSA区域的路由器会断网,原因是连接到NSSA区域的ABR不会自动下发默认,下发默认需要手动配置:
Router(config)# router ospf process-id Router(config-router)# area 1 nssa default-information-originate # 加上下发默认参数
(4)Totally NSSA:完全非纯末节区域
Totally NSSA区域会将三四五类LSA都进行过滤,同时由ABR自动下放默认路由
配置语法:
Router(config)# router ospf process-id Router(config-router)# area 1 nssa no-summary # 将区域x置为完全非纯末节区域
在OSPF中,如果某个接口被置为被动接口,则不会从该被动接口接收或者发送Hello报文。也就意味着邻居起不来,路由也就无法传递。
配置语法:
Router(config)# router ospf process-id Router(config-router)# passive-interface e x/y # 将某一个接口设置为被动接口 Router(config-router)# passive-interface default # 将所有运行OSPF的接口都设置为被动接口
OSPF的下发默认
OSPF只支持自带的下放默认:
Router(config)# router ospf process-id Router(config-router)# default-information orginate # 将本地拥有的默认路由下发至OSPF网络中(前提是本地一定得有默认路由) Router(config-router)#default-information originate always # 无论本地有没有默认路由,都会下放
OSPF的重分发只支持和别的动态路由协议之间重分发,不支持重分发静态。