以下各节讨论所有路由守护进程通用的命令。
Config Commands
在配置文件中,可以写入调试选项、vty的密码、路由守护程序配置、日志文件名等。此信息形成路由beast启动时的初始命令集。
配置文件通常位于/etc/frr中。
Config Methods
配置FRR有两种方法。
传统上,每个守护进程都有自己的配置文件。守护程序名plus.conf是默认的配置文件名。例如,zebra的默认配置文件是zebra.conf。此方法已弃用。
由于这会创建大量的配置文件,而且一个守护进程倾向于依赖其他守护进程来实现某些功能,因此大多数部署现在都使用“集成”配置。在这个设置中,所有配置都放在一个文件中,典型的/etc/frr/frr.conf
。当使用init脚本或systemd启动FRR时,会调用vtysh来读取配置文件,并仅将适当的部分发送给感兴趣的守护进程。使用vtysh将正在运行的配置更新保存回这个文件。这是推荐的方法。要使用此方法,请将以下行添加到/etc/frr/vtysh.conf文件:
service integrated-vtysh-config
如果您是从源代码安装的,或者使用了一个包,这可能已经存在了。
如果需要,可以在启动守护程序时使用-f或 --config_file
文件选项指定配置文件。
Basic Config Commands
- hostname HOSTNAME
设置路由器的主机名。
- password PASSWORD
为vty接口设置密码。命令的no形式删除密码。如果没有密码,vty将不接受连接。
- enable password PASSWORD
设置启用密码。命令的no形式将删除启用密码。
- log trap LEVEL
这些命令已弃用,仅用于历史兼容性。log trap命令为所有启用的日志记录目标设置当前日志记录级别,并为所有未指定级别的未来日志记录命令设置默认值。正常的默认日志记录级别是调试。命令的no形式将未来日志记录命令的默认级别重置为调试,但它不会更改现有日志记录目标的日志记录级别。
- log stdout LEVEL
启用到标准输出的日志输出。如果指定日志级别的可选第二个参数不存在,则将使用默认日志级别(通常是调试)。命令的no形式禁止记录到stdout。LEVEL参数必须具有以下值之一:紧急情况、警报、严重错误、错误、警告、通知、信息或调试。请注意,现有代码记录了最重要的消息,其中包含严重性错误。
警告
FRRouting使用writev()系统调用来写入日志消息。这个调用应该是原子的,但实际上,这并不适用于管道或终端,只保留常规文件。这意味着在极少情况下,来自不同线程的并发日志消息可能会在终端输出中被混淆。如果你的设置不能接受这个极少情况,请使用日志文件和tail-f。
- log file [FILENAME [LEVEL]]
如果要登录到文件,请指定文件名,如下例所示:
log file /var/log/frr/bgpd.log informational
如果指定日志记录级别的可选第二个参数不存在,则将使用默认日志记录级别(通常是调试级别,但可以使用不推荐使用的log trap命令进行更改)。命令的no形式禁止记录到文件。
- log syslog [LEVEL]
启用到syslog的日志输出。如果指定日志记录级别的可选第二个参数不存在,则将使用默认日志记录级别(通常是调试级别,但可以使用不推荐使用的log trap命令进行更改)。命令的no形式禁止记录到syslog。
- log monitor [LEVEL]
使用terminal monitor命令启用到已启用日志记录的vty终端的日志记录输出。默认情况下,在调试级别启用监视器日志记录,但此命令(或不推荐使用的log trap命令)可用于更改监视器日志记录级别。如果指定日志级别的可选第二个参数不存在,则将使用默认日志级别(通常是调试)。命令的no形式禁止记录到终端监视器。
- log facility [FACILITY]
此命令更改syslog消息中使用的工具。默认工具是daemon。命令的no形式将设施重置为默认的守护程序设施。
- log record-priority
要在记录到文件、标准输出或终端监视器(即除syslog以外的任何消息)的所有消息中包含严重性,请使用log record priority全局配置命令。要禁用此选项,请使用命令的no形式。默认情况下,严重性级别不包括在记录的消息中。注意:某些版本的syslogd可以配置为在发出的消息中包含facility和level。
- log timestamp precision [(0-6)]
此命令将日志消息时间戳的精度设置为小数点后的给定位数。目前,该值必须在0到6之间(即最大精度为微秒)。要恢复默认行为(1秒精度),请使用命令的no形式,或将精度显式设置为0。
log timestamp precision 3
在本例中,精度设置为提供毫秒精度的时间戳。
- log commands
此命令允许将用户键入的所有命令记录到所有启用的日志目标。注意,日志记录包括完整的命令行,包括密码。如果daemon startup选项–command log always用于启动daemon,则此命令在默认情况下处于打开状态,不能关闭,并且不允许使用[no]形式的命令。
- log-filter WORD [DAEMON]
此命令强制在特定字符串上筛选日志。只有当日志消息与日志筛选器表中的某个筛选器匹配时,才会打印该日志消息。可以独立于守护进程。
注意
日志过滤器在您需要打开在系统上造成重大负载的调试时很有帮助(启用某些调试可能会使FRR停止)。日志过滤器可以防止这种情况发生,但是由于过滤所有这些日志,您仍然应该期望性能受到小的影响。
- log-filter clear [DAEMON]
此命令清除日志筛选器表中的所有当前筛选器。可以独立于守护进程。
- service password-encryption
加密密码。
- service advanced-vty
启用高级模式VTY。
- service terminal-length (0-512)
设置系统范围的line 配置。此配置命令适用于所有VTY接口。
- line vty
进入vty配置模式。
- banner motd default
设置默认motd字符串。
- banner motd file FILE
从文件中设置motd字符串。文件必须位于--sysconfdir下指定的目录中。
- banner motd line LINE
从输入设置motd字符串。
- exec-timeout MINUTE [SECOND]
设置VTY连接超时值。当只指定一个参数时,它将用于以分钟为单位的超时值。可选的第二个参数用于以秒为单位的超时值。默认超时值为10分钟。当超时值为零时,表示没有超时。
不设置此值或将值设置为0表示将不启用超时。
- access-class ACCESS-LIST
使用访问列表限制vty连接。
Sample Config File
下面是zebra守护进程的示例配置文件。
!
! Zebra configuration file
!
frr version 6.0
frr defaults traditional
!
hostname Router
password zebra
enable password zebra
!
log stdout
!
!
! 和#是注释字符。如果单词的第一个字符是注释字符之一,则从该行的其余部分开始,将作为注释忽略。
password zebra!password
如果注释字符不是单词的第一个字符,那么它是一个普通字符。所以在上面的例子中!不会被视为一个评论和密码设置为zebra!密码。
Configuration versioning, profiles and upgrade behavior
所有frr守护进程共享一种机制,用于指定用于加载和保存配置的配置配置文件和版本。根据所选的配置文件和版本,特定的配置设置采用不同的默认值。
虽然概要文件可以由用户配置选择,并且在升级过程中会保持不变,但是frr将始终使用其当前版本编写配置。这意味着,升级后,写入文件可能会写出与读入的配置稍有不同的配置。
由于以前的配置是用其版本的默认值加载的,而新配置是用新的默认值写入的,因此在版本之间更改的任何默认值都将导致写出相应的配置条目。路由配置是粘性的,在升级过程中保持一致。更改的默认值只会影响新配置。
注意,加载的版本将继续存在于交互配置会话中。在交互配置会话中执行的命令与启动时加载的配置没有任何不同。这意味着,当配置新的BGP对等机时,用于配置的默认值是最后一个frr版本命令选择的默认值。
警告
保存配置不会使守护程序向前跳转以使用新版本作为其默认值,但重新启动它们会这样做,因为它们随后将应用已写出的new frr version命令。在show running config中手动执行frr version命令以避免这种中间状态。
这在ShowRunning config中可见:
Current configuration:
!
! loaded from 6.0
frr version 6.1-dev
frr defaults traditional
!
如果保存并重新启动此配置,则旧的默认设置将不再适用。类似地,您可以执行frr version6.1-dev,从而应用新的默认值,并且从6.0加载的注释消失。
Profiles
frr提供配置概要文件,以使其默认设置适应各种使用场景。目前,实施了以下配置文件:
traditional
- 反映了主要遵循IETF标准或广域网路由的常见习惯的默认值。datacenter
- 使用攻击性计时器反映具有域内链接的单个管理域。
您的发行版/安装版可以通过所有守护程序上的-F命令行选项预先设置配置文件。必须为同一配置文件配置所有守护程序。命令行上指定的值只是一个预设值,配置中的任何frr defaults语句都将优先。
注意
所有守护进程的配置文件必须相同。不匹配可能导致未定义的行为。
您可以在配置文件之间自由切换,而不会造成任何中断或配置更改。所有设置都保持以前的值,并且show running configuration output将有新的输出,将以前的默认值列为显式配置。新配置(例如添加BGP对等)将使用新的默认值。要为现有配置应用新的默认值,必须从配置中删除现在显示的以前不可见的旧默认值。
交互式配置的升级实践
如果以交互方式配置frr并使用配置写入功能使更改保持不变,则以下建议适用于升级:
- 跳过主要版本通常是可行的,但仍然是不可取的。为了避免不必要的问题,一次升级一个主要版本,并在每次更新后写出配置。
- 安装新的frr版本后,请检查配置是否与旧配置存在差异。如果更改了任何影响设置的默认值,行可能会出现或消失。如果出现新行,则它以前是默认的(或不受支持),现在需要保留以前的行为。如果一行消失,它以前不是默认值,但现在是,因此不再需要。
- 使用grep-i deprecat检查日志文件中是否有弃用警告。
- 完成每次升级后,保存配置并重新启动frr或执行frr version<CURRENT>以确保完全应用新版本的默认值。
自动生成配置的升级实践
将frr与生成的配置(如Ansible、Puppet等)一起使用时,升级注意事项有所不同:
- 在生成的配置中,始终写出frr版本语句。这确保默认值始终应用。
- 尝试不运行比必要更不同版本的frr。每个版本可能需要单独检查。如果运行较旧和较新安装的混合,请使用frr版本语句的最旧版本。
- 在推出升级时,使用旧版本标识符生成一个配置,并加载它。检查是否存在任何差异或否决警告。如果配置存在差异,请将这些内容传播回配置生成器,以最小化对实际默认值的依赖。
- 在删除旧版本的最后一次安装后,将配置生成更改为相应的较新frr版本。执行与推出升级时相同的检查。
Terminal Mode Commands
- write terminal
显示vty接口的当前配置。
- write file
将当前配置写入配置文件。
- configure [terminal]
切换到配置模式。此命令是配置的第一步。
- terminal length (0-512)
将终端显示长度设置为(0-512)。如果长度为0,则不执行显示控制。
- who
显示当前连接的vty会话的列表。
- list
列出所有可用命令。
- show version
显示frr的当前版本及其生成主机信息。
- show logging
显示日志系统的当前配置。这包括所有日志目的地的状态。
- show log-filter
显示应用于每个守护程序的当前日志筛选器。
- show memory
显示frr中哪些特定事物使用了多少内存的信息。输出可能因系统功能而异,但通常如下所示:
frr# show memory
System allocator statistics:
Total heap allocated: 1584 KiB
Holding block headers: 0 bytes
Used small blocks: 0 bytes
Used ordinary blocks: 1484 KiB
Free small blocks: 2096 bytes
Free ordinary blocks: 100 KiB
Ordinary blocks: 2
Small blocks: 60
Holding blocks: 0
(see system documentation for 'mallinfo' for meaning)
--- qmem libfrr ---
Buffer : 3 24 72
Buffer data : 1 4120 4120
Host config : 3 (variably sized) 72
Command Tokens : 3427 72 247160
Command Token Text : 2555 (variably sized) 83720
Command Token Help : 2555 (variably sized) 61720
Command Argument : 2 (variably sized) 48
Command Argument Name : 641 (variably sized) 15672
[...]
--- qmem Label Manager ---
--- qmem zebra ---
ZEBRA VRF : 1 912 920
Route Entry : 11 80 968
Static route : 1 192 200
RIB destination : 8 48 448
RIB table info : 4 16 96
Nexthop tracking object : 1 200 200
Zebra Name Space : 1 312 312
--- qmem Table Manager ---
要了解系统分配器统计信息,请参阅系统的mallinfo(3)手册页。
在这些统计信息的下面,打印了关于frr中各个内存分配类型(所谓的MTYPEs)的统计信息:
- 第一列数字是为该类型分配的当前计数(释放项时该数字会减少)
- 第二列是每个项目的大小。只有在类型上的分配总是使用相同的大小时,此选项才可用。
- 第三列是为特定类型分配的内存总量,包括malloc应用的填充。这意味着数字可能大于第一列乘以第二列。malloc簿记所产生的开销不包括在本表中,如果系统支持不可用,则该列可能会丢失。
从vtysh执行此命令时,将按顺序打印每个守护进程的内存使用情况。
- show history
显示vtysh cli历史记录。
- logmsg LEVEL MESSAGE
向为给定严重性的消息启用的所有日志记录目标发送消息。
- find COMMAND...
此命令在所有模式下对所有定义的命令执行简单的子字符串搜索。例如,假设您处于启用模式,并且记不起打开OSPF段路由的命令是:
frr# find segment-routing on
(ospf) segment-routing on
CLI模式显示在每个命令旁边。在本例中,段路由在路由器ospf模式下。
类似地,假设您需要包含“l2vpn”的所有命令的列表:
frr# find l2vpn
(view) show [ip] bgp l2vpn evpn [json]
(view) show [ip] bgp l2vpn evpn all <A.B.C.D|A.B.C.D/M> [json]
(view) show [ip] bgp l2vpn evpn all neighbors A.B.C.D advertised-routes [json]
(view) show [ip] bgp l2vpn evpn all neighbors A.B.C.D routes [json]
(view) show [ip] bgp l2vpn evpn all overlay
...
- show thread cpu [r|w|t|e|x]
此命令显示所有不同事件类型的系统运行统计信息。如果未指定任何选项,则所有不同的运行类型将一起显示。此外,您还可以要求查看(r)ead,(w)rite,(t)imer,(e)vent和e(x)ecute线程事件类型。如果您已编译了禁用cpu时间,则此命令将不会显示。
- show thread poll
此命令显示FRR的轮询数据。它让我们可以一瞥到我们是如何设置每个单独的fd在该时间点的poll命令。
常用调用选项
这些选项适用于所有frr守护进程。
-d
,
--daemon
在守护程序模式下运行。
-f
,
--config_file
<file>
设置配置文件名。
-h
,
--help
显示此帮助并退出。
-i
,
--pid_file
<file>
启动时,守护进程的进程标识符将写入文件,通常在/var/run中。init系统可以使用此文件实现诸如…/init.d/zebra status、/init.d/zebra restart或…/init.d/zebra stop等命令。
文件名是一个运行时选项,而不是一个配置时选项,以便可以同时运行多个路由守护进程。这在使用frr实现布线观察镜时非常有用。一台机器可以用来从网络中的不同点收集不同的路由视图。
-A
,
--vty_addr
<address>
设置要绑定到的VTY本地地址。如果设置,VTY套接字将仅绑定到此地址。
-P
,
--vty_port
<port>
设置VTY TCP端口号。如果设置为0,则不会打开TCP VTY套接字。
-u
<user>
设置要作为运行的用户和组。
-N
<namespace>
设置守护进程将在其中运行的命名空间。一个“/<namespace>”将添加到所有使用statedir的文件中。如果将“/var/run/frr”作为默认statedir,那么它将变成“/var/run/frr/<namespace>”。
-v
,
--version
打印程序版本。
- --command-log-always
使守护进程始终记录输入到指定日志文件的命令。这也使得no log命令命令不允许出现。如果您需要跟踪操作员在该路由器上正在做什么,建议启用此选项。
--log
<stdout|syslog|file:/path/to/log/file>
初始化守护程序时,将日志设置为转到stdout、syslog或文件。这些值将作为显示运行的一部分显示。此外,如果需要,可以通过普通的日志命令在运行时重写它们。
--log-level
<emergencies|alerts|critical|errors|warnings|notifications|informational|debugging>
初始化守护程序时,允许在启动时从指定的级别之一指定默认日志级别。
- --tcli
启用事务CLI模式。
--limit-fds
<number>
限制FRR守护进程将在内部使用的文件描述符的数量。默认情况下,守护进程使用系统ulimit值。
Loadable Module Support
FRR支持在启动时加载扩展模块。不支持在运行时加载、重新加载或卸载模块。要加载模块,请在守护程序启动时使用以下命令行选项:
-M
,
--module
<module:options>
加载指定的模块,可以选择向其传递选项。如果模块名包含斜杠(/),则假定它是要加载的文件的完整路径名。如果它不包含斜杠,则在/usr/lib/frr/modules目录中搜索具有给定名称的模块;首先在daemon名称前面加上前缀(例如,zebra\u mod代表mod),然后不加daemon名称。
此选项在所有守护程序上都可用,但某些守护程序可能没有任何可供加载的模块。
The SNMP Module
如果在编译时启用了SNMP并将其作为包的一部分安装,则可以为Zebra、bgpd、ospfd、ospf6d和ripd守护程序加载SNMP模块。
模块忽略传递给它的任何选项。有关其用法的信息,请参阅SNMP支持。
The FPM Module
如果在编译时启用了FPM并将其作为包的一部分安装,则可以为zebra守护进程加载FPM模块。这提供了转发平面管理器(“FPM”)API。
模块要求其参数为Netlink或protobuf,指定要使用的封装。Netlink是默认值,如果模块是在不支持protobuf的情况下生成的,protobuf可能不可用。有关更多信息,请参阅zebra FIB push接口。
Virtual Terminal Interfaces
VTY–虚拟终端[aka TeletYpe]接口是用于用户与路由守护进程交互的命令行接口(CLI)。
VTY Overview
VTY代表虚拟电传接口。这意味着您可以通过telnet协议连接到守护进程。
要启用VTY接口,必须设置VTY密码。如果没有VTY密码,就根本无法连接到VTY接口。
% telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello, this is |PACKAGE_NAME| (version |PACKAGE_VERSION|)
|COPYRIGHT_STR|
User Access Verification
Password: XXXXX
Router> ?
enable . . . Turn on privileged commands
exit . . . Exit current mode and down to previous mode
help . . . Description of the interactive help system
list . . . Print command list
show . . . Show system inform
wh. . . Display who is on a vty
Router> enable
Password: XXXXX
Router# configure terminal
Router(config)# interface eth0
Router(config-if)# ip address 10.0.0.1/8
Router(config-if)# ^Z
Router#
VTY Modes
有三种基本的VTY模式:
有些命令可能仅限于特定的VTY模式。
- VTY View Mode
此模式用于对CLI的只读访问。您可以通过离开系统或进入启用模式退出该模式。
- VTY Enable Mode
此模式用于对CLI进行读写访问。您可以通过离开系统或转义到查看模式来退出该模式。
- VTY Other Modes
此页用于描述其他模式。
VTY CLI Commands
以下三个子节描述了您在命令行中可能使用的命令。
CLI移动命令
这些命令用于移动CLI光标。C字符表示按下控制键。
- C-f / LEFT
向前移动一个字符。
- C-b / RIGHT
向后移动一个字符。
- M-f
前进一个字。
- M-b
向后移动一个单词。
- C-a
移到行的开头。
- C-e
移动到线的末尾。
CLI Editing Commands
这些命令用于编辑行上的文本。C字符表示按下控制键。
- C-h / DEL
删除点之前的字符。
- C-d
删除点后的字符。
- M-d
Forward kill word.
- C-w
Backward kill word.
- C-k
Kill to the end of the line.
- C-u
Kill line from the beginning, erasing input.
- C-t
Transpose character.
CLI Advanced Commands
还有几个用于命令行完成、insta help和VTY会话管理的其他CLI命令。
- C-c
Interrupt current input and moves to the next line.
- C-z
End current configuration session and move to top node.
- C-n / DOWN
Move down to next line in the history buffer.
- C-p / UP
Move up to previous line in the history buffer.
- TAB
Use command line completion by typing TAB.
- ?
You can use command line help by typing help
at the beginning of the line. Typing ? at any point in the line will show possible completions.
Pipe Actions
VTY支持命令末尾的可选修饰符,这些修饰符对命令输出执行后处理或修改命令的操作。这些不会出现在地图上吗?或选项卡建议列表。
- ... | include REGEX
过滤前面命令的输出,只包括与POSIX扩展正则表达式REGEX匹配的行。不要用引号引regex。
示例:
frr# show ip bgp sum json | include remoteAs
"remoteAs":0,
"remoteAs":455,
"remoteAs":99,
frr# show run | include neigh.*[0-9]{2}\.0\.[2-4]\.[0-9]*
neighbor 10.0.2.106 remote-as 99
neighbor 10.0.2.107 remote-as 99
neighbor 10.0.2.108 remote-as 99
neighbor 10.0.2.109 remote-as 99
neighbor 10.0.2.110 remote-as 99
neighbor 10.0.3.111 remote-as 111