我使用虚拟机创建了一个“线”拓扑 - 创建 4 台机器并使用内部网络在每台机器之间建立单独的链接 - R1 (eth0, 10.0.1.1) <-> (eth0, 10.0.2.1) R2 (eth2, 10.0.2.2) <-> (eth0, 10.0.3.1) R3 (eth2, 10.0.3.2) <-> (eth0, 10.0.4.1) R4。我已使用以下命令启用 ipv4 数据包转发:
sudo sysctl net.ipv4.ip_forward=1
/etc/bird.conf 中 R2 和 R3 的 OSPF 配置如下:
protocol ospf MyOSPF {
tick 2;
rfc1583compat yes;
area 0.0.0.0 {
stub no;
interface "eth2" {
hello 9;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
type broadcast;
};
interface "eth0" {
hello 9;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
type broadcast;
};
};
}
当我输入 birdc 并输入
ospf show topology
和
ospf show neighbors
看起来所有路由器都看到了正确的拓扑,将相邻路由器识别为邻居并正确计算了成本。但是,除非手动指定接口(ping -I eth2 10.0.3.1),否则无法从 R2 ping R3。R1 和 R2 的情况并非如此,因为两端都使用 eth0。
/etc/network/interfaces 在 R2 上的样子如下:
allow-hotplug eth0
iface eth0 inet static
address 10.0.2.1
auto eth1 #this is the bridged adapter used to ssh to the vm from the host
iface eth1 inet dhcp
allow-hotplug eth2
iface eth2 inet static
address 10.0.2.2
我有点困惑,问题出在接口配置上还是路由协议的配置上。
这里是输出
ip link
和
ip route
每台机器
答案1
我找到了!设置不工作的原因有多种 - 首先,地址设置不正确。应为接口分配以下(例如)地址以使一切正常工作:
R1 (eth0, 10.0.1.1) <-> (eth0, 10.0.1.2) R2 (eth2, 10.0.2.1) <-> (eth0, 10.0.2.2) R3 (eth2, 10.0.3.1) <-> (eth0, 10.0.3.2) R4
为使每两个相邻路由器上彼此面对的两个接口都位于同一广播域(/24 子网)。每个接口上的网络掩码应设置为 255.255.255.0。
至于 BIRD 中的 OSPF 配置,必须将“网络”块添加到区域以指定路由器应该交换哪种信息(特别是路由器正在讨论的网络)。在这种情况下,由于我们在两端都有一个 /24(255.255.255.0)网络,我们可以在网络语句中使用 /16 网络(255.255.0.0)在两个相邻的 /24 网络(例如 10.0.1 和 10.0.2)之间交换信息。所以最后它看起来像这样:
protocol ospf MyOSPF {
tick 2;
rfc1583compat yes;
area 0.0.0.0 {
networks {
10.0.0.0/16;
};
stub no;
interface "eth2" {
hello 9;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
type broadcast;
};
interface "eth0" {
hello 9;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
type broadcast;
};
};
}
从bird ospf 配置手册networks {set} - 区域 IP 范围的定义。这用于汇总 LSA 发起。隐藏网络不会传播到其他区域。
答案2
您的路由器可以通过 OSPF 互相看到,因为 OSPF 使用多播从任意接口发现邻居。这意味着只要两个路由器位于同一个多播域中,您实际上不需要有效的路由表来查看邻居。
所以看看你的屏幕截图——你所有的路由器接口要么在 10.0.0.0/8 要么在 192.168.0.0/24。你的路由器会看到这一点,并假设它们在同一个广播域中,所以它们不会将数据包发送到 eth0 或 eth2 或任何其他接口,而是将流量发送到随机接口。
您应该使用小型直接连接子网进行路由器到路由器的通信,而不要使用这些巨大的 /8 子网,因为这样只会让事情变得混乱。
一个路由器上有许多不同的重叠路由表,这些路由表实际上是不同的真实网络,这是一种很常见的情况。
对于鸟类来说: http://bird.network.cz/?get_doc&f=bird-2.html
最后,您需要确保 bird 知道操作系统的路由,并在操作系统上设置路由。啊,这可能是您麻烦的根源——从常问问题:
BIRD 不会从内核导入某些路由器
首先,内核协议的学习选项必须处于活动状态。
其次,与 OS/内核自动添加的接口地址/前缀相关的“设备”路由永远不会被导入。您可以使用直接协议添加它们。
第三,由于一些不为人知的历史原因,BIRD 1.3.x(或更早版本)甚至不会导入一些手动添加的设备/主机路由(即没有网关的路由)。有两种方法可以解决这个问题。要么使用静态协议源将这些路由添加到内核路由表(例如 '@ip route add 10.20.30.0/24 dev eth0 proto static@' ),要么使用附加的补丁重新编译 BIRD(参见页面底部)以解决此问题。