BIRD 实验 1 静态路由
简介
BIRD是一个动态路由软件,本文描述了如何从零开始搭建一个实验环境,并进行静态路由的实验。
目标
BIRD和FRR可能目前最流行的两个Linux动态路由软件了,BIRD似乎在Kubernetes和BGP协议中用得更多。为了为后续研究Kubernetes和BGP协议打下基础,我决定搭建一个实验环境好好学习BIRD。
阅读BIRD的用户指南后,我意识到虽然BIRD是一个动态路由软件,但也支持静态路由,于是第一个实验不必从动态路由开始,让我们从一个老教科书式的静态路由实验开始探索BIRD。

如图所示,两个路由器通过eth0直连,分别在lo1接口挂载一个子网,实验的目的是在一台路由器上能够ping通另一台路由器lo1接口上的子网。
准备
搭建上图中这个实验环境自然需要两台Linux PC、一台二层交换机。我决定在我的PC上用LXC来搭建,这样又方便又快捷。
安装lxd
pacman -Sy
pacman -S lxd
设置权限
usermod -v 1000000-1000999999 -w 1000000-1000999999 root
初始化lxd
lxd init
所有选项选是即可,装完后会在我们的本机上创建一个叫lxdbr0的Bridge,这样二层交换机就有了。
创建两个LXC容器,名字分别较arch1、arch2,在我的PC上,这两台机器的IP分别为10.215.137.113/24和10.215.137.88/24。
lxc launch images:archlinux/current/amd64 arch1
lxc launch images:archlinux/current/amd64 arch2
分别登陆两个容器,进行一些初始化设置
lxc exec arch1 -- bash
lxc exec arch2 -- bash
1、 设置为+8时区
ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime
2、替换为国内源,vi /etc/pacman.d/mirrorlist,替换内容为
Server = http://mirrors.tencent.com/archlinux/$repo/os/$arch
3、安装BIRD软件
pacman -Sy
pacman -S bird
BIRD真是短小精悍呀,安装后竟然只有5个文件。
pacman -Ql bird
bird /etc/
bird /etc/bird.conf
bird /usr/
bird /usr/bin/
bird /usr/bin/bird
bird /usr/bin/birdc
bird /usr/bin/birdcl
bird /usr/lib/
bird /usr/lib/systemd/
bird /usr/lib/systemd/system/
bird /usr/lib/systemd/system/bird.service
4、启动BIRD
systemctl start bird
systemctl enable bird
先来验证一下环境是否好用。
在arch1机上配置loopback网卡lo1,并配置路由
ip link add name lo1 type dummy
ip link set dev lo1 up
ip addr add 192.168.101.1/24 dev lo1
ip route add 192.168.102.0/24 via 10.215.137.88
在arch2机上配置loopback网卡lo1,并配置路由
ip link add name lo1 type dummy
ip link set dev lo1 up
ip addr add 192.168.102.1/24 dev lo1
ip route add 192.168.101.0/24 via 10.215.137.113
此时从arch1机上ping 192.168.102.1或从arch2机上ping 192.168.101.1能ping通了,说明环境是好的。
ip命令的配置一重启就掉了,下面使用systemd-networkd来固化一下。
在arch1机上,删除临时配置
ip link delete lo1
配置/etc/systemd/network/25-dummy.netdev
[NetDev]
Name=lo1
Kind=dummy
配置/etc/systemd/network/25-dummy.network
[Match]
Name=lo1
[Network]
Address=192.168.101.1/24
在arch2机上,删除临时配置
ip link delete lo1
配置/etc/systemd/network/25-dummy.netdev
[NetDev]
Name=lo1
Kind=dummy
配置/etc/systemd/network/25-dummy.network
[Match]
Name=lo1
[Network]
Address=192.168.102.1/24
两台机器上路由还在,使用systemctl restart systemd-networkd在重启服务后,应该还能互相ping通。
最后删除在arch1机、arch2机上分别删除路由,执行:
ip route delete 192.168.101.0/24
和
ip route delete 192.168.102.0/24
然后互相ping不通了,环境搭建完毕。下面该BIRD上场了。
实验
在arch1机上编辑/etc/bird.conf,在protocol static 增加一条配置。
192.168.102.0/24 via 10.215.137.88
arch2机上同理,只不过路由不一样。
192.168.101.0/24 via 10.215.137.113
分别执行systemctl restart bird冷加载或者在birdc中执行reload all热加载使配置生效。
对,就这么简单,只需要一条配置。此时从arch1机上ping 192.168.102.1或从arch2机上ping 192.168.101.1能ping通了,说明BIRD管理的静态路由实验成功了。
分析
在arch1机上使用grep -v "^#" /etc/bird.conf来分析以下配置文件。
log syslog all;
protocol device {
}
protocol direct {
disabled; # Disable by default
ipv4; # Connect to default IPv4 table
ipv6; # ... and to default IPv6 table
}
protocol kernel {
ipv4 { # Connect protocol to IPv4 table by channel
export all; # Export to protocol. default is export none
};
}
protocol kernel {
ipv6 { export all; };
}
protocol static {
ipv4; # Again, IPv4 channel with default options
route 192.168.102.0/24 via 10.215.137.88;
}
学习心得如下:
- 该配置文件定义了1个全局配置
log syslog all;,5个protocol。 - device protocol下没有channel,其他都有。ipv4、ipv6就是channel。
- direct protocol其实是禁用的。见
disabled;。 - kernel protocol中ipv4 channel下配置了一行
export all;,才能把static protocol中配置的路由输出到内核中。 - kernel protocol ipv4、ipv6要分开配。
- static protocol ipv4、ipv6也要分开配。
几点以后研究的方向:
ip link add lo1 type dummy添加的type明明是dummy,为何ip link看到的第二行开头是link\ether?- static protocol在用户指南中还提到一种Flowspec配置,目前来看是专用于BGP协议的,如何使用还需进一步研究。
- GNS3,可以支持更多的设备,也许更适合用来作复杂的实验,有时间可以研究一下。
结束
实验结束,最后删除虚拟机。
lxc delete -f arch1
lxc delete -f arch2