概述

FRR是一个功能齐全、高性能的免费软件IP路由套件。

FRR实现了所有的标准路由协议,如BGP、RIP、OSPF、IS-IS等(参见功能矩阵),以及它们的许多扩展。

FRR是一个主要用C语言编写的高性能套件,它可以轻松地处理完整的Internet路由表,并且适用于从廉价sbc(系统基础芯片)到商用级路由器的硬件。它被数百家公司、大学、研究实验室和政府积极用于生产。

FRR是在GPLv2下发布的,其开发是模仿Linux内核的。任何人都可以提供功能、错误修复、工具、文档更新或其他任何内容。

系统架构

传统的路由软件是作为一个进程程序,提供所有的路由协议功能。FRR采取了不同的方法。FRR是一组守护程序,它们共同构建路由表。每个主要协议都在自己的守护进程中实现,这些守护进程与中间守护进程(zebra)通信,后者负责协调路由决策并与数据平面通信

这种体系结构允许高弹性,因为一个协议守护进程中的错误、崩溃或漏洞攻击通常不会影响其他协议守护进程。它还具有灵活性和可扩展性,因为模块化使得实现新协议和将它们绑定到套件中变得容易。此外,每个守护进程实现一个插件系统,允许在运行时加载新功能

+----+  +----+  +-----+  +----+  +----+  +----+  +-----+
|bgpd|  |ripd|  |ospfd|  |ldpd|  |pbrd|  |pimd|  |.....|
+----+  +----+  +-----+  +----+  +----+  +----+  +-----+
     |       |        |       |       |       |        |
+----v-------v--------v-------v-------v-------v--------v
|                                                      |
|                         Zebra                        |
|                                                      |
+------------------------------------------------------+
       |                    |                   |
       |                    |                   |
+------v------+   +---------v--------+   +------v------+
|             |   |                  |   |             |
| *NIX Kernel |   | Remote dataplane |   | ........... |
|             |   |                  |   |             |
+-------------+   +------------------+   +-------------+

所有 FRR 守护进程都可以通过一个名为 vtysh 的集成用户界面 shell 进行管理。vtysh 通过UNIX域套接字连接到每个守护进程,然后作为用户输入的代理。除了统一的前端之外,vtysh还提供了通过集成配置模式使用单个配置文件配置所有守护进程的能力。这避免了为每个守护进程维护单独配置文件的开销。

FRR目前正在实施一个基于YANG数据模型的新的内部配置系统。当这项工作完成后,FRR将是一个完全可编程的路由栈。

安装

下载需要的包

sudo dnf install --enablerepo=PowerTools git autoconf pcre-devel \
  automake libtool make readline-devel texinfo net-snmp-devel pkgconfig \
  groff pkgconfig json-c-devel pam-devel bison flex python2-pytest \
  c-ares-devel python2-devel libcap-devel \
  elfutils-libelf-devel

rpm 安装

FRR RPM repository
To add this repository to your RedHat/CentOS system, do:

# possible values for FRRVER: frr-6 frr-7 frr-8 frr-stable
# frr-stable will be the latest official stable release
FRRVER="frr-stable"

# add RPM repository on CentOS 6
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el6.noarch.rpm
sudo yum install ./$FRRVER*

# add RPM repository on CentOS 7
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el7.noarch.rpm
sudo yum install ./$FRRVER*

# add RPM repository on CentOS 8
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el8.noarch.rpm
sudo yum install ./$FRRVER*

# install FRR
sudo yum install frr frr-pythontools

This key is currently used to sign the repository:

sec   rsa4096 2018-01-12
      7AB8 AC62 4CBA 356C B621 6D48 F66B 5A91 4067 3A87
uid   NetDEF CI System  (NetDEF Continous Integration System Signature Key) <cisystem@netdef.org>

调整内核参数

vim /etc/sysctl.d/90-routing-sysctl.conf

# Sysctl for routing
#
# Routing: We need to forward packets
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1

使参数生效

sudo sysctl -p /etc/sysctl.d/90-routing-sysctl.conf

MPLS forwarding

MPLS requires Linux Kernel 4.5 or higher (LDP can be built, but may have limited use without MPLS)

/etc/modules-load.d/modules.conf

# Load MPLS Kernel Modules
mpls_router
mpls_iptunnel

下面是一个在内核中启用MPLS转发的示例,通常通过编辑/etc/sysctl.conf:

# Enable MPLS Label processing on all interfaces
net.mpls.conf.eth0.input=1
net.mpls.conf.eth1.input=1
net.mpls.conf.eth2.input=1
net.mpls.platform_labels=100000

修改配置文件

vi /etc/frr/daemons

重新安装后,启动FRR将不起任何作用。这是因为必须通过编辑配置目录中的文件来显式启用守护程序。此文件通常位于/etc/frr/daemons,它确定在通过init或systemd发出服务启动/停止命令时激活哪些守护程序。文件最初看起来如下所示:

bgpd=no
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
bfdd=no
fabricd=no
vrrpd=no
pathd=no

vtysh_enable=yes
zebra_options="  -A 127.0.0.1 -s 90000000"
bgpd_options="   -A 127.0.0.1"
ospfd_options="  -A 127.0.0.1"
ospf6d_options=" -A ::1"
ripd_options="   -A 127.0.0.1"
ripngd_options=" -A ::1"
isisd_options="  -A 127.0.0.1"
pimd_options="   -A 127.0.0.1"
ldpd_options="   -A 127.0.0.1"
nhrpd_options="  -A 127.0.0.1"
eigrpd_options=" -A 127.0.0.1"
babeld_options=" -A 127.0.0.1"
sharpd_options=" -A 127.0.0.1"
pbrd_options="   -A 127.0.0.1"
staticd_options="-A 127.0.0.1"
bfdd_options="   -A 127.0.0.1"
fabricd_options="-A 127.0.0.1"
vrrpd_options="  -A 127.0.0.1"
pathd_options="  -A 127.0.0.1"

要启用特定的守护进程,只需将相应的“no”更改为“yes”。后续服务重新启动应启动守护进程。
bgpd=yes

正如注释所说,这会导致VTYSH在启动守护进程时应用配置。这对于VTYSH文档中涉及的各种原因都很有用,通常应该启用它。
vtysh_enable=yes

这允许操作员控制允许每个守护进程启动的打开文件描述符的数量。大多数操作系统上的当前假定值是1024。如果运营商计划用几千个对等点运行bgp,那么我们将修改FRR以允许这种情况发生。
MAX_FDS=1024

下一组行控制从服务脚本启动时传递给守护程序的选项。通常守护程序会指定--daemon和-A

,以便守护和侦听特定地址上的VTY命令。

zebra_options=" -s 90000000 --daemon -A 127.0.0.1"
bgpd_options="   --daemon -A 127.0.0.1"
...

关于watchfrr_options 和 *_wrap 设置的其余文件内容通常不需要;如果需要,请参阅注释。

Network Namespaces

可以在不同的网络名称空间中运行FRR,以便可以进一步划分(例如,限制到较小的网络子集)。网络命名空间配置可以在默认FRR配置路径空间中使用,也可以在其他路径空间(-N/–pathspace)中使用。

要在默认路径空间中使用FRR network namespace,应在 /etc/frr/daemons中添加或取消注释 watchfrr_options行:

- #watchfrr_options="--netns"
+ watchfrr_options="--netns=<network-namespace-name>"

如果要将不同的路径空间与网络命名空间一起使用(推荐的方式),应在/etc/frr//daemons中添加/取消对watchfrr_options 行的注释:

- #watchfrr_options="--netns"
+ #watchfrr_options="--netns=<network-namespace-name>"
+
+ # `--netns` argument is optional and if not provided it will
+ # default to the pathspace name.
+ watchfrr_options="--netns"

要在新的pathspace+网络命名空间中启动FRR,应使用额外参数调用初始化脚本:

启用服务

启用ospfd,设为on

systemctl enable frr.service
systemctl start frr.service
netstat -anp | grep ospfd

配置网络协议

image.png

vtysh登录配置路由协议

路由A

conf t
router ospf
 network 10.10.254.0/24 area 0
 network 172.16.30.0/24 area 0

路由B

conf t
 router ospf
 network 2.2.2.0/24 area 0
 network 10.10.254.0/24 area 0
do write file

相关命令

# 设置路由器的主机名
hostname HOSTNAME

# 为vty接口设置密码。命令的no形式删除密码。如果没有密码,vty将不接受连接。
password PASSWORD

# 设置启用密码。命令的no形式将删除启用密码。
enable password PASSWORD

# 启用到标准输出的日志输出。如果指定日志级别的可选第二个参数不存在,则将使用默认日志级别(通常是调试)。命令的no形式禁止记录到stdout。LEVEL参数必须具有以下值之一:紧急情况、警报、严重错误、错误、警告、通知、信息或调试。请注意,现有代码记录了最重要的消息,其中包含严重性错误。
log stdout LEVEL

警告:FRRouting使用writev()系统调用来写入日志消息。这个调用应该是原子的,但实际上,这并不适用于管道或终端,只保留常规文件。这意味着在极少情况下,来自不同线程的并发日志消息可能会在终端输出中被混淆。如果你的设置不能接受这个极少情况,请使用日志文件和tail-f。

# 如果要登录到文件,请指定文件名,如下例所示:
log file [FILENAME [LEVEL]]

# 如果指定日志记录级别的可选第二个参数不存在,则将使用默认日志记录级别(通常是调试级别,但可以使用不推荐使用的log trap命令进行更改)。命令的no形式禁止记录到文件。
log file /var/log/frr/bgpd.log informational

# 启用到syslog的日志输出。如果指定日志记录级别的可选第二个参数不存在,则将使用默认日志记录级别(通常是调试级别,但可以使用不推荐使用的log trap命令进行更改)。命令的no形式禁止记录到syslog。
log syslog [LEVEL]

# 使用terminal monitor命令启用到已启用日志记录的vty终端的日志记录输出。默认情况下,在调试级别启用监视器日志记录,但此命令(或不推荐使用的log trap命令)可用于更改监视器日志记录级别。如果指定日志级别的可选第二个参数不存在,则将使用默认日志级别(通常是调试)。命令的no形式禁止记录到终端监视器。
log monitor [LEVEL]

# 此命令更改syslog消息中使用的工具。默认工具是daemon。命令的no形式将设施重置为默认的守护程序设施。
log facility [FACILITY]

# 要在记录到文件、标准输出或终端监视器(即除syslog以外的任何消息)的所有消息中包含严重性,请使用log record priority全局配置命令。要禁用此选项,请使用命令的no形式。默认情况下,严重性级别不包括在记录的消息中。注意:某些版本的syslogd可以配置为在发出的消息中包含facility和level。
log record-priority

# 此命令将日志消息时间戳的精度设置为小数点后的给定位数。目前,该值必须在0到6之间(即最大精度为微秒)。要恢复默认行为(1秒精度),请使用命令的no形式,或将精度显式设置为0。
log timestamp precision [(0-6)]

# 在本例中,精度设置为提供毫秒精度的时间戳。
log timestamp precision 3

# 此命令允许将用户键入的所有命令记录到所有启用的日志目标。注意,日志记录包括完整的命令行,包括密码。如果daemon startup选项–command log always用于启动daemon,则此命令在默认情况下处于打开状态,不能关闭,并且不允许使用[no]形式的命令。
log commands

# 此命令强制在特定字符串上筛选日志。只有当日志消息与日志筛选器表中的某个筛选器匹配时,才会打印该日志消息。可以独立于守护进程。
log-filter WORD [DAEMON]

注意: 日志过滤器在您需要打开在系统上造成重大负载的调试时很有帮助(启用某些调试可能会使FRR停止)。日志过滤器可以防止这种情况发生,但是由于过滤所有这些日志,您仍然应该期望性能受到小的影响。

# 此命令清除日志筛选器表中的所有当前筛选器。可以独立于守护进程。
log-filter clear [DAEMON]

# 加密密码。
service password-encryption

# 启用高级模式VTY。
service advanced-vty

# 设置系统范围的line 配置。此配置命令适用于所有VTY接口。
service terminal-length (0-512)

# 进入vty配置模式。
line vty

# 设置默认motd字符串。
banner motd default

# 从文件中设置motd字符串。文件必须位于--sysconfdir下指定的目录中。
banner motd file FILE

# 从输入设置motd字符串。
banner motd line LINE

# 设置VTY连接超时值。当只指定一个参数时,它将用于以分钟为单位的超时值。可选的第二个参数用于以秒为单位的超时值。默认超时值为10分钟。当超时值为零时,表示没有超时。
不设置此值或将值设置为0表示将不启用超时。
exec-timeout MINUTE [SECOND]

# 使用访问列表限制vty连接。
access-class ACCESS-LIST