bird & quagga 静态路由配置

时间:2022-12-13 16:56:36


背景

如果设备期望发布不属于本机接口上的 ip 的相关路由,一般就通过配置静态路由,然后通过bird进行发布。

如果是使用bird,则直接在bird.conf中配置静态路由;

如果是使用quagga,则通过在zebra.conf中配置静态路由,然后ospf将路由发布出去。

zebra主要用于监控,扫描本机的接口,ip,路由的变化,和ospf进行联动,然后发布出去。

注意:以下配置主要是在server端的配置,而非交换机侧是配置,用于向外发布路由。

bird静态路由配置

注意:以下使用的bird的版本为 1.4.5;

protocol direct {
interface "lo"; # Restrict network interfaces it works with; 关注本机 lo 口上的ip以及相关路由;
}

protocol kernel {
persist; # Don't remove routes on bird shutdown
scan time 20; # Scan kernel routing table every 20 seconds
# export all; # Default is export none, 如果使能了 export all,则ip route在本机会看到配置的静态路由.
}

protocol device {
scan time 10; # Scan interfaces every 10 seconds
}

protocol static {
route 192.22.2.9/32 via "lo"; #配置静态路由;
route 192.22.2.10/32 via "lo";
}

filter export_vip { #过滤器,控制向外发布哪些路由,此中是只将static中配置的vip的路由发布出去。
if net = 192.22.2.9/32 then {
if bgp_path ~ [= 123456 =] then { # bgp_path中包含了 123456,则追加一个123456;
bgp_path.prepend(123456);
bgp_path.prepend(123456);
}
accept;
}
if net = 192.22.2.10/32 then {
if bgp_path ~ [= 123456 =] then {
bgp_path.prepend(123456);
bgp_path.prepend(123456);
}
accept;
}
reject;
}

protocol bgp {
local as 123456;
neighbor 192.20.20.7 as 23444;
hold time 27;
keepalive time 9;
import filter { reject; }; #不从外部引入路由到本机;
export filter export_vip;
}

分析:

        过滤器是用在导入和导出路由的时候的。过滤器会对每一条路由执行一次,同时该路由的所有属性都可以直接在过滤器中被使用(如例子中的 ​​bgp_path​​​),当前路由的可编辑属性(如 ​​bgp_local_pref​​​、​​bgp_path​​)也可以在这里被编辑。

        ​​reject​​​ 语句和 ​​accept​​​ 语句决定了这条路由是被拒绝还是被接受。只要 ​​reject​​​ 或者 ​​accept​​ 被触发,过滤器就会立刻退出,不执行之后的任何代码。

所以:

       1》 bgp_path是每个路由的属性,并不是一个全局的属性;

       2》 accept/reject之后就直接返回了,不在执行后续的代码;

       3》需要对每一条路由执行一次filter;

        如果觉得上诉在filter中需要对于每一条vip进行一次判断,bgp_path是否包含123456过于繁琐,也可以使用下面的方法。

protocol direct {
interface "lo"; # Restrict network interfaces it works with; 关注本机 lo 口上的ip以及相关路由;
}

protocol kernel {
persist; # Don't remove routes on bird shutdown
scan time 20; # Scan kernel routing table every 20 seconds
# export all; # Default is export none, 如果使能了 export all,则ip route在本机会看到配置的静态路由.
}

protocol device {
scan time 10; # Scan interfaces every 10 seconds
}

protocol static {
route 192.22.2.9/32 via "lo"; #配置静态路由;
route 192.22.2.10/32 via "lo";
}



protocol bgp {
local as 123456;
neighbor 192.20.20.7 as 23444;
hold time 27;
keepalive time 9;
import filter { reject; }; #不从外部引入路由到本机;
export filter { #只将static proto中配置的路由发布出去;
if source = RTS_STATIC_DEVICE then {
if bgp_path ~ [= 123456 =] then {
bgp_path.prepend(123456);
bgp_path.prepend(123456);
}
accept;
};
reject;
};
}

分析:

        范例中配置的static中的route的via为dev,所以route类型为:RTS_STATIC_DEVICE 而不是 RTS_STATIC;

bird & quagga 静态路由配置

 

bird & quagga 静态路由配置

 

bird & quagga 静态路由配置

参考:

github 代码: 

​bird/route.h at master · CZ-NIC/bird · GitHub

bird & quagga 静态路由配置

https://github.com/CZ-NIC/bird/blob/master/nest/route.h​

bird 官方文档中的路由属性以及static proto 路由的说明:   

​The BIRD Internet Routing Daemon Project

bird & quagga 静态路由配置

https://bird.network.cz/?get_doc&v=16&f=bird-5.html#ss5.5​​​​The BIRD Internet Routing Daemon Project

bird & quagga 静态路由配置

https://bird.network.cz/?get_doc&v=16&f=bird-6.html#ss6.12​

查看相关的信息如下所示:

查看所有的协议
1> birdc
> show protocols all
> show protocols all bgp1

比如查看bird的bgp之间是否extablished;

2> birdc
> show route all
> show route all export bgp1

查看到发布的 bgp 路由的asPath,下一跳,local_pref

ps: 对于集群而言,发布相同的ip到交换机上,形成等价路由。那么在每个设备上,可以控制路由的asPath,来决定优先级。


show route all 可以查看配置的路由的类型,如下所示,比如 device / static-device
bird> show route all
192.22.2.3/32 dev lo [direct1 20:29:07] * (240)
Type: device unicast univ
dev lo [static1 20:26:22] (200)
Type: static-device unicast univ
192.21.3.0/24 dev lan [direct1 20:29:07] * (240)
Type: device unicast univ
192.20.20.6/31 dev wan [direct1 20:29:07] * (240)
Type: device unicast univ
192.22.2.10/32 dev lo [direct1 20:29:07] * (240)
Type: device unicast univ
dev lo [static1 20:26:22] (200)
Type: static-device unicast univ
192.22.2.11/32 dev lo [static1 20:26:22] * (200)
Type: static-device unicast univ
192.22.2.8/32 dev lo [static1 20:26:22] * (200)
Type: static-device unicast univ
192.22.2.9/32 dev lo [static1 20:26:22] * (200)
Type: static-device unicast univ

quagga静态路由配置

#通过在zebra.conf中配置静态路由;

ip route 10.0.0.0/8 null0 #配置静态路由

参考

bird.conf的相关配置

​The BIRD Internet Routing Daemon Project

bird & quagga 静态路由配置

https://bird.network.cz/?get_doc&v=16&f=bird-6.html#ss6.3​

​The BIRD Internet Routing Daemon Project

bird & quagga 静态路由配置

https://bird.network.cz/?get_doc&v=20&f=bird-5.html​

zebra中配置静态黑洞路由:

​Quagga (http://www.quagga.net)Quagga (http://www.quagga.net)

bird & quagga 静态路由配置

https://www.nongnu.org/quagga/docs/quagga.html#Static-Route-Commands​