-
OSPF 协议概述
随着企业内部网络规模的扩大,网段的数量越来越多,所以想要实现不同网段之间互通,
就必须得依靠大量的路由设备以及路由条目。
想让路由设备获得路由条目的方法,有很多,对应着不同类型的路由条目:
直连路由
非直连路由
-静态
-动态
-IGP(internal gateway protocol),内部网关路由协议:同一个公司内使用的路由协议 *RIP-只能适用于小型规模的网络(网络直径不能超过16个路由器) *EIGRP-增强型的IGRP 协议,可以支持更大的网络规模(网络直径最大可以做到255个,私有) *ISIS-公有标准,免费的。理论上支持无限规模的网络,但是支持的 CLNP 路由 ***OSPF-公有标准,免费的。理论上支持无限规模的网络。但是支持的是 IP 路由** -EGP(external gateway protocol),外部网关路由协议:不同公司之间使用的路由协议 *BGP(border gateway protocol),边界网关协议
OSPF,称之为 open shortest path first ,开放式 最短 路径 优先 协议;
该协议的主要作用是:在公司内部的多个路由设备之间运行 OSPF 协议,动态的传递彼此的路由条目,目的就是为了让网络中的每个路由设备,都拥有整个网络中的所有的网段信息。
该协议在转发数据包的时候,都是包含在IP头部后面的,协议号是 89,目标地址是 224.0.0.5 /224.0.0.6
OSPF的工作过程,仅仅分为3步:
- 建立邻居表
- 同步数据库
- 计算路由表
OSPF的报文类型:
- Hello,用于邻居表的建立、维护、拆除
- DD(dbd),database description ,数据库描述报文
- LSR(link state request) ,链路状态请求报文
- LSU(link state update ),链路状态更新报文
- LSAck(Link state acknowledgement),链路状态确认报文
OSPF基本配置命令:
ospf {进程号} -> 启用 OSPF 协议,进程号如果不指定,默认是1 ;(1-65535)
area {区域号} -> 对于 OSPF 协议,区域必须有;如果仅仅需要1个区域,这个区域就得是区域 0
network {网段} {反掩码} -> 指的是将后面这个网段,宣告进入到OSPF协议,然后传递给邻居路由器
但是,network 命令有很大的局限性,该命令后面跟的网段,只能是“直连网段”。
如果想要将本地路由表中的哪些非直连的网段(静态路由),通过 OSPF 协议宣告出去的,
那就得使用另外一个宣告方式:import-route {路由类型}
注意:我们使用 import-route 命令的时候,是不需要进入到某个区域中的。
route {路由类型}
ospf 进程号的作用:在同一个路由器上,区分不同的 OSFP 协议;不同的路由器,进程号可以不同,也可以相同
区域号:用于在 OSPF 网络中,将网络划分成2个层次:骨干区域和非骨干区域
所谓的骨干区域,就是 0 区域 ;
所谓的非骨干区域,就是 非0 区域 ;
-普通区域,要外部路由;
-特殊区域,不要外部路由;[**stub / totally stub** / nssa / totally nssa]
当网络中存在多个区域的时候,区域之间的互联原则是:所有的非骨干区域必须和骨干区域,直接相连
-
案例:OSPF 单区域配置
-
拓扑
-
需求
- 如图配置每个设备的IP地址
- 网络部署 OSPF 单区域,实现不通网段之间的互通
- 修改每个设备的名字为 x.x.x.x (X为每个设备的编号)
-
配置
-
PC1:
192.168.1.1
255.255.255.0
192.168.1.254
PC2:
192.168.2.1
255.255.255.0
192.168.2.254
R1:
undo terminal monitor
system-view
sysname R1
interface gi0/0/2
ip address 192.168.1.254 24
quit
interface gi0/0/0
ip address 192.168.12.1 24
quit
ospf 1 router-id 1.1.1.1 -> 启用 OSPF 进程1,设置名字为 1.1.1.1
area 0 -> 进入到 OSPF 区域 0
network 192.168.1.0 0.0.0.255
network 192.168.12.0 0.0.0.255
quit
quit
-----------------------------------------------------
R2:
undo terminal monitor
system-view
sysname R2
interface gi0/0/0
ip address 192.168.23.2 24
quit
interface gi0/0/1
ip address 192.168.12.2 24
quit
ospf 1 router-id 2.2.2.2 -> 启用 OSPF 进程1,设置名字为 2.2.2.2
area 0 -> 进入到 OSPF 区域 0
network 192.168.23.0 0.0.0.255
network 192.168.12.0 0.0.0.255
quit
quit
-----------------------------------------------------
R3:
undo terminal monitor
system-view
sysname R3
interface gi0/0/2
ip address 192.168.2.254 24
quit
interface gi0/0/1
ip address 192.168.23.3 24
quit
ospf 3 router-id 3.3.3.3 -> 启用 OSPF 进程3,设置名字为 3.3.3.3
area 0 -> 进入到 OSPF 区域 0
network 192.168.2.0 0.0.0.255
network 192.168.23.0 0.0.0.255
quit
quit
-------------------------------------------------------------
查看 OSPF 邻居表:
<R2>display ospf peer brief
OSPF Process 1 with Router ID 2.2.2.2
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/1 1.1.1.1 Full
0.0.0.0 GigabitEthernet0/0/0 3.3.3.3 Full
----------------------------------------------------------------------------
-
案例:OSPF多区域配置
-
拓扑
-
需求
- 如图配置每个设备的IP地址
- 将R1和R2设置为区域12
- 将R5和R6设置为区域56
- 将R2\R3\R4\R5设置为区域0
- 实现不同区域之间的PC互通
-
配置
-
PC1:
192.168.1.1
255.255.255.0
192.168.1.254
PC2:
192.168.2.1
255.255.255.0
192.168.2.254
-------------------------------
R1:
undo terminal monitor
system-view
sysname R1
interface gi0/0/2
ip address 192.168.1.254 24
quit
interface gi0/0/0
ip address 192.168.12.1 24
quit
ospf 1 router-id 1.1.1.1
area 12
network 192.168.1.0 0.0.0.255
network 192.168.12.0 0.0.0.255
quit
quit
---------------------------------
R2:
undo terminal monitor
system-view
sysname R2
interface gi0/0/1
ip address 192.168.12.2 24
quit
interface gi0/0/0
ip address 192.168.23.2 24
quit
ospf 1 router-id 2.2.2.2
area 12
network 192.168.12.0 0.0.0.255
quit
area 0
network 192.168.23.0 0.0.0.255
quit
quit
----------------------------
R3:
undo terminal monitor
system-view
sysname R3
interface gi0/0/1
ip address 192.168.23.3 24
quit
interface gi0/0/0
ip add 192.168.34.3 24
quit
ospf 1 router-id 3.3.3.3
area 0
network 192.168.23.0 0.0.0.255
network 192.168.34.0 0.0.0.255
quit
quit
---------------------------------
R4:
undo terminal monitor
system-view
sysname R4
interface gi0/0/0
ip address 192.168.45.4 24
quit
interface gi0/0/1
ip add 192.168.34.4 24
quit
ospf 1 router-id 4.4.4.4
area 0
network 192.168.45.0 0.0.0.255
network 192.168.34.0 0.0.0.255
quit
quit
-------------------------------
R5:
undo terminal monitor
system-view
sysname R5
interface gi0/0/1
ip address 192.168.45.5 24
quit
interface gi0/0/0
ip add 192.168.56.5 24
quit
ospf 1 router-id 5.5.5.5
area 0
network 192.168.45.0 0.0.0.255
quit
area 56
network 192.168.56.0 0.0.0.255
quit
quit
---------------------------
R6:
undo terminal monitor
system-view
sysname R6
interface gi0/0/1
ip address 192.168.56.6 24
quit
interface gi0/0/2
ip add 192.168.2.254 24
quit
ospf 1 router-id 6.6.6.6
area 56
network 192.168.2.0 0.0.0.255
network 192.168.56.0 0.0.0.255
quit
quit
- 总结
- 当网络中存在多个区域的时候,路由器的角色也就不同了:
- 骨干路由:一个路由器的所有接口都属于骨干区域;
- 非骨干路由器:一个路由器的所有接口都属于非骨干区域;
- 区域边界路由(ABR):一个路由同时连接着骨干区域和非骨干区域;为的是:实现不同区域之间的互通
- 自治系统边界路由器:拥有产生外部路由能力的 OSPF 路由器。人话:凡是输入了命令 imnport-route {类型} 的路由器,都叫做 OSPF 的 自制系统边界路由器(ASBR)
在上述的案例中,我们想让公司之间的 PC1/2/3 互通,但是公司之间不允许运营 OSPF 协议;
所以我们在 R6 上配置了一个去往 PC3的静态路由,下一跳IP地址是 R6-R7之间的链路接口。
同时,我们在 R6 上将该静态路由“导入”进 OSPF 协议,传遍了整个企业内网的所有路由器。
此时,PC1/2/3 能够互通了。
但是,R6-R7之间的链路,是不稳定的。
因为,R6-R7之间的链路的稳定性,不是由同一个公司来控制的。
所以,我们认定这种“不是由一个公司管理的线路”是不稳定的线路。
那么,使用这个线路的路由,也是属于不稳定的路由。
同时,这个路由还偏偏使用了import-route 的方式,引入到了企业内网所有的设备上,
所以,如果这个路由不稳定了,就会导致企业内网的所有路由器的路由表都不稳定,
总是频繁的计算路由条目,浪费设备的系统资源。
所以,我们为了保护企业内网某些重要的区域,
希望这些区域,不要受到这些不稳定的外部路由的影响,
我们就可以将这些区域配置为 特殊区域
- [ ] 所谓的特殊区域,指的是:不要外部路由的区域
- [ ] 具体类型分为:stub 区域 、totally stub 区域 、 nssa 区域 、totally nssa区域
特殊区域之stub区域
stub的特点是:不要外部路由。
但是,如果该区域的路由器上了外部路由,那当外部路由正常的时候,
该区域的设备如何与外部路由互通
此时,该 stub 区域的 ABR 会自动的产生1个默认路由,发送到该区域的所有路由器。
配置方法:在该区域的所有路由器上,都使用下面特定的命令:
ospf 1
area (区域号)
stub → 将上面指定的区域,配置为特殊区域;
-
案例:OSPF特殊区域之Stub区域
-
拓扑
-
需求
- 如图配置每个设备的IP地址
- 将R1和R2设置为区域12
- 将R5和R6设置为区域56
- 将R2\R3\R4\R5设置为区域0
- R6和R7之间通过静态路由的方式互通
- R6-R7之间的链路不稳定,尽量减少对区域12的影响
-
配置
-
PC1:
192.168.1.1
255.255.255.0
192.168.1.254
PC2:
192.168.2.1
255.255.255.0
192.168.2.254
-------------------------------
R1:
undo terminal monitor
system-view
sysname R1
interface gi0/0/2
ip address 192.168.1.254 24
quit
interface gi0/0/0
ip address 192.168.12.1 24
quit
ospf 1 router-id 1.1.1.1
area 12
network 192.168.1.0 0.0.0.255
network 192.168.12.0 0.0.0.255
quit
quit
---------------------------------
R2:
undo terminal monitor
system-view
sysname R2
interface gi0/0/1
ip address 192.168.12.2 24
quit
interface gi0/0/0
ip address 192.168.23.2 24
quit
ospf 1 router-id 2.2.2.2
area 12
network 192.168.12.0 0.0.0.255
quit
area 0
network 192.168.23.0 0.0.0.255
quit
quit
----------------------------
R3:
undo terminal monitor
system-view
sysname R3
interface gi0/0/1
ip address 192.168.23.3 24
quit
interface gi0/0/0
ip add 192.168.34.3 24
quit
ospf 1 router-id 3.3.3.3
area 0
network 192.168.23.0 0.0.0.255
network 192.168.34.0 0.0.0.255
quit
quit
---------------------------------
R4:
undo terminal monitor
system-view
sysname R4
interface gi0/0/0
ip address 192.168.45.4 24
quit
interface gi0/0/1
ip add 192.168.34.4 24
quit
ospf 1 router-id 4.4.4.4
area 0
network 192.168.45.0 0.0.0.255
network 192.168.34.0 0.0.0.255
quit
quit
-------------------------------
R5:
undo terminal monitor
system-view
sysname R5
interface gi0/0/1
ip address 192.168.45.5 24
quit
interface gi0/0/0
ip add 192.168.56.5 24
quit
ospf 1 router-id 5.5.5.5
area 0
network 192.168.45.0 0.0.0.255
quit
area 56
network 192.168.56.0 0.0.0.255
quit
quit
---------------------------
R6:
undo terminal monitor
system-view
sysname R6
interface gi0/0/1
ip address 192.168.56.6 24
quit
interface gi0/0/2
ip add 192.168.2.254 24
quit
ospf 1 router-id 6.6.6.6
area 56
network 192.168.2.0 0.0.0.255
network 192.168.56.0 0.0.0.255
quit
quit
------------------------------------------------------------------
@为了实现 R6 和 PC3 之间的互通
R6:
interface gi0/0/0
ip address 192.168.67.6 24
quit
ip route-static 1921.68.3.0 24 192.168.67.7
R7:
undo terminal monitor
system-view
sysname R7
interface gi0/0/1
ip address 192.168.67.7 24
quit
interface gi0/0/0
ip address 192.168.3.254 24
quit
ip route-static 192.168.2.0 24 192.168.67.6
此时,PC2和PC3就互通了。
但是,PC1 和 PC3 无法互通。
因为,PC1的网关设备 R1 上没有去往PC3的路由。
因为,R6没有将去往PC3的路由进行宣告
同时,在 OSPF 协议中,想要宣告静态路由的话,只能使用 import-route 命令,
因为,network 命令无法宣告非直连的网段路由,非常有局限性。
命令如下:
R6:
ospf 1
import-route static
此时,我们在 R1 上就可以看到 PC3的路由了,并且类型是 O_ASE ,即 OSPF 的外部路由。
但是,PC1依然无法与PC3互通,因为:PC3的网关设备 R7 上没有返回到 PC1 的路由,
所以,在R7上添加一个去往PC1的路由:
ip route-static 192.168.1.0 24 192.168.67.6
此时,PC1和PC3也可以互通了。
----------------------------------------------------------------------
但是,如果R6-R7之间的链路非常不稳定的话,就会导致 R6 产生的 OSPF 外部路由在整个
OSPF网络的各个路由器上,不断的添加和删除,影响每个路由器的系统资源的使用。
所以,我们为了保护区域 12,我们可以:确保区域12的路由器无法接收到这些不稳定的OSPF外部路由
就可以了。
所以,我们需要将区域 12 配置为特殊区域。
配置原则是:在该区域的所有路由器上都配置下面的命令:
R1/R2:
ospf 1
area 12
stub
此时,在 R1 上查看 OSPF 路由表,就不会存在任何的 OSPF 外部路由条目了:
display ip routing-table protocol ospf -> 看不到 O_ASE 的路由了。
- 总结
- 虽然 stub 区域不受到外部链路/路由的影响,但是会受到其他的区域的不稳定的链路的影响
- 为了解决这个问题,我们可以继续让该stub 区域,不收到其他区域的链路。想要实现这个目的,我们要首先的是:该 stub 区域当年的那些区域之间的路由,是谁发给这个区域的。
- 是 stub 区域的 ABR ,为该 stub 转发了其他区域的路由。
- 如果不想让 stub 区域接收其他区域的路由条目,就可以直接在 stub 区域的 ABR 上配置:
- 命令如下:(案例中的 R2)→这种 stub 区域,叫做 totally stub 区域
R2:
ospf 1
area 12
stub no-summary -> 即 R2不向区域 12 下发外部路由,也不下发区域之间的路由;
-
案例:OSPF特殊区域之 NSSA 区域
-
拓扑
-
需求
- 如图配置设备的接口IP地址
- 如图配置OSPF的区域,每个设备的router-id 是 x.x.x.x (X 是路由器的编号)
- 实现企业内网的所有设备,都可以访问Server1
-
配置
-
R1:
undo terminal monitor
system-view
sysname R1
interface gi0/0/0
ip address 192.168.12.1 24
quit
ospf 1 router-id 1.1.1.1
area 123
network 192.168.12.0 0.0.0.255
quit
quit
R2:
undo terminal monitor
system-view
sysname R2
interface gi0/0/1
ip address 192.168.12.2 24
quit
interface gi0/0/0
ip address 192.168.23.2 24
quit
ospf 1 router-id 2.2.2.2
area 123
network 192.168.12.0 0.0.0.255
network 192.168.23.0 0.0.0.255
quit
quit
R3:
undo terminal monitor
system-view
sysname R3
interface gi0/0/0
ip address 192.168.34.3 24
quit
interface gi0/0/1
ip address 192.168.23.3 24
quit
ospf 1 router-id 3.3.3.3
area 123
network 192.168.23.0 0.0.0.255
quit
area 0
network 192.168.34.0 0.0.0.255
quit
quit
R4:
undo terminal monitor
system-view
sysname R4
interface gi0/0/1
ip address 192.168.34.4 24
quit
interface gi0/0/0 // 连接外网的接口,使用的是公网IP地址
ip address 100.1.1.4 24
quit
ospf 1 router-id 4.4.4.4
area 0
network 192.168.34.0 0.0.0.255
quit
quit
R5:
undo terminal monitor
system-view
sysname R5
interface gi0/0/1
ip address 100.1.1.5 24
quit
interface gi0/0/2
ip address 200.1.1.254 24
quit
Server1:
200.1.1.1
255.255.255.0
200.1.1.254
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为了能够实现访问外网,所以在 R4 上配置默认路由:
ip route-static 0.0.0.0 0 100.1.1.5
为了能够让出去的数据包,顺利的返回到企业内网,
所以我们需要在 R4 连接外网的接口上配置 nat(EasyIP):
acl 2000
rule 10 permit source any
quit
interface gi0/0/0
nat outbound 2000
quit
但是,此时企业内网的其他路由器是没办法访问内网的,
因为,其他路由器上没有访问外网的路由条目,
所以,我们需要在 R4上通过OSPF协议传输默认路由,
在 OSPF 协议中,产生默认路由的方法是:
R4:
ospf 1
default-route-advertise
quit
此时,R1/R2/R3上,就可以看到一个 OSPF 的默认路由。
---------------------------------------------------------------------
**现在的企业,要求 区域 123 ,不要受到外部链路的影响。
所以,我们可以将区域 123 设置为 stub 区域,防止外部链路对区域123的影响。
命令:
R1/R2/R3:
ospf 1
area 123
stub
此时,区域123的R1和R2的路由表中,就没有 O_ASE 的 OSPF 默认路由;
变成了 OSPF 类型的默认路由,该默认路由,是通过 Stub 区域的 ABR 自动产生的!**
-------------------------------------------------------------------------
突然,现在因为业务扩展,我们的公司,需要和其他公司进行合作,实现某些业务之间的互通。
但是,因为网络结构的原因,此时的外联公司,只能连接到目前的区域 123 的设备 R1 上。
此时,为了实现外联公司与本公司的业务服务器(200.1.1.1)的互通,
需要:在外联公司的设备上,添加去往服务器的路由条目,;
在R1上添加返回到外联公司的路由(去往 PC1)
但是:即使数据包从PC1经过企业内网转发到了外网的 Server1
可是数据包返回的时候,到了R4上,就没有去往PC1的路由。
所以,数据包是无法返回到PC1的。
因为,R1虽然有去往PC1的路由,但是没有办法将PC1的路由导入进入到OSPF,传递给R4
因为,R1所在的区域123,是 stub 区域,不允许该区域中的路由器,引入外部路由。
所以,我们可以将区域 123 配置为 nssa 区域,即not so stub area ,不那么stub的区域
人话:其他区域发送过来的外部路由,该区域不要;但是自己本区域的设备引入的外部路由,要的。
配置方法,极为简单:在该区域的所有路由器上,配置相同的命令:
R1/R2/R3:
ospf 1
area 123
undo stub -> 删除之前的 stub 区域配置
nssa -> 将目前的区域配置为 nssa
然后,我们在R1,导入去往PC1的静态路由:
R1:
ospf 1
import-route static
然后,
PC1就可以和Server1互通了。
- 总结
- NSSA区域,不接收其他区域发送过来的外部路由;但是自己本区域的设备,可以产生外部路由
- 普通区域的外部路由,类型是:O_ASE;NSSA 区域的默认路由,类型是:O_NSSA
- NSSA区域的ABR,和 Stub 区域的 ABR 的类似的,都会自动的产生1个默认路由- O_NSSA
- 虽然,NSSA 区域不接收其他区域传递过来的外部路由,不受到外部链路的影响。但是依然会受到其他区域内的链路影响。
- 为了让 NSSA 区域,不受到其他区域的链路的影响,我们需要在 NSSA 区域的 ABR 上,禁止向 NSSA 区域发送其他区域的路由,即 NSSA 区域内不但没有了外部路由,也没有了其他区域之间的路由,所以,这种 NSSA 区域,称之为 totally NSSA 。
- 配置命令:仅仅需要在NSSA 区域的 ABR 上配置: area 123 → nssa no-summary
- 在 totally nssa 中,ABR 依然会自动产生默认路由,但是此时的路由类型,是 OSPF/O_NSSA 。但是最终能够进入到 OSPF 路由表的默认路由是:OSPF 类型的,即 OSPF 的内部路由
- 因为 OSPF 类型属于 OSPF的内部路由,优先级是10;O_NSSA 属于 OSPF 的外部路由,优先级是150。所以,优先级数值小的,优先进入到 OSPF 路由表。