BIRD 实验 2 RIP动态路由
简介
本文紧接着上一个实验,描述进行BIRD RIP动态路由实验。
目标

如图所示,还是两个路由器通过eth0直连,分别在lo1接口挂载一个子网,实验的目的是在一台路由器上能够ping通另一台路由器lo1接口上的子网。
准备
参照实验一准备好全新的arch1、arch2机。如果继续使用实验一最后的arch1、arch2机器,注意把/etc/bird.conf中的配置还原到默认状态。
实验
在arch1、arch2 的/etc/bird.conf进行入如下配置,实际就是打开 protocol rip的注释
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
}
protocol rip {
ipv4 {
# Export direct, static routes and ones from RIP itself
import all;
export where source ~ [ RTS_DEVICE, RTS_STATIC, RTS_RIP ];
};
interface "eth*" {
update time 10; # Default period is 30
timeout time 60; # Default timeout is 180
authentication cryptographic; # No authentication by default
password "hello" { algorithm hmac sha256; }; # Default is MD5
};
}
使用ip route在arch1、arch2上验证是否学习到对方lo1网卡的路由。
结果失败了。在arch1上没有学习到192.168.102.0/24 via 10.215.137.88这条路由。在arch2上也没有学习到192.168.101.0/24 via 10.215.137.113这条路由。
为了找出原因,先用tcpdump检查
pacman -S tcpdump
tcpdump -n -i eth0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
21:32:09.878475 IP 10.215.137.88.520 > 224.0.0.9.520: RIPv2, Request, length: 80
在arch2上,发现有往多播地址224.0.0.9 520 UPD端口(RIPv2默认多播端口)发送的包,然后就没有下文了。怀疑宣告路由没有宣告出去或LXD创建的虚拟交换机(lxdbr0)禁止了组播。
使用birdc执行show route all看不到任何东西,更加怀疑路由没有宣告出去。
抱着试一试的心态,在两台机器的/etc/bird.conf中static protocol节各增加了一条static路由
arch1上
protocol static {
ipv4; # Again, IPv4 channel with default options
route 192.168.101.0/24 via 192.168.101.1;
}
备注:增加 route 192.168.101.1/32 via 192.168.101.1应该也可以。
arch2上
protocol static {
ipv4; # Again, IPv4 channel with default options
route 192.168.102.0/24 via 192.168.102.1;
}
再在birdc中执行show route all就成功看到路由了
例如在arch2上
# birdc
BIRD 2.14 ready.
bird> show route all
Table master4:
192.168.101.0/24 unicast [rip1 21:32:17.555] * (120/2)
via 10.215.137.113 on eth0
Type: RIP univ
RIP.metric: 2
RIP.tag: 0000
192.168.102.0/24 unicast [static1 21:32:09.877] ! (200)
via 192.168.102.1 on lo1
Type: static univ
如上,可以看到两条路由,不光有Type: static那条自己加的路由,还有Type: RIP那条从RIP学习到的路由。
以上是birdc中看到的BIRD自己维护的路由表中的路由,使用ip route也能看到内核中已自动增加到对方lo1网络的路由了
例如在arch2上
# ip route
default via 10.215.137.1 dev eth0 proto dhcp src 10.215.137.88 metric 1024
10.215.137.0/24 dev eth0 proto kernel scope link src 10.215.137.88 metric 1024
10.215.137.1 dev eth0 proto dhcp scope link src 10.215.137.88 metric 1024
192.168.101.0/24 via 10.215.137.113 dev eth0 proto bird metric 32
192.168.102.0/24 dev lo1 proto kernel scope link src 192.168.102.1
192.168.102.0/24 via 192.168.102.1 dev lo1 proto bird metric 32
第4条即是从arch1学习过来的路由。
实验成功。同时也证明LXD创建的虚拟交换机lxdbr0是没有禁用多播的。
补充一个正常的tcpdump日志
# tcpdump -n -i eth0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:18:37.269386 IP 10.215.137.88.520 > 224.0.0.9.520: RIPv2, Response, length: 100
22:18:37.554869 IP 10.215.137.113.520 > 224.0.0.9.520: RIPv2, Response, length: 100
22:18:47.267368 IP 10.215.137.88.520 > 224.0.0.9.520: RIPv2, Response, length: 100
22:18:47.554913 IP 10.215.137.113.520 > 224.0.0.9.520: RIPv2, Response, length: 100
22:18:57.556453 IP 10.215.137.113.520 > 224.0.0.9.520: RIPv2, Response, length: 100
22:18:57.657015 IP 10.215.137.88.520 > 224.0.0.9.520: RIPv2, Response, length: 80
如上,正常情况下两台机器会每10秒发一次RIP组播,网络大了就很恐怖。我想BIRD 用户手册中"big network load and inability to handle larger networks"就是这么来的。手册中把RIP说成是Rest In Pieces,不知道是不是玩笑。
总结
- RIP协议虽然很老了,但是仍然适用于小规模的网络(小于等于15跳的网络)。
- RIP是支持IPv4,一般使用BIRD默认的v2版即可;RIPng是支持IPv6的,没研究过。
- 如果是普通的真实多网卡(eth*)机器,感觉直接打开
/etc/bird.conf中protocol rip注释就可以用。 - 如果是loopback网卡,不知为何没有自动宣告,目前的解决办法是加一条static路由,即可解决。
- arch2的
ip route中看到有两条到192.168.102.0/24的路由,应该是BIRD中的protocol static往内核中export了一条,protocol rip又往内核中export了一条。暂时还没有想到更好的办法去除重复。
结束
实验结束,最后删除虚拟机。
lxc delete -f arch1
lxc delete -f arch2
下次准备把RIP协议实验扩展到3台机器,两两互联,这样需要3个网桥(bridge,或称虚拟二层交换机)。