Eki
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
在本文中,我们将介绍 BIRD 的过滤器与函数,包括过滤器的作用与实现、函数功能等内容。
BIRD 内置了一个简单的编程语言,这个语言里有两种类型的对象:
过滤器是控制路由流入与流出的 BIRD 关键组件。
当一条路由在不同协议和路由表间交换时,BIRD 的核心模块会解析与该路由相关的过滤器,并按照过滤器定义的规则处理路由。
这些处理包括根据路由的多种属性做出判断,根据需要编辑部分属性。
最终,过滤器将决定是否 接受 (accept) 该路由并将其传递到目标路由交换,或是 拒绝 (reject) 它。
在过滤器的语言中,虽然允许使用 if 和 switch 等控制结构,但 不允许存在循环。
一个具体的包含各种功能的过滤器示例可在官方 Gitlab 仓库中的 filter/test.conf 中看到。
关于过滤器的应用时机
过滤器作为对路由进行审计的手段,只有路由在不同协议的实例或路由表之间流动时才会被使用。
一个简单的过滤器实例可以如下所示。
filter not_too_far
{
int var;
if defined( rip_metric ) then
var = rip_metric;
else {
var = 1;
rip_metric = 1;
}
if rip_metric > 10 then
reject "RIP metric is too big";
else
accept "ok";
}
可以看出,一个过滤器有以下的三个成分:
过滤器的头包括关键词 filter
和一个过滤器名字 not_too_far
,用于声明这个过滤器。
可以使用 type name;
键值对的方式定义本地变量,每一个这样的键值对定义一个本地变量。
主体由 { 语句(statements) }
构成。每一个语句在分号 ;
结束。和很多编程语言相同,多个语句可以被大括号包裹成为一个单一语句 { statements }
。
BIRD 支持使用函数 (functions) ,以便使用重复出现的指令集。
函数可以没有参数或有多个参数,并且可以定义本地变量。若函数有返回值,其类型应被 显式 指明。同时,函数支持直接递归调用。
定义函数的示例如下:
function name() # int
{
int local_variable;
int another_variable = 5;
return 42;
}
function with_parameters(int parameter) # pair
{
print parameter;
return (1, 2);
}
像 C 语言一样,本地变量在函数主体的内部被定义。这可以在主体的最开头,也可以与其他语句混在一起。你可以在声明变量时对变量赋予初始值。
当然你也可以在 嵌套代码块 (nested blocks) 里声明局部变量,但这些变量的有效范围被局限在嵌套代码块中。
除此之外,还有一种在 function
定义行的后面,并在第一个 {
开始前定义变量的方法,但这种方法已被弃用。
调用函数的方法也与 C 语言相同。一个没有参数的函数可以用 name();
的形式调用;而一个有参数的函数可以用 with_parameters(5);
的形式调用。
函数可以用 return [expr]
的形式返回一个值;当返回值的同时当前函数会被退出(与 C 相同)。
虽然过滤器与函数在定义上有所相似,但它们之间还是存在一些关键的区别:
return
语句。accept
或 reject
语句结束。调试过滤器的小技巧
在调试过滤器时,您可以通过在命令行客户端中执行 show route filter name 命令来快速查看某个过滤器的结果。
$ birdc -s bird.ctl
bird> show route
10.0.0.0/8 dev eth0 [direct1 23:21] (240)
195.113.30.2/32 dev tunl1 [direct1 23:21] (240)
127.0.0.0/8 dev lo [direct1 23:21] (240)
bird> show route ?
show route [<prefix>] [table <t>] [filter <f>] [all] [primary]...
bird> show route filter { if 127.0.0.5 ~ net then accept; }
127.0.0.0/8 dev lo [direct1 23:21] (240)
译者
校对
原文作者: <Ondrej Filip>
, <Martin Mares>
, <Maria Matejka>
, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-5.html#ss5.1
原文标题: 5.1 Introduction
遵循协议: CC BY-NC-SA 4.0
译者: eki
校对: hat
翻译时间: 2023-12-16
更新时间: 2024-09-16
本文链接: https://bird.xmsl.dev/docs/user-guide/5-1-introduction.html