介绍
我正在尝试在运行BIRD 路由守护程序的两台主机之间使用 RIPv2 协议建立基本通信。
我有一个有地址Host A
的接口。
我有另一台主机,其接口具有 address 。这些接口通过电缆直接连接。如果我在两台机器上添加静态路由,我可以在两台机器之间 ping 通。enp0
10.0.1.50/24
Host B
enp1
10.1.1.25/24
配置文件
我有以下bird.conf
内容Host A
:
protocol kernel {
learn; # Learn all alien routes from the 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
}
protocol device {
scan time 10; # Scan interfaces every 10 seconds
}
protocol direct {
interface "enp0"
}
protocol rip MyRIP {
export all;
import all;
interface "enp0" { mode multicast;};
}
bird.conf
onHost B
是相同的,除了替换enp0
为enp1
初步结果
在两台主机上启动鸟守护程序后,我可以做一个tcpdump -ni enp0 -vv
13:21:41.943537 IP (tos 0xc0, ttl 1, id 4933, offset 0, flags [none], proto UDP (17), length 132)
10.1.1.25.520 > 224.0.0.9.7742: [udp sum ok] UDP, length 104
13:21:41.943704 IP (tos 0xc0, ttl 1, id 150, offset 0, flags [none], proto UDP (17), length 272)
10.0.1.50.520 > 224.0.0.9.7742: [bad udp cksum 0xec48 -> 0x1219!] UDP, length 244
我可以跳入birdcl
命令行并运行show rip neighbors
并获得一个空表。
让它发挥作用
如果我将地址设置在同一个子网上,我可以运行show rip neighbors
并且可以10.0.1.50
在我的邻居列表中看到。
包起来
如果链路的两端不在同一个子网上,如何让这些路由器将彼此列为邻居?
我必须对网络如何工作有某种不正确的心理画面,路由器不需要一直与不在同一子网上的邻居通话吗?
我没有挂断特定于 BIRD 的答案。
早在远古时代,网络上的协议比 TCP/IP 还多,我运行 RIP。那时,它是 RIPv1,它使用广播。网络拓扑看起来像这样:
所有路由器将共享一个只有路由器的子网。对于两个路由器设置,它们之间有一根电缆,就像你正在做的那样。对于较大的设置,将有一个运行子网的快速网络设备(希望是交换机,但并非总是如此)。这样一来,一切都在 2 跳之外,并且路由收敛变得简单。这就是我们当时所拥有的。
然后是 RIPv2 和多播,拥有更多的跃点不太容易出现收敛问题。如果将多播 TTL 设置为超过跃点直径的 +1,则每个路由器都有效地直接向其他每个路由器通告,从而加快收敛速度。
不过,要考虑的关键事项是:查看 TCPDUMP 输出中的源地址。
路由器
10.0.1.50
已被告知,该路由器10.1.1.25
有一个10.1.1.0/24
本地子网。但是,路由器 at10.0.1.50
没有到 address 的路由10.1.1.25
,因此它不会将其添加到表中。多播是您的公告频道,但它不能承载路由流量。一切都没有丢失。
如果由于某种原因您只能使用单根电缆,您可以定义虚拟接口。在
enp0.0
10.3.1.0/24 和 10.0.1.0/24enp0.1
上的位置。这样您就可以使用 10.3.1.0/24 作为您的“路由网络”。