BIRD3.0手册(二)配置
前一篇译文主要介绍了BIRD的基本概念和架构。本篇则对于其配置进行介绍。
3.配置
3.1 介绍
BIRD使用文本配置文件进行配置。启动时,BIRD会读取prefix/etc/bird.conf
(除非指定了-c
)。修改配置文件后向BIRD发送SIGHUP
信号,它将调整到新配置。此外,还可以使用客户端与BIRD进行交互。
在配置中,使用#及/* */进行注释,空白字符被当作单个空格。如果有可变数量的选项,它们使用{ }分成组,每个选项都以;结尾。配置区分大小写。有两种方式命名符号,可以使用以字母或下划线开头并由字母、数字和下划线组成的简单字符串,也可以将名称括在单引号’中从而使用数字、字母、下划线、连字符、点和冒号的任意组合。
下面是一个简单配置文件示例。它启用了路由表与OS内核的同步,学习网络接口,并在所有找到的网络接口上运行RIP。
1 | protocol kernel { |
3.2 全局选项
include "文件名";
这个语句用来包含文件。文件名可以是通配符,此时匹配到的文件按字母序包含。包含嵌套深度最大是8。需要注意该语句可以在配置文件任何位置使用,甚至在其他的选项内部,但始终在行首。下面的例子中,第一个分号属于include语句,第二个分号属于
ipv6 table
。如果tablename.conf
恰好包含一个token(表的名称),这个结构是正确的。
1
2 ipv6 table
include "tablename.conf";;
log "文件名" [大小限制 "备份文件名"] | fixed "文件名" 大小 | syslog [name 名称] | stderr | udp 地址 [port 端口] all|{类别列表}
将给定类别消息日志记录到选择的目标:指定文件名的文件(可包含日志轮换信息)、syslog(可包含名称参数)、标准错误输出、UDP消息(采用RFC3164 syslog格式)。
类别包括:
info
、warning
、error
、fatal
是本地问题消息,debug
是调试消息,trace
是网络中发生的情况,remote
是远程机器异常行为的消息,auth
是认证失败,bug
是BIRD内部错误.直接记录到文件支持基础日志轮换,设置日志文件大小限制和备份文件名,当日志文件达到限制时当前日志文件被重命名为备份文件名,并创建一个新的日志文件。也可以将日志记录到表现为环形缓冲区的固定大小单个文件中。
可以指定多个
log
行来将日志记录到多个目标。默认配置:将所有内容记录到系统日志,当通过-d
/-D
命令行选项启用了调试则记录到调试输出。
debug protocols all|off|{states|routes|filters|interfaces|events|packets [, ...]}
设置协议调试选项的全局默认值。详见后面小节的debug。默认值:off
debug channels all|off|{ states|routes|filters|events [, ...] }
设置通道调试选项的全局默认值。详见后面小节的debug。默认值:off
debug tables all|off|{ states|routes|filters|events [, ...] }
设置表调试选项的全局默认值。详见后面小节的debug。默认值:off
debug commands 数值
控制客户端连接的日志记录(0代表不记录,1代表记录连接和断开,2及以上记录所有客户端命令)。默认值:0
debug latency all|off|{ ping|wakeup|scheduling|sockets|events|timers }
激活内部调度器动作跟踪。是用于处理内部事件丢失的开发人员和技术支持工具,除非知道自己在做什么,否则应将其保持关闭。默认值:off
debug latency limit 时间
如果debug latency启用,该选项允许指定一个过期时间限制,超过限制的事件被记录。默认值:1s
watchdog warning 时间
设置IO环路周期时间限制,如果一个迭代需要更多时间完成,记录一个警告。默认值:5s
watchdog timeout 时间
设置IO环路周期时间限制,如果违反限制BIRD被终止信号杀死。超时颗粒度为秒,0代表禁用。默认值:0
threads 数值
设置BIRD应生成多少工作线程。测试显示每个线程可以利用一个完整CPU核心,因此应当保留至少一个空闲核心。最大可行线程数很大程度取决于实际负载,必须通过测试或估算确定。默认值:1
mrtdump "文件名"
设置MRTdump文件名,启用MRTdump特性必须指定该选项。默认值:无dump文件
mrtdump protocols all|off|{ states|messages [, ...] }
设置MRTdump选项的全局默认值。详见后面小节的mrtdump。默认值:off
filter 名称 局部变量表 { 命令 }
定义一个过滤器(filter),可在后面章节了解更多。
function 名称 (参数) [ -> 返回类型 ] 局部变量表 { 命令 }
定义一个函数,可在后面章节了解更多。
protocol rip|ospf|bgp|... [名称 [from 名称2]] { 协议选项 }
定义名为名称的协议实例(未指定名称则自动生成类似”rip5”的名称)。可以在各协议自己的章节了解关于协议配置的更多信息。当使用
from 名称2
时初始协议选项从协议或者模版名称2中获取。大多数协议(如RIP或BGP)可以运行多个实例。默认未配置任何实例。
template rip|ospf|bgp|... [名称 [from 名称2]] { 协议选项 }
定义名为名称的协议模版(未指定名称则自动生成类似”bgp1”的名称)。协议模版用于当许多相似配置协议实例被定义时组织其中公共选项。协议实例和其他模版可以使用from表达式及模版名称使用模版。当前模版及from表达式未对OSPF协议实现。
define 常量 = 表达式
定义一个常量。此外,
/etc/iproute2/rt_*
文件中预定义了一些数值常量。常量定义列表(同其他符号一起)可使用show symbols命令查看。
attribute 类型 名称
声明一个自定义路由属性,可像其他路由属性一样在过滤器中设置和获取。该特性用来导入过滤器中标记路由以便导出过滤器使用,而不必使用必须在导出过滤器中删掉的本地分配BGP communities。
router id IPv4地址
设置BIRD路由器ID,作为路由器世界范围唯一识别符,通常用路由器的一个IPv4地址。默认值:非环路接口的最小IPv4地址。
router id from [-] [ "掩码" ] [ 前缀 ] [, ...]
根据接口模式指定的接口的IPv4地址来设置BIRD的路由器ID。有关带扩展子句的接口模式详细描述见接口一节。
hostname "名称"
设置主机名。默认值:
uname -n
返回的节点名
graceful restart wait 数值
优雅重启恢复过程中,BIRD会等待路由协议收敛。该选项为恢复指定一个超时时间,来防止某些协议无法收敛导致无限等待。默认值:240秒
timeformat route|protocol|base|log "格式1" [限制 "格式2"]
该选项指定BIRD使用的日期时间格式。第一个参数指定格式用途,
route
用于show route
命令输出的格式,protocol
用于show protocols
命令输出的格式,base
用于其他命令,log
用在日志文件。
"格式1"
是使用strftime(3)
符号(详见man strftime
)的格式字符串,被扩展以支持使用%f
转换代码的有可变精度(最高到微秒)的亚秒时间部分(如"%T.%3f"
是hh:mm:ss.sss
)。限制
和"格式2"
允许指定用于早于限制
秒之前的过去时间的格式。一些简写形式:
iso long
是ISO8601日期时间格式(YYYY-MMM-DD hh:mm:ss),也可以用%F %T
指定。iso long ms
和iso long us
则是带毫秒或微秒精度的ISO8601日期时间格式。iso short
是ISO8601的变体,对于过去20小时以内的时间仅使用时间格式(hh:mm:ss),对于更远时间使用日期格式(YYYY-MM-DD),相当于%T 72000 %F
的简写。此外还有对应的其高精度变体iso short ms
和iso short us
。默认BIRD对
route
和protocol
使用iso short ms
,对base
和log
使用iso long ms
。
网络类型 table 名称 [ { 选项; [...] } ]
定义一个新路由表。默认路由表
master4
和master6
隐式定义,其他路由表必须使用该选项定义。详见路由表配置一节。
mpls domain 名称 [ { 选项; [...] } ]
定义一个新MPLS域。MPLS域代表独立标签空间并负责MPLS管理。所有的MPLS感知协议都和一些MPLS域关联。详见MPLS配置一节。
eval 表达式
评估给定的过滤器表达式,用于开发人员测试过滤器。
3.3 路由表选项
大多数路由表不需要任何选项并且不带选项块地定义,但仍有一些选项可以调整路由表行为。注意隐式表(master4
和master6
)可以被重定义以设置选项。
sorted 开关
通常一个路由表只为每个网络从路由列表中选择一个选定的(最佳)路由,并保持其余路由未排序。若启用,这些路由列表将保持完全排序(根据偏好值或一些基于协议的度量)。
这是一些协议功能所需(如BGP协议的
secondary
选项,允许除接受选定的路由外还接受过滤器接受的有序列表中的第一个路由),但它与一些其他功能不兼容(如BGP协议的deterministic med
选项,它激活一种无法通过比较和排序来描述的选定路由选择方式)。一个小优点是路由在show route
时排序显示,一个小缺点则是计算开销略高。默认值:off
trie 开关
BIRD路由表使用哈希表实现,对于精确匹配查找效率很高,但对于最长匹配查找或区间查找(查找上级前缀或下级前缀)则不方便。该选项在使用哈希表精确匹配查找的同时,激活用来加速这些查找的额外的前缀树(字典树)结构。
这对RPKI(在ROA表上)、递归下一跳(在IGP表上)有利,并且为flowspec验证(在基本IP表上)所需。另一个好处是区间结果(如
show route in
命令的)是按字典顺序排序的。缺点是启用前缀树的路由表需要更多内存,尤其在多表设置时可能成为问题。默认值:off
gc threshold 数值
指定触发垃圾收集(GC)周期的移除网络最小量。默认值:1000
gc period 时间
指定连续GC周期之间时间间隔。当有大量路由撤销时GC周期会按给定时间间隔(带一些随机因素)重复执行。当只有少量更改时,GC周期不会执行。在大型路由服务器设置中,对数百个完整的BGP路由表运行GC会占用大量时间,因此它们应该使用更长的GC周期。默认值:自适应,基于配置中的路由表数量,从10s(<=25个路由表时)到600s(>=1500个路由表时)。
cork threshold 数值 数值
过多的待处理导出可能导致内存膨胀,这种情况BIRD会尝试通过暂停一些例程直至队列大小足够小来缓解内存压力。该选项允许用户设置阈值,第一个值是低阈值(何时恢复),第二个值是高阈值(何时暂停)。阈值越高使用的内存就越多,大多数情况默认值应该是合适的,但如果在导入激增时遇到内存膨胀,首先调低该选项。默认值:333300 1011010
export settle time 时间 时间
用于导出宣告的最小和最大稳定时间。当多个路由变更时,该机制会等待这些变化稳定,然后才唤醒休眠的导出线程,但如果变更持续发生BIRD不会永远等待,最多等待最大时间。默认值:1ms 100ms
route refresh export settle time 时间 时间
当任一通道当前正执行路由刷新时的用于导出宣告的最小和最大稳定时间。这在知道存在一些快速产生变更的活跃进程时能更积极地捆绑变更。如果不需要该功能,将其设置为与前面相同。默认值:100ms 3s
digest settle time 时间 时间
表变更摘要的最小和最大稳定时间。该稳定时间用于ROA表变更,包含所有变更了的ROA的前缀树会被生成,自动重载依赖通道。默认值:1s 20s
debug all|off|{ states|routes|events [, ...] }
设置表调试选项。每个表可以将一些跟踪消息写入日志。可以请求全部或者指定类型的跟踪消息:
states
用于表状态更改和辅助进程,routes
用于辅助路由通知(下一跳更新、flowspec重新验证),events
用于更详细的辅助例程调试。另详见通道调试选项。默认值:off
3.4 协议选项
对每个协议实例,可以配置一系列选项,其中一些(本节描述的)是通用的,另外一些是协议特有的(参见讨论协议的小节)。
一些选项使用开关参数,可以用on
、yes
或非零值数值表达式启用,或者用off
、no
或者计算结果为零的表达式来禁用。空开关等同于on
。
disabled switch
禁用该协议。可以通过命令行来更改禁用启用状态,而不需修改配置。禁用的协议不会被激活。默认值:协议启用
restart time limit 时间
设置协议后续自动重启的时间限制。如果协议从启动后该时间内(通过重启动作)触发限制,协议以配置文件中错误消息被禁用。这不适用于手动重启或重新配置。默认值:5s
debug all|off|{ states|routes|filters|interfaces|events|packets [, ...] }
设置协议调试选项。如果被要求,每个协议都能将其工作相关追踪消息写入日志(
trace
类别)。可以要求打印所有跟踪消息,或者打印选定类型:states
用于协议状态更改(启动、关闭、开始、停止等),routes
用于与路由表交换的路由,filters
用于路由过滤的详细信息,interfaces
用于发送给协议的接口更改事件,events
用于协议内部事件,packets
用于协议发送和接收的数据包。routes
和filters
类别也可以使用通道调试选项分通道设置。默认值:off
mrtdump all|off|{ states|messages [, ...] }
设置协议MRTdump标志。MRTdump是用来记录路由协议和守护进程信息的一种标准二进制格式。这些标志控制从协议记录到(由此前小节中全局
mrtdump
选项指定的)MRTdump文件中的信息类型。尽管这些标志与debug
选项类似,但其含义不同且协议特定。对于BGP协议,states
记录BGP状态更改,messages
记录收到的BGP消息。其他协议尚不支持MRTdump。
router id IPv4地址
该选项用来对给定协议覆盖全局的路由器ID。默认值:使用全局路由器ID。
description "文本"
协议的可选描述。作为
show protocols all
命令的一部分输出。
vrf "文本"|default
将协议与指定的VRF关联。协议将被限制到分配给该VRF的接口,并使用绑定到该VRF的socket。相应的VRF接口必须在OS级别存在。对于内核协议仍必须通过表选项显式地选择一个合适的表。
选择
default
时,协议与默认VRF关联,即被限制到未分配任何常规VRF的接口。这与完全不指定vrf选项不同,完全不指定vrf选项时协议可以使用任何接口而无论其VRF状态。请注意正确的VRF支持需要使用至少4.14版本Linux内核,旧版本的VRF实现有限。在Linux5.0内核之前,绑定到默认VRF一个端口的socket会和常规VRF中其他socket冲突。在BGP中可以通过使用
strict bind
选项避免。
channel 名称 [{通道配置}]
每个通道必须明确声明。支持的通道名称列表请见特定协议的配置。关于通道的定义请见通道配置一节。
下面是一些只对特定协议有意义的选项:
interface [-] [ "掩码" ] [ 前缀 ] [, ...] [ { 选项; [...] } ]
指定协议只在指定的一组接口上生效的特定接口选项。这组接口用接口模式描述的接口选项来指定。接口模式由一系列用逗号分隔的子句组成,每个子句都是使用shell样式模式来指定的掩码。接口通过其名称进行匹配。
当匹配任一子句时接口匹配该模式。子句以
-
开头时则匹配的接口被排除。模式从左向右处理,因此interface "eth0", -"eth*", "*";
表示eth0和所有非以太网接口。一些协议(即OSPFv2和Direct)支持扩展子句,可以包含掩码、前缀或两者。当接口名称匹配掩码(如果指定了)且其地址匹配前缀(如果指定了)时该接口匹配此子句。当协议独立处理接口上多个地址时使用扩展子句。
一个
interface
选项可以带上不同接口特定选项使用多次,此时对于给定接口使用第一个匹配的interface
选项。该选项允许在Babel、BFD、Device、Direct、OSPF、RAdv、RIP这些协议使用,在OSPF协议中用于
area
子项。默认值:无。
一些示例:
interface "*" { type broadcast; };
协议在所有接口上启动并带type broadcast
选项。interface "eth1", "eth4", "eth5" { type ptp; };
在列出的3个eth接口上启动协议,并带有type ptp
选项。
interface -192.168.1.0/24, 192.168.0.0/16;
在所有地址在192.168.0.0/16但不在192.168.1.0/24内的接口上启动协议。
interface "eth*" 192.168.1.0/24;
在所有地址在192.168.1.0/24内的以太网口上启动协议。
tx class|dscp 数值
该选项指定出站协议数据包IP报头中ToS/DS/Class字段值。这可能会影响相较于其他网络流量该协议数据包的处理方式。使用
class
关键字,数值(0-255)用于整个ToS/Class八位(保留给ECN的两位被忽略)。使用dscp
关键字,数值(0-63)仅用于八位中的DS字段。默认值:0xc0 (DSCP 0x30 - CS6)。
tx priority 数值
该选项指定本地数据包优先级。可能影响协议数据包在本地TX队列中如何处理。该选项是Linux特定的。默认值:7(最高优先级,特权流量)。
password "口令" | 字节字符串 [ { 口令选项 } ]
指定可被协议用作共享密钥的口令。口令选项可以使用多次来指定更多口令。如果指定了多个口令,真正用哪一个取决于协议。指定口令并不意味着验证被启用,认证可使用单独的基于协议的验证选项来启用。
一个口令可以是字符串或十六进制数字对序列(即bytestring类型)。
选项可用于BFD、OSPF、RIP、Babel协议。BGP也有
password
选项,但有些不同并单独描述。默认值:无。
口令选项可包含一些(不必全部)口令子选项如下:
id 数值
口令的ID(0-255)。如果未指定,BIRD会从1开始按口令项目在接口中的顺序进行选择。比如,在一个接口中的第二个口令项目将有默认的ID 2.ID 0被BIRD允许,但是其他一些实现可能不允许它。ID被一些路由协议用来识别哪个口令用于验证协议数据包。
generate from "时间"
使用密码进行数据包签名的开始时间,时间格式为YYYY-MM-DD [hh:mm:ss[.sss]]
generate to "时间"
使用密码进行数据包签名的结束时间。
accept from "时间"
使用密码进行数据包验证的开始时间。
accept to "时间"
使用密码进行数据包验证的结束时间。
from "时间"
同时设置
generate from
和accept from
的简写。
to "时间"
同时设置
generate to
和accept to
的简写。
algorithm ( keyed md5 | keyed sha1 | hmac sha1 | hmac sha256 | hmac sha384 | hmac sha512 | blake2s128 | blake2s256 | blake2b256 | blake2b512 )
当启用加密认证时密码的消息认证算法。默认值取决于协议。对于RIP和OSPFv2是Keyed-MD5,对OSPFv3和Babel是HMAC-SHA-256。
3.5 通道选项
每个通道都属于一个协议并在其块内配置。最小的通道配置为空,此时将使用默认值。通道的名称暗示其网络类型。通道的定义可以从协议模版继承。禁止对同一通道多次定义,但继承自模版的通道可以被新定义更新。
debug all|off|{ states|routes|filters [, ...] }
设置通道调式选项。如同协议调试,通道可以将它工作跟踪消息带trace类别写入日志。你可以请求打印所有跟踪消息也可以只对选择类型:
states
对应通道状态变更(通道启动、关闭、馈送、重新加载等),routes
对应通过通道传播的路由,filters
对应路由过滤的详情,其余调试标志不在通道调试中使用。默认值:off
table 名称
指定通道连接的表。默认值:给定网络类型的第一个表。
preference 表达式
设置由协议生成并通过该通道导入的路由的偏好值。默认值:依协议而定。
import all | none | filter 名称 | filter { 过滤器命令 } | where 过滤器布尔表达式
指定过滤器来过滤从协议导入到路由表的路由。
all
是保留所有路由,none
是丢弃所有路由。默认值:all (EBGP除外)
export [ in 前缀 ] 过滤器
与
import
关键字类似,只是工作在路由表到协议方向。如果使用in
关键词,则只在给定前缀内的路由会被导出。其余路由被完全忽略(即无日志与统计)。默认值:none (除了EBGP和L3VPN)。
import keep filtered 开关
通常当导入过滤器拒绝路由时该路由被忘掉,当此选项激活是,这些路由则会保留在路由表中但被隐藏而不被传播到其他协议。但可以使用
show route filtered
显示它们。注意该选项对pipe协议无效。默认值:off
rpki reload 开关
导入导出过滤器可能依赖于路由RPKI状态(使用
roa_check()
或aspa_check()
运算符)。与其他过滤器运算符不同,同一路由的该状态可能随着ROA和ASPA表内容变更而改变。当该选项激活,每当ROA和ASPA表更新(短暂稳定时间之后)BIRD自动重载由通道导入或导出前缀的子网。当禁用时,必须手动请求路由重载。通道过滤器中未使用roa_check()
和aspa_check()
时忽略此选项。请注意BGP通道自动重载需要导入表或导出表。 默认值:on
import limit [数值 | off ] [action warn | block | restart | disable]
指定从协议导入最大路由数量限制,及当达到限制时的动作。warn动作只打印警告日志消息。block动作丢弃来自协议的新路由。restart动作和disable动作如相应命令一样关闭协议。如果不显示指明,默认动作时disable。需注意限制在协议重配置、重载、重启时进行重置。默认:off
receive limit [数值 | off ] [action warn | block | restart | disable]
指定从协议接收记忆的最大路由数量限制。该选项作用几乎与
import limit
选项一致,唯一的不同是如果import keep filtered
选项是激活的,被过滤路由将计入限制并忘记阻止的路由。该选项是避免路由表溢出,与此相反,前面的导入限制只计数接受的路由,被限制阻止的路由同被过滤路由一样处理。默认:off
export limit [ 数值 | off ] [action warn | block | restart | disable]
指定导出到协议的路由限制。该选项是实验性的,其行为细节存在一些问题:在协议重载过程中,导入的路由数量能临时超过限额而不触发限制,导出的路由计数器忽略路由阻止并且阻止动作也阻止已接受路由的更新。这些可能在未来改变。默认:off
export block 数值
设置在馈送(feeding)时或选择了
merge paths
或secondary
时,一次性导出的最小路由数量。这会影响整体延迟。当导出过滤器开销非常大时,处理整个路由块可能花费太多时间,这种情况下,可能需要缩小该值来提高响应能力。默认值:16384
这是一个为所有接口上IPv6配置的RIP的简单例子:
1 | protocol rip ng { |
这是一个稍复杂些的例子:
1 | protocol rip ng { |
这是一个使用了模板的更复杂的例子:
1 | template bgp { |
3.6 MPLS选项
MPLS域定义对于MPLS路由器是强制性的。所有MPLS通道和MPLS感知协议都与MPLS域关联(尽管通常隐性与唯一一个关联)。在MPLS域定义中可以配置MPLS标签分配细节。目前只有标签范围一个选项。
请注意,MPLS子系统是实验性的,未来可能会存在向后不兼容的改变。
label range 名称 { start 数值; length 数值; [...] }
定义一个新标签范围,或重新定义隐式标签范围
static
和dynamic
。MPLS通道使用配置的标签范围进行动态标签分配,而static
标签范围用于静态标签分配。标签范围定义必须指定该范围的界限。默认情况,static
范围是16-1000,而dynamic
范围是1000-10000.
除了常规通道之外每个MPLS感知协议中应当定义MPLS通道。它负责标签分配及向MPLS路由表宣告MPLS路由。除了常见通道选项外,MPLS通道有一些特定选项:
domain 名称
指定通道和协议所属的MPLS域。默认值:第一个定义的MPLS域。
label range 名称
使用指定标签范围来动态标签分配。注意静态标签总是使用
static
范围。默认值:dynamic
范围。
label policy static|prefix|aggregate|vrf
标签策略指定了路由如何分组到FEC(转发等价类)以及如何为它们分配标签。
static
策略指不进行动态标签分配,且必须在导入过滤器使用路由属性mpls_label
设置静态标签。
prefix
策略指每个前缀使用与该前缀关联的单独标签。当带标签路由更新时,它保留该标签。此策略适用于IGP。
aggregate
策略指路由根据它们下一跳(包括下一跳标签)分组到FEC,且同个FEC中所有路由使用一个标签。当带标签路由更新时,它可能改变下一跳、FEC,从而改变标签。此策略适用于BGP。
vrf
策略仅在L3VPN协议有效。它为来自一个VRF的所有路由使用一个标签,同时用在VRF中查找替换原始下一跳。默认值:prefix
这是MPLS设置的一个简单例子:
1 | mpls domain mdom { |