CCIE 学习笔记 OSPF Editor:Edison E-mail:shilianwang@sohu.com QQ:21478604 如有疏漏之处请不吝赐教如有转载请注明作者及出处 OSPF 用于大型复杂网络, 直接运行于 IP 之上, 协议号 89 如同 TCP 直接运行于 IP 之上并且使用协议号 6 一样 OSPF 没有任何的传输协议 ( 例如 TCP) 来提供可靠性, 但其自身有一个传输的可靠机制 OSPF 是无类的, 支持 VLSM 和非连续网络 使用多播地址 224.0.0.5 和 224.0.0.6 来发送 hello 包和路由更新, 前者代表所有运行 OSPF 的路由器, 后者代表 DR/BDR 支持两种认证方式 : 明文和 MD5 OSPF 路由器通过 LSA 来交换链路状态信息, 每一个路由器通过 Dijkstra 算法来构建一个最短路径树 (SPT) 要掌握 OSPF, 需要理解以下几大快内容 : 一. 邻居和邻接关系在发送任何 LSA 通告之前,OSPF 路由器必须首先发现他们的邻居路由器并建立邻接关系, 同时维护一张邻居表, 通过 sh ip os nei 查看 每一个路由器都要有一个 router-id, 以保持稳定性 可以通过以下途径配置 : 使用 router-id 手工配置 如果没有配置 router-id, 则选择最大的 lo 口 如果没有 lo 口, 则选择物理接口上的最大的 IP 1. Hello 协议作用 : 发现邻居路由器 在成为邻居之前, 通过 hello 通告两台路由器必须相互认可的几个参数 担当 keepalive 的角色 确保了邻居路由器之间的双向通信 用来在一个广播或 NBMA 环境中选取 DR/BDR 间隔 : 广播型 10 秒 ; 非广播型 30 秒 ; 可以通过 ip os hello-interval 修改 ; 如果在 4 倍的 hello time 里仍没有收到对端的 hello 包, 则 down 掉与邻居之间的关系, 可以通过 ip os dead-interval 修改 建立邻居关系必须满足的几个条件 :area-id,authen-type,hello-interval,dead-interval, 掩码信息,area 类型 如果收到了一个 hello 包满足以上条件, 并且在这个 hello 包里发现了自己的 router-id, 则该路由器认为进入 two-way 状态 ( 邻居建立成功 ) 2. 网络类型 OSPF 定义了 5 种网络类型 : (1).point-to-point (2).broadcast (3).NBMA (4).point-to-multipoint (5).virtual-links 点到点网络 : 点到点敛路上的有效邻居总是可以形成邻接关系 使用组播地址 224.0.0.5, 不选取 DR/BDR
广播型网络 : 比如以太网, 令牌环,FDDI 需要选举 DR/BDR, 其他路由器只需与 DR/BDR 建立邻居关系,224.0.0.5 代表 AllSPFRouters, 相应的 MAC 地址为 0100.5E00.0005;224.0.0.6 代表 DR/BDR, 相应的 MAC 地址为 0100.5E00.0006 NBMA 网络 : 比如 X.25, 帧中继,ATM 需要选举 DR/BDR, 并且需要手动指邻居 虚链路 : 没有编号的一种的点到点网络的特殊配置, 单播发送数据包 3. DR/BDR 为了避免网络复杂,LSA 过多, 邻居关系过多而产生了一个概念 DR: 描述这个多路访问网络和 OSPF 区域内其余与其相连的路由器 管理这个多路访问网络上的泛洪扩散过程注意 :DR 是基于接口的概念, 而不是整个路由器的概念 BDR: 网络中的其他路由器既要与 DR 形成邻接关系, 也要与 BDR 形成邻接关系 当 DR 失效的情况下,BDR 将成为新的 DR 具有最高优先级的成为 DR, 优先级相同情况下, 具有最高路由器 ID 的成为 DR 可以通过接口命令修改优先级 :-if#ip os pri 4. OSPF 接口通过 sh ip os int 可以查看接口相关的 OSPF 协议的具体信息 其中 cost 表示从该接口发送出去的数据包的出站接口代价, 范围在 1~65535 之间, 缺省代价是 10 8/BW, 其中 BW 是指接口带宽, ip os cost 可以基于接口的修改代价 ;auto-cost reference-bandwidth 可以更改缺省的参考带宽 Ip os transmit-delay 可以修改 LSA 从接口发送出去后经历的时间 ;ip os transmit-interval 可以更改重传数据包要等待的时间 5. OSPF 邻居成功建立邻接关系, 需要四个阶段 : 邻居路由器发现阶段 ; 双向通信阶段 ; 数据库同步阶段 ; 完全邻接阶段 ; 在 NBMA 网络中, 路由器每经过 pollinterval 的时间给它邻居状态为 down 的邻居发送一次 hello 数据包, 但是在其他的各种网络中, 路由器都是每经过 hellointerval 时间给邻居发送一次 hello 数据包 NBMA 网络中 pollinterval 的缺省值是 120 秒 PollInterval 用于 NBMA 网络, 因为在 NBMA 网络上, 邻居路由器可能无法自动地被本地路由器发现, 因此, 如果邻居状态是 down 的, 那么路由器就每经过 pollinterval 的时间发送一个 hello 给邻居 邻居状态机 : Down attempt( 仅存在于 NBMA) init 2-way exstart exchange loading full 6.Flooding 泛洪扩散过程就是将链路状态变化信息通过 LSA 发送到整个网络中去, 确保每一个路由器的数据库都得到更新, 最终保持所有路由器的数据库的统一性, 也就是收敛 泛洪用到两种数据包 : 链路状态更新数据包 (LSU, 类型 4) 链路状态确认数据包 (LSA, 类型 5) 注意 : 这两种数据包只在具有邻居关系的路由器之间传递 泛洪必须要有可靠性, 要不收敛从何谈起, 所以每一个接收到更新的路由器都要对其进行确认 而确认又分为显示确认和隐式确认, 当收不到确认信息的时候, 始发路由器开始重传, 重传为单播 Sh ip os database 可以查看链路状态数据库, 里面保存了所有的 LSA
每条 LSA 都存在一个老化时间, 当一条 LSA 通告的老化时间达到最大生存时间时,LSA 将被重新泛洪扩散, 并且随后会从路由器的数据库中清除该条 LSA 当一台路由器需要从所有路由器的数据库中清除一条 LSA 时, 它会提前把这条 LSA 的老化时间设为最大并重新泛洪, 只有始发这条 LSA 的路由器才可以提前使这条 LSA 老化 二. 区域 (Area) 1. 引入了区域的概念之后 : 路由器仅仅需要和它所在区域的其他路由器具有相同的链路状态数据库, 而没有必要和整个 OSPF 域内的所有路由器共享相同的链路状态数据库 因此, 在这种情况下, 链路状态数据库大小的缩减就降低了对路由器内存的消耗 链路状态数据库的减小也就意味着处理较少的 LSA, 从而也就降低了对路由器 CPU 的消耗 由于链路状态数据库只需要在一个区域内进行维护, 因此大量的 LSA 泛洪扩散也被限制在一个区域里面了 2. 虚链路 (virtual-link): 是指一条通过一个非骨干区域连接到骨干区域的链路 通过一个非骨干区域连接一个区域到骨干区域 通过一个非骨干区域连接一个分段的骨干区域两边的部分区域配置虚链路时需要注意 : 虚链路必须配置在两台 ABR 路由器之间 ; 配置了虚链路所经过的区域必须拥有全部的路由信息, 这样的区域又被称为传输区域 ; 传输区域不能是一个末梢区域 ; 三. 链路状态数据库当 LSA 驻留在状态数据库中的时候, 它的老化时间是会增大的 如果这些 LSA 达到了最大的生存时间 (60 分钟 ), 将从 OSPF 域中清除 所以必须有一个机制来防止 LSA 通告达到最大生存时间而被清除掉, 这便是链路状态重刷新 (LSR) 每隔 30 分钟始发这条 LSA 的路由器就将重新泛洪这条 LSA 的一个拷贝, 并将序列号 +1, 老化时间设置为 0 其他的 OSPF 路由器一旦收到这个新拷贝, 就会用这个新拷贝替换这条 LSA 通告原来的拷贝, 并且使这条新拷贝的老化时间开始增加 1. 路由器 LSA(1 类 ): 每台路由器都会产生, 用于描述该路由器的所有接口和链路信息, 并指明它们的状态和沿每条链路方向出站的代价, 以及该链路上所有已知的 OSPF 邻居, 只在区域内泛洪, 通过 sho ip os da router 查看 2. 网络 LSA(2 类 ): 只由 DR 产生, 用于描述所有与之相连的路由器, 包括自己本身 只在区域内部泛洪 使用 sh ip os da net 查看 3. 网络汇总 LSA(3 类 ): 由 ABR 产生, 告诉与之相连的区域内部路由器, 它所能到达的区域外部网络, 是一条汇总路由 通过 sh ip os da sum 查看 当一台 ABR 路由器始发一条网络汇总 LSA 时, 将包括从它自己本身到正在通告的这条 LSA 的目的地所耗费的代价 当有多条路由可达目的地时, 选择 metric 最小的 当内部路由器收到这条路由时, 它不进行 SPF 算法, 而是简单的加上到那台 ABR 的代价 所以, 在区域内,OSPF 是链路状态的, 在区域间,OSPF 是距离矢量的 4. ASBR 汇总 LSA(4 类 ): 由 ASBR 产生, 告诉其他路由器, 我是 ASBR, 想出去, 从我这走 通过 sh ip os da asbr-summary 查看 5. AS 外部 LSA(5 类 ): 由 ASBR 产生, 用来通告到达 OSPF AS 外部的目的地或者 OSPF AS 外部的缺省路由的 LSA 通过 sh ip os da ext 查看 6. NSSA 外部 LSA(7 类 ): 由 NSSA 区域的 ASBR 产生, 通告外部路由, 但 7 类 LSA 只在 NSSA 内传播, 当到达 NSSA 区域的 ABR 时,LSA 类型由 type 7 转为 type 5 通过 sh ip os da nssa-ext 查看
四.OSPF 的几个末梢区域类型 1. 末梢区域 : 不接受外部路由, 也就是没有 5 类 LSA( 个人觉得 4 类 LSA 也就没必要了 ), 此时,ABR 会使用 3 类 LSA 来向区域内部发送一个默认路由 (0.0.0.0) 需要注意的是 : 区域内部的所有路由器都必须配置成 stub 区域, 否则无法形成邻居关系 stub 区域不能是一个虚链路的穿越 area stub 区域内的路由器不能是 ASBR 配置命令 ---area area-id stub 2. 完全末梢区域 : 不仅阻止了 5 类, 连 3 类 LSA 也阻止了, 只接受由 ABR 发出的缺省路由 意思就是压根不管外面发生了什么, 你 ABR 告诉我怎么走, 我就怎么走 配置命令 :area area-id stub no-summary( 只用 ABR 上配置 ) 3. 非纯末梢区域 (NSSA): 有的时候, 人在江湖, 身不由己 我明明是在一个 stub 区域, 但偏偏该区域又有一个路由器连接到外部网络并且必须将外部网络重发布进 stub 区域, 这时就出现了 ASBR, 这就与 stub 区域的原则产生了冲突, 正当不知道怎么办才好的时候,NSSA 出现了 它允许外部路由通告到 OSPF AS 内部, 而同时保留 AS 其余部分的末梢区域特征 为了做到这一点,NSSA 区域的 ASBR 将产生 7 类 LSA 来通告外部路由, 该 LSA 只在区域内传递, 但是会在通向其他区域的 ABR 处被转换为 5 类 LSA 配置命令:area area-id nssa 4. 完全非纯末梢区域 : 在这种情况下,NSSA 的 ABR 禁止了 5 类 3 类和 4 类进入该区域, 而用一条默认路由代替他们, 在 NSSA ABR 上配置 area area-id nssa no-summary 命令, 将使得 ABR 产生一条 O*N2 的默认路由 相关配置命令 :area area-id nssa [default-information-originate] [no-redistribution], 关键字 default-information-originate 用来产生缺省的 Type-7 LSA, 应用了该参数后, 在 ABR 上无论路由表中是否存在缺省路由 0.0.0.0, 都会产生 Type-7 LSA 缺省路由 ; 而在 ASBR 上当路由表中存在缺省路由 0.0.0.0, 才会产生 Type-7 LSA 缺省路由 关键字 no-redistribution 用在 ASBR 上, 使得 OSPF 通过 no-redistribution 命令引入的路由不被通告到 NSSA 区域 如果 NSSA 的路由器既是 ASBR 也是 ABR, 一般选用该参数选项 五. 路径类型 1. 区域内路由 : 在路由表中通过 O 来表示 2. 区域间路由 : 在路由表中通过 IA 来表示 3. 类型 1 的外部路由 : 在路由表中通过 E1 来表示, 它表示计算通往外部路由的 cost 需要加上到达 ASBR 路由器的 cost 4. 类型 2 的外部路由 : 在路由表中通过 E2 来表示, 它表示计算通往外部路由的 cost 不需要加上到达 ASBR 路由器的 cost 六. OSPF 配置的常见问题 1. OSPF 把 loopback 口看作一个末梢网络来看待, 当将 LO 口宣告到 OSPF 中时, 它默认显示的是一个 /32 位的主机路由, 通过 ip os net point-to-point 来修改 2. OSPF 把辅助地址看作是末梢网络, 从而不会在这些网络上发送 hello 数据包 因此, 在辅助网络上无法建立邻接关系 3. Area area-id default-cost 可以修改 ABR 宣告默认路由时的代价值, 当有多台 ABR 时, 内部路由器将只选用具有最低 cost 值的 ABR 当这抬 ABR down 掉之后, 选择具有第二低的 ABR 4. 通过 area area-id range 可以汇总区域间路由, 并且也象 EIGRP 那样, 汇总路由会自动产生一条指向 null0 的路由以避免环路 但是在 12.1 版本前, 不会这么做, 这时可以有两种解决办法 : 静态路由手动指定,ip route x.x.x.x x.x.x.x null0 使用 discard-route 命令
5. Area area-id range x.x.x.x x.x.x.x not-advertise 命令可以将指定范围的前缀被抑制, 不会在 LSA 中通告 6. ABR 可以过滤由类型 3 的 LSA 通告的网络地址进出某个区域 : 例 : ip prefix-list area1outbound seq 10 deny 192.169.1.0/24 ip prefix-list area1outbound seq 20 per 0.0.0.0/0 le 32 router os 1 area 1 filter-list prefix area1outbound out 7. OSPF 的 authentication 不必在整个区域上都相同, 但是在一对邻居路由器之间必须相同 ; 在 router os 进程下, 需要通过 area area-id authentication [message-digest] 命令使认证方式生效 8. NBMA 环境下的 OSPF: 因为 NB, 所以要手动指 neighbor 因为 MA, 所以要选 DR/BDR 可以在接口下, 改变网络类型 ip os net b, 这样就不用指 neighbor,frame-relay 后面跟 b 就可以, 但是 DR/BDR 还是要选举, 通过接口下 ip os pri 来修改优先级来影响 DR 选举 可以在接口下, 改变网络类型 ip os net point-to-multipoint, 这样就不用指 neighbor 也不用选举 DR/BDR 点到点子接口, 最容易管理 强烈建议敲上两条命令 :no frame inverse-arp 和 no arp frame 9. 运行按需电路的 OSPF 不应该在一个广播型介质上实现, 因为这样的网络不能抑制 hello 数据包的发送, 从而使链路一直 UP 命令:ip os demand-circuit 10. Sh ip os da database-summary 可以查看每一台路由器中数据库的 LSA 数量, 对于给定的一个区域, 所有路由器上每一种 LSA 类型的数量应该相同 11. 如果有这样两条命令 : net 12.1.0.0 0.0.255.255 a 1 net 12.1.10.0 0.0.0.255 a 0 所有匹配第一条 network 命令语句的接口都被宣告到区域 1; 而第二条语句没起作用 ; 因为 network 命令连续执行的, 第二条只能匹配第一条没有匹配的接口 OSPFv3: OSPFv3 使用了与 OSPFv2 相同的基本实现机制 SPF 算法, 泛洪扩散,DR 选举, 区域, 计时器, 度量值 但是 OSPFv3 不向后兼容 OSPFv2, 也就是说, 如果希望在 IPv4 和 IPv6 环境中同时使用 OSPF 协议, 就必须同时运行 v2 和 v3 OSPFv3 和 OSPFv2 的不同 : 一条链路可以使用多个 IPv6 地址, 单条链路可以属于多个子网, 与同一条链路相连但属于不同 IPv6 子网的两个接口仍然可以通信 所有类型的链路上的所有邻居都通过 RID 来标识 增加了链路本地泛洪扩散 链路 LSA 用来携带仅仅与这个链路上的邻居相关的信息 这种 LSA 具有连路本地泛洪扩散的范围, 也就是说它不能超过任何相连的路由器的范围而扩散 OSPFv3 使用链路本地 IPv6 地址 ( 以 FE80::/10 开头 ) 作为源地址和下一跳地址 取消了 OSPF 特有的认证 OSPFv3 没有数据包的认证, 而是使用 IPv6 的认证 一条链路多个实例 OSPFv3 的 hello 包包含了一个实例 ID 这个实例 ID 用来把运行在同一个 LAN 上的两个 OSPF 进程分开, 所收到的 hello 数据包中的实例 ID 必须与接收该数据包的路由器接口上配置的实例 ID 相同, 否则丢包 配置例如 :ipv6 os 1 area 0 instance 1
需要注意的地方 : 一台路由器上可以运行多个 OSPFv3 进程, 但是在一个接口上只能运行单个进程或实例 NBMA 中,frame map ipv6 后面映射的是链路本地地址到本地 DLCI, 而不是 IPv6 地址, 因为 OSPFv3 使用链路本地地址进行包交换 链路本地地址可以通过 sh ipv6 int 查看