Frrouting快速入门——OSPF组网(一)

FRR简介

FRR是FRRouting的简称,是一个开源的路由交换软件套件。其作者源自老牌项目quaga的成员,也可以算是quaga的新版本。

frrouting

使用时一般查看此文档:https://docs.frrouting.org/projects/dev-guide/en/latest/index.html
dev-frr

FRR支持的协议众多,也有较为完备的北向接口。
frr-github
如需深入了解或进行二次开发,可直接查看它的源码,其github地址为:https://github.com/FRRouting/frr

FRR的安装方式多种多样,如仅仅把它当做工具使用,使用docker运行FRR是一个不错的选择。
docker方式运行frr时需要注意:较新版本FRR的docker仓库由quay.io维护,并没有在dockerhub中。

使用时拉一下对应的版本即可,如:

docker pull quay.io/frrouting/frr:10.0.0

frrouting+ospf快速组网

frr应用范围广泛,如:

  • 虚拟路由器/交换机
  • 路由交换套件开发/学习,sonic组件
  • frr组网,openwrt
  • 交换机路由器模拟器
  • ……

这里以FRR+OSPF为例,演示一下FRR+OSPF组网的丝滑过程。

ospf简单回顾

OSPF,全称为Open Shortest Path First,开放最短路径优先。
在笔者以前的文章《使用mininet快速入门ONOS路由交换技术与原理-路由篇》中有提到,OSPF属于IGP,是一种基于链路状态的动态路由协议,与RIP、ISIS协议相比具有快速收敛、简单易用的特点。

目前使用到的OSPF有OSPF-V2与OSPF-V3两个版本,OSPF-V2主要用于IPV4,OSPF-V3主要用于IPV6。
OSPF中常见术语有:

  • LSA,链路状态通告
  • LSDB,链路状态数据库
  • Router ID,唯一标识一个OSPF路由器
  • OSPF Area,标识一个OSPF区域
  • Area ID,OSPF区域号
  • Cost,路由度量值,默认算法为=100 Mbit/s/接口带宽
  • OSPF邻居,由OSPF Hello报文建立的邻居关系
  • OSPF DR/BDR,OSPF指定路由器/备份指定路由器

OSPF中的路由表项由SPF算法生成,底层使用Dijkstra算法(狄克斯特拉)。OSPF通过交换链路状态信息构建全网拓扑图,并使用Dijkstra算法计算每个路由器到其他路由器的最短路径,以生成高效且一致的路由表。

OSPF更多介绍,可移步《什么是OSPF?》

实验拓扑

frr-ospf

拓扑图如上,由3个不同网段的路由器组成,R1和R3使用R2间接连起来,且R1与R3位于不同的两个网段。

环境准备

路由器搭建

使用FRR模拟3台路由器

docker run -d --privileged --net=none --name frr-01 quay.io/frrouting/frr:10.0.0
docker run -d --privileged --net=none --name frr-02 quay.io/frrouting/frr:10.0.0
docker run -d --privileged --net=none --name frr-03 quay.io/frrouting/frr:10.0.0

查看网络信息

docker exec -it frr-01 ifconfig
docker exec -it frr-02 ifconfig
docker exec -it frr-03 ifconfig

上面使用的net为none,默认没有网卡信息,后续再手动配置网络拓扑。显示如下:

root@puhaiyang-Computer:/home/puhaiyang# docker exec -it frr-01 ifconfig
docker exec -it frr-02 ifconfig
docker exec -it frr-03 ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

启动ospf
进入每个容器,开启R1、R2、R3中的ospf

vi /etc/frr/daemons
---
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no

或用字符串替换:

sed -i ‘s/ospfd=no/ospfd=yes/g’ /etc/frr/daemons

配置文件修改好后再重启FRR服务:

#重启 FRR 服务
/etc/init.d/frr restart

输入ps -ef|grep ospf 验证一下
ospf-pid

ovs安装与验证

上面使用frr镜像仅完成了3台路由器容器的搭建,但还未配置网卡信息。为了实验方便,使用ovs完成容器网络搭建。
ovs

安装ovs
参考ovs官网链接:https://docs.openvswitch.org/en/latest/intro/install/

以ubuntu系统为例,执行如下命令进行安装

sudo apt-get install openvswitch-switch

验证ovs

root@ubuntu:~# ovs-vsctl -V
ovs-vsctl (Open vSwitch) 2.9.8
DB Schema 7.15.1
root@ubuntu:~#

绑定容器网络

frr容器与ovs就绪后,便可以将容器与ovs交换机连接起来了。

创建一个ovs网桥,命名为brConn

ovs-vsctl add-br brConn

如需删除执行此命令: ovs-vsctl del-br brConn

创建好后输入如下命令进行验证:

ovs-vsctl show

root@puhaiyang-Computer:/home/puhaiyang# ovs-vsctl show
99985505-5873-467d-be09-54cc3a5b6eb7
    Bridge brConn
        Port brConn
            Interface brConn
                type: internal
    ovs_version: "2.17.9"

Bridge成功显示后,便可以让3台路由器进行连线了,让其全连到同一个交换机(brConn)中。使用到的工具为ovs中自带的ovs-docker命令

ovs-docker add-port brConn eth1 frr-01 --ipaddress=11.11.0.2/24
ovs-docker add-port brConn eth1 frr-02 --ipaddress=11.11.0.3/24
ovs-docker add-port brConn eth2 frr-02 --ipaddress=12.12.0.2/24
ovs-docker add-port brConn eth1 frr-03 --ipaddress=12.12.0.3/24

关于ovs-docker的更多细节可参考其源码,地址为:https://github.com/openvswitch/ovs/blob/main/utilities/ovs-docker

上面的ovs-docker命令执行好后,再次查看网桥信息

ovs-vsctl show

    Bridge brConn
        Port brConn
            Interface brConn
                type: internal
        Port "6f8e9c82aa0a4_l"
            Interface "6f8e9c82aa0a4_l"
        Port "0f93da6550474_l"
            Interface "0f93da6550474_l"
        Port "3e62b26da9b94_l"
            Interface "3e62b26da9b94_l"
        Port "9852a04bd3214_l"
            Interface "9852a04bd3214_l"

可以看到添加了3个口,每个口和前面创建的frr容器进行了连接。

未学到路由前网络验证

进入容器,尝试让R1与R2、R3进行通信
R1 ping R2

docker exec -it frr-01 bash
ping 11.11.0.3
---
e603f681209f:/# ping 11.11.0.3
PING 11.11.0.3 (11.11.0.3): 56 data bytes
64 bytes from 11.11.0.3: seq=0 ttl=64 time=0.837 ms
64 bytes from 11.11.0.3: seq=1 ttl=64 time=0.118 ms
---
e603f681209f:/# ping 12.12.0.3
PING 12.12.0.3 (12.12.0.3): 56 data bytes
ping: sendto: Network unreachable

R1到R2的同网段ip可达,R1到R3不可达,因为处于不同网段且无路由记录。

R2 ping R3

docker exec -it frr-02 bash
ping 12.12.0.3
---
40757abcdc0c:/# ping 12.12.0.3
PING 12.12.0.3 (12.12.0.3): 56 data bytes
64 bytes from 12.12.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 12.12.0.3: seq=1 ttl=64 time=0.090 ms
---
40757abcdc0c:/# ping 11.11.0.2
PING 11.11.0.2 (11.11.0.2): 56 data bytes
64 bytes from 11.11.0.2: seq=0 ttl=64 time=0.466 ms
64 bytes from 11.11.0.2: seq=1 ttl=64 time=0.111 ms

R2作为中间节点,到R1和R3均可达

进入frr-01控制台查看接口信息

e603f681209f:/# vtysh
e603f681209f# show interface brief 
Interface       Status  VRF             Addresses
---------       ------  ---             ---------
eth1            up      default         11.11.0.2/24
lo              up      default         

进入frr-02查看路由器信息

40757abcdc0c:/# vtysh
40757abcdc0c# show interface brief 
Interface       Status  VRF             Addresses
---------       ------  ---             ---------
eth1            up      default         11.11.0.3/24
eth2            up      default         12.12.0.2/24
lo              up      default         

40757abcdc0c# show ip route
Codes: K - kernel route, C - connected, L - local, S - static,
       R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric, t - Table-Direct,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

C>* 11.11.0.0/24 is directly connected, eth1, 00:14:42
L>* 11.11.0.3/32 is directly connected, eth1, 00:14:42
C>* 12.12.0.0/24 is directly connected, eth2, 00:14:41
L>* 12.12.0.2/32 is directly connected, eth2, 00:14:41

ospf配置

依次进入R1、R2、R3容器,输入vtysh进入frrouting控制台进行ospf配置,详细配置如下:

R1

conf t
router ospf
network 11.11.0.2/24 area 0
end
show ip ospf neighbor

R2

conf t
router ospf
network 11.11.0.3/24 area 0
network 12.12.0.2/24 area 0
end
show ip ospf neighbor

R3

conf t
router ospf
network 12.12.0.3/24 area 0
end
show ip ospf neighbor

配置完毕后可以随时使用如下命令进行验证

#查看路由  
show ip route  
#查看ospf邻居  
show ip ospf neighbor

ospf-neighbor

网络连通性验证

R1

ping 11.11.0.3
ping 12.12.0.2
ping 12.12.0.3

R2

ping 11.11.0.2
ping 12.12.0.3

R3

ping 11.11.0.2
ping 12.12.0.2

pingall
通信成功,自动添加路由记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/772356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 实现UGUI 简单拖拽吸附

获取鼠标当前点击的UI if(RectTransformUtility.RectangleContainsScreenPoint(rectTransform, Input.mousePosition)) {return rectTransform.gameObject; } 拖拽 在Update 中根据鼠标位置实时更新拖拽的图片位置。 itemDrag.transform.position Input.mousePosition; …

Windows安全认证机制——Windows常见协议

一.LLMNR协议 1.LLMNR简介 链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,使用此协议可以解析局域网中本地链路上的主机名称。它可以很好地支持IPv4和IPv6,是仅次于DNS解析的名称…

JavaFx基础知识

1.Stage 舞台 如此这样的一个框框,舞台只是这个框框,并不管里面的内容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…

昇思25天学习打卡营第15天|ResNet50图像分类

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) ResNet50图像分类 图像分类是最基础的计算机视觉应用,属于有监督学习类别,如给定一张图像(猫、狗、飞机、汽车等等),判断图像所属的类别。本章将介绍使用ResN…

更改Anki笔记所应用的模板及其所属的牌组

对于Anki中的笔记,录入时总会为它指定模板以及所属的牌组,但是,如果发生教材版本变更,我们可能会用新的模板添加笔记,也会使用新的牌组,但是原来所做的笔记中也有一些完全可以继续使用,如果可以…

超详细的 C++中的封装继承和多态的知识总结<1.封装与继承>

引言 小伙伴们都知道C面向对象难,可是大家都知道,这个才是C和C的真正区别的地方,也是C深受所有大厂喜爱的原因,它的原理更接近底层,它的逻辑更好,但是学习难度高,大家一定要坚持下来呀&#xff…

【实验室精选】PFA反应瓶带鼓泡球 高效气体鼓泡 化学分析优选

PFA反应瓶带鼓泡球是一种特殊设计的实验室容器,它集成了鼓泡球和PFA(全氟烷氧基)材料的反应瓶,用于气体的鼓泡和液体的混合。以下是它的一些特点和用途: 特点: 鼓泡球设计:鼓泡球周围布满小孔&…

Unity热更方案HybridCLR+YooAsset,纯c#开发热更,保姆级教程,从零开始

文章目录: 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案,各种lua热更,ILRuntime等,这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

60种AI工具用法 学会探索AI的无限可能

外面还在卖的课程,学会探索AI的无限可能,从构建精准的提示词到获取个性化新闻,从快速制作PPT到短视频内容的智能提炼,再到编程、股市分析和视频剪辑,AI工具助您工作学习效率飞跃提升! 百度网盘 请输入提取…

Linux多进程和多线程(五)进程间通信-消息队列

多进程(五) 进程间通信 消息队列 ftok()函数创建消息队列 创建消息队列示例 msgctl 函数示例:在上⼀个示例的基础上,加上删除队列的代码 发送消息 示例: 接收消息示例 多进程(五) 进程间通信 消息队列 消息队列是一种进程间通信机制,它允许两个或多个…

单例模式详解:概念与实用技巧

目录 单例模式单例模式结构单例模式适用场景单例模式优缺点练手题目题目描述输入描述输出描述输入示例输出示例提示信息题解 单例模式 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 只有一个实例的…

【深入理解Java虚拟机】判断垃圾-引用计数法及其缺陷

什么是引用计数法 引用计数法用来判断对象是否存活 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加一;当引用失效时,计数器的值就减一,任何时刻计数器为0的对象是不可能在被使用的。(存…

c++类模板及应用

文章目录 为什么要有函数模板一般实现举例类模板举例 继承中类模板的使用特殊情况 友元函数模板类和静态成员类模板实践 为什么要有函数模板 项目需求: 实现多个函数用来返回两个数的最大值,要求能支持char类型、int类型、double 一般实现举例 类模板举例 继承中类…

2.2 ROS2话题通信

场景 话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,比如如下场景: 机器人在执行导航功能&#…

肺炎-X光-图像分类数据集

肺炎-X光-图像分类数据集 数据集: 链接:https://pan.baidu.com/s/1bt6tf-jHqgufKqPmCFHbrQ?pwdaj54 提取码:aj54 数据集信息介绍: 文件夹 健康 中的图片数量: 1575 文件夹 新冠肺炎 中的图片数量: 1728 文件夹 普通肺炎 中的…

AI:开发者的超级助手,而非取代者

AI:开发者的超级助手,而非取代者 引言 在这个日新月异的科技时代,人工智能(AI)已悄然渗透到我们生活的方方面面,尤其是在软件开发领域,它正以一种前所未有的方式改变着我们的工作方式。作为一名…

Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

Redis 中的通用命令(高频率操作) 文章目录 Redis 中的通用命令(高频率操作)Redis 的数据类型redis-cli 命令Keys 命令Exists 命令Expire 命令Ttl 命令Type命令 Redis 的数据类型 Redis 支持多种数据类型,整体来说,Redis 是一个键值对结构的,…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

【软件测试】之自动化测试

🏀🏀🏀来都来了,不妨点个关注! 🎧🎧🎧博客主页:欢迎各位大佬! 文章目录 什么是自动化测试Selenium介绍什么是SeleniumSelenium的特点工作原理 SeleniumJava环境搭建下载…