背景
如果设备期望发布不属于本机接口上的 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;
参考:
github 代码:
bird/route.h at master · CZ-NIC/bird · GitHubhttps://github.com/CZ-NIC/bird/blob/master/nest/route.h
bird 官方文档中的路由属性以及static proto 路由的说明:
The BIRD Internet Routing Daemon Projecthttps://bird.network.cz/?get_doc&v=16&f=bird-5.html#ss5.5The BIRD Internet Routing Daemon Projecthttps://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 Projecthttps://bird.network.cz/?get_doc&v=16&f=bird-6.html#ss6.3
The BIRD Internet Routing Daemon Projecthttps://bird.network.cz/?get_doc&v=20&f=bird-5.html
zebra中配置静态黑洞路由:
Quagga (http://www.quagga.net)Quagga (http://www.quagga.net)https://www.nongnu.org/quagga/docs/quagga.html#Static-Route-Commands