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.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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-54cc3a5b6eb7Bridge brConnPort brConnInterface brConntype: internalovs_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 brConnPort brConnInterface brConntype: internalPort "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 - backupt - trapped, o - offload failureC>* 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.mzph.cn/pingmian/40820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫(一)深度优先爬虫与广度优先爬虫

1. 深度优先爬虫:深度优先爬虫是一种以深度为优先的爬虫算法。它从一个起始点开始,先访问一个链接,然后再访问该链接下的链接,一直深入地访问直到无法再继续深入为止。然后回溯到上一个链接,再继续深入访问下一个未被访…

AOP切面、动态代理

目录 一、用切面做的是怎么声明切面的?(切面是怎么用的?) 二、切点是怎么定义的? 三、说一下面向切面编程? 四、AOP是怎么实现的? 五、说一下动态代理? 一、用切面做的是怎么声明切面…

promise.all和promise.race的区别

Promise.all和Promise.race是JavaScript中Promise API的两个重要方法,它们在处理多个Promise对象时表现出不同的行为。以下是它们之间的主要区别: 1. 功能和行为 Promise.all: 功能:接收一个包含多个Promise的数组&#x…

【leetcode--逆波兰表达式】

今天学逆波兰表达式撰写还顺便复习了一下二叉树的前中后序遍历: 前序遍历:根左右 中序遍历:左根右 后序遍历:左右根 本题两个要点: a.判断字符串中的元素是数字还是字符串 因为Python 中没有一个函数可以判断一个字…

138. 完美数(卡码网周赛第二十四期(23年腾讯音乐笔试真题))

138. 完美数&#xff08;卡码网周赛第二十四期&#xff08;23年腾讯音乐笔试真题&#xff09;&#xff09; 题目描述 小红定义一个数为“完美数”&#xff0c;当且仅当该数仅有一个非零数字。例如 5000, 4, 1, 10, 200 都是完美数。 小红拿到了一个大小为 n&#xff08;2 <…

HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注&#xff1a;…

Laravel为什么会成为最优雅的PHP框架

PHP作为一种广泛应用的服务器端脚本语言&#xff0c;拥有着丰富的Web开发框架。其中&#xff0c;Laravel凭借其简洁优雅的语法、强大的功能集、优秀的文档与社区支持以及高度可扩展性&#xff0c;成为了许多开发者心目中的首选框架。本文将深入探讨Laravel为何能够在众多PHP框架…

【Sping Boot2】笔记

Spring Boot 2入门 如何创建一个Spring Boot的Web例子&#xff1f;1.如何创建一个Spring Boot项目1.1 使用Maven构建一个Spring Boot 2项目1.1.1创建Maven工程注&#xff1a;Maven项目结构&#xff1a; 1.1.2引入SpingBoot相关依赖依赖注意事项&#xff1a; 1.1.3创建主类1.1.4…

VIM介绍

VIM&#xff08;Vi IMproved&#xff09;是一种高度可配置的文本编辑器&#xff0c;用于有效地创建和更改任何类型的文本。它是从 vi 编辑器发展而来的&#xff0c;后者最初是 UNIX 系统上的一个文本编辑器。VIM 以其键盘驱动的界面和强大的文本处理能力而闻名&#xff0c;是许…

Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏&#xff0c;挺有意思的&#xff0c;一起来玩吧~ 按空格发射子弹&#xff0c;上下左右键实现移动&#xff0c;ESC键无限复活。 import pygame,time,random from pygame.sprite import Sprite SCREEN_WIDTH800 SCREEN_HEIGHT500 BG…

Vue3中为Ant Design Vue中Modal.confirm自定义内容

在一次业务开发时代码时&#xff0c;碰到了一种既想要Modal.confirm样式&#xff0c;又想要定制其content内容的情况。 大部分情况下&#xff0c;使用Modal.method()这种方式时&#xff0c;可能content内容固定都是字符串&#xff0c;那如果想要做更高级的交互怎么办&#xff…

用Docker搭建分布式 Redis 的方法

使用 Docker 搭建一个分布式的 Redis 集群可以帮助你快速部署和管理多个 Redis 实例。一个典型的 Redis 集群包括多个主从节点&#xff0c;通过分片来实现数据的分布式存储与高可用性。 以下是使用 Docker 搭建分布式 Redis 集群的详细步骤&#xff1a; 前提条件 安装 Docke…

【Git-驯化】一文学会git配置用户信息,git config用法细节

【Git-驯化】一文学会git配置用户信息&#xff0c;git config用法细节 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档…

通过 url 下载文件的浏览器插件

大多数情况下访问 url 就会开始下载文件&#xff0c;但是由于文件格式等原因&#xff0c;下载可能不会开始或者失败&#xff0c;这时可以使用一些浏览器插件&#xff0c;例如 https://chromewebstore.google.com/detail/download-file-%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6/do…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛赛题浅析

一图流&#xff1a; 赛题编号 赛题名称 涉及学科 所需模型 赛题复杂度 赛题难度 主要挑战 A 飞行器外形的优化问题 航空航天工程&#xff0c;数学&#xff0c;物理 几何模型&#xff0c;空气动力学模型&#xff0c;优化算法 高 高 精确计算飞行器表面积和体积&…

工具发送formdata请求 Multipartfile 接收

1.需求&#xff1a; 接收到 (Multipartfile file 文件 》使用工具转发到别的请求&#xff0c;将文件传到别的接口 主要代码&#xff1a; InputStreamResource inputstreamResource new InputstreamResource(file.getInputstream(), file.getoriginalfilename());MultiReso…

全网都在疯传的最新蓝海风口项目!

最近全网都在疯传这种视频&#xff0c;想必兄弟们都见到过了&#xff01; 大家看这个号&#xff0c;1天的时间&#xff0c;2个作品&#xff0c;第2个直接就爆了&#xff0c;昨天看点赞还是3.8w&#xff0c;今天已经10w了&#xff0c;这是妥妥的风口啊&#xff01; 大家有没有想…

应用在灯带Type-C接口上的PD SINK协议芯片ECP5701/ECP5702获取充电器的5V、9V、12V、15V、20V供电

方案背景 近日&#xff0c;欧盟就统一充电器接口的提案达成了一项政治协议&#xff0c;其中规定了在欧盟地区销售的所有手机或其他便携式中小型电子设备必须采用统一的USB Type-C接口。这项决定意味着未来将会有更多的产品强制性地使用TYPE-C充电接口。 在这个背景下&#xf…

day10:01集合

1 作用 Python中的集合&#xff08;Set&#xff09;是一个无序的、不包含重复元素的容器。它主要用于去重、成员测试、以及执行数学上的集合运算&#xff08;如并集、交集、差集和对称差集&#xff09;等操作。集合的内部实现通常基于哈希表&#xff0c;这提供了快速的成员测试…