OSPF 路由器(Debian 上使用 BIRD)相互识别为邻居,但无法相互 ping 通

OSPF 路由器(Debian 上使用 BIRD)相互识别为邻居,但无法相互 ping 通

我使用虚拟机创建了一个“线”拓扑 - 创建 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(参见页面底部)以解决此问题。

相关内容