一、背景
在学习路由协议如OSPF协议时,需要进行一个实操的练习,若手里又没有核心交换机,怎么破?
本文讲述了如何在Linux系统上搭建软路由环境,并使用OSPF路由协议完成路由表的学习。
二、相关知识
2.1 Quagga
Quagga是一款开源路由软件套件,它可以用来将你的Linux设备变成一个功能完备的路由器,支持RIP,RIPNG,OSPFv2,OSPFv3,BGP等路由协议。
2.2 OSPF
OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。
OSPF相关概念比较多,以下挑几个重要知识点进行说明。
LSA(Link-State Advertisement)是链接状态协议使用的一个分组,它包括有关邻居和通道成本的信息。LSAs被路由器接收用于维护它们的路由选择表。
OSPF从报文的结构上划分,可以分为以下几种:
1.Hello报文(Hello Packet):周期性地发送,用于维护邻居关系以及DR/BDR选举;
2.DD报文(Database Description Packet):用于两台路由器进行数据库同步,包含自己的LSDB(LSA集合)信息;
3.LSR报文(Link State Request Packet):在交换DD报文后续,使用该报文向对方请求所需的LSA信息;
4.LSU报文(Link State Update Packet):向对方发送所需的LSA信息集合。
5.LSAck报文(Link State Acknowledgment Packet):用于对LSU报文进行确认。
另一个重要的知识点就是邻居建立过程,如下图所示:
对于图上的7种状态进行说明:
1.Down:在Down状态下,OSPF进程还没有与任何邻居交换信息。OSPF在等待进入Init状态;
2.Init:OSPF路由器以固定的时间间隔(缺省10s)发送Hello分组,以便与邻居路由器建立特殊的关系;
3.Two-Way:每台OSPF路由器都使用分组试图与同一个IP网络中的所有邻居路由器建立双向状态或双向通信。Hello分组中含有发送者已知的OSPF邻居列表。当路由器看到它自己出现在一个邻居路由器的Hello分组中时,它就进入了双向状态;
4.ExStart:当路由器与它的邻居进入到ExStart状态后,他们之间的会话就表征为一种毗邻关系,但这时路由器还没有变成全毗邻状态。ExStart状态是使用DD(数据库描述)分组建立的,两个路由器用Hello分组协商出“主从关系”;
5.Exchange:在交换状态下,邻居路由器使用类型2的DD分组来互相发送它们的链路状态信息,也就是说路由器相互描述它们的链路状态数据库。路由器将它们所学到的信息与其现存的链路状态数据库进行比较,并且单独确认每个DD分组,如果任何一台路由器接收到不在其数据库中的链路信息,该路由器就向其邻居请求有关该链路的完整更新信息。完整的路由信息在“Loading”状态下被交换;
6.Loading:在相互描述过各自的链路状态数据库之后,路由器可以用LSR(链路状态请求)分组来请求更完整的信息。当路由器接收到一个LSR的时候,它会用一个LSU(链路状态更新)分组进行回应。这些LSU分组含有确切的LSA,而LSA是链路状态型路由选择协议的核心,LSU分组由LSAck分组所确认;
7.Full Adjacency:加载状态结束之后,路由器就进入全毗邻状态。每台路由器都保存着一张毗邻路由器列表,它就是称为毗邻数据库。
三、配置过程
配置的拓扑如下,使用两个CentOS 分别模拟 Rt170、Rt171:
3.1 Quagga安装
CentOS下可以直接使用yum install quagga进行安装,也可以源码安装,但是要注意第三方库的依赖。
安装完成后,需要在 /etc/quagga 把 zebra.conf、vtysh.conf、ospfd.conf 拷贝出来。
启动命令使用 service zebra start、service ospfd start进行启动,若对端收不到报文,可能还需要关闭防火墙 iptables。
3.2 OSPF配置
进入vtysh进行初始配置,设置日志文件 /var/log/quagga/quagga.log
配置接口 分别对应拓扑
设置OSPF ,router ospf、route-id、network 192.168.50.0/24 area 0
配置成功后,查看邻居信息,可以看见状态分别从 init -> two-way ->... full 进行切换,最终可以看出主从关系
查看路由表,发现可以学习到各自对端的路由表信息
同时,使用 Wireshark 抓包,可以验证报文交换的过程