介绍
我正在尝试在运行以下协议的两个主机之间建立 RIPv2 协议的基本通信:BIRD 路由守护进程。
我有Host A
一个接口,enp0
其地址为10.0.1.50/24
。
我还有另一个主机,其Host B
接口enp1
的地址为10.1.1.25/24
。这些接口通过电缆直接连接。如果我在两台机器上都添加静态路由,我就可以在两台机器之间 ping 通。
配置文件
我有以下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;};
}
onbird.conf
是Host B
相同的,只是enp0
被替换为enp1
初步结果
在两台主机上启动 bird 守护进程后,我可以执行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 的答案。
答案1
很久以前,当网络上的协议比 TCP/IP 还多时,我就运行了 RIP。当时是 RIPv1,使用广播。网络拓扑看起来有点像这样:
[10.0.0.0/24] <-- router --> [10.0.1.0/24] <-- router --> [10.0.2.0/24]
[10.0.3.0/24] <-- router ------^ ^---- router --> [10.0.4.0/24]
[10.0.5.0/24] <-- router -------^ ^----- router --> [10.0.6.0/24]
所有路由器将共享一个只有路由器的子网。对于双路由器设置,它们之间只有一条电缆,就像您现在所做的那样。对于更大的设置,将有一个运行子网的快速网络设备(希望是交换机,但并非总是如此)。这样,所有东西都在 2 跳之外,路由收敛变得简单。这就是我们当时所拥有的。
随后出现了 RIPv2 和多播,跳数越多,收敛问题就越少。如果将多播 TTL 设置为跳数直径的 +1,则每个路由器都会有效地直接向其他每个路由器进行通告,从而使收敛速度更快。
不过,需要考虑的关键问题是:查看 TCPDUMP 输出上的源地址。
10.1.1.25.520 > 224.0.0.9.7742
10.0.1.50.520 > 224.0.0.9.7742
路由器10.0.1.50
已被告知 处的路由器10.1.1.25
具有 的本地子网10.1.1.0/24
。但是, 处的路由器10.0.1.50
没有到地址 的路由10.1.1.25
,因此不会将其添加到表中。多播是您的公告渠道,但它无法承载路由流量。
但一切还没有失去。
如果由于某种原因您只能使用单条电缆,则可以定义虚拟接口。其中enp0.0
位于 10.3.1.0/24 上,enp0.1
位于 10.0.1.0/24 上。这样,您就可以使用 10.3.1.0/24 作为“路由网络”。