BIRD 2.0.7 及早期版本中 OSPF 与多个具有相同 IP 地址的 PtP 接口的兼容问题

Posted by

on

前言

在 iEdon-Net 中,我广泛使用了 OSPF 来传递内网结构信息。有一个如图所示的简易拓扑结构:

BIRD OSPF PtP BUG

A, B, C, D 两两邻接,为了节省 IP 地址(因为允许多个具有相同 IP 地址的 PtP 接口存在),我为 A 到 B, C, D 的三个 PtP 接口设置了相同的 IP 地址。此时,B, C, D 之间可以互相直接访问 dummy 及其邻接路由,也能直接访问 A 及其邻接路由。但是,A 访问 C, D 及其邻接路由却不可预测地经过了 B。

问题

没有找到相关文档介绍这种方法不可行。尝试过分别重启不同节点的 BIRD,均没有效果。最后我尝试查看 BIRD 的 Git 提交记录,发现这是一个 Bug,已经在开发版(截至目前)被修复。

BIRD(当前时间点的版本,我称之为 2.0.8-dev) 的第 c1632ad0f3 次提交: OSPF: Fix handling of unnumbered PtPs 中已经解决了这个问题。BIRD 的一位开发者提到:

Then with OSPF graceful restart implementation, we found that we can no
longer use out-of-band information, and we need to use only LSAdb info
for routing table calculation, but i forgot to finish handling of this
case, so multiple unnumbered PtPs with the same local IP addresses were
broken.

作者忘记处理了优雅重启实现中路由表的计算,因此 A 节点遗漏了 C, D 中的路由表条目(在我的案例中,是 C, D 的 dummy 接口 IP 地址)。同时,作者给出了一个新的开关 ptp address <switch> 来处理这种情况。这个开关控制了在 OSPF 的内部信息中,使用 IP 地址还是接口 ID 来区分 PtP 接口。在优雅重启下,默认开启。

解决方法

  1. 从 Git 上拉取最新开发版并手动编译(一劳永逸的做法)
  2. 为 PtP 接口设置不同的 IP 地址(推荐, 稳定可靠, 但不优雅, 可以作为现阶段的 Workaround)
  3. 从作者的 Bug 说明中可以看到,是 OSPF 优雅重启 开启的情况下,未能正确处理 PtP 接口的相同 IP 地址,那么可以考虑关掉优雅重启(未考证, 不推荐)

参考

1.  OSPF: Fix handling of unnumbered PtPs (c1632ad0) · Commits · labs / BIRD Internet Routing Daemon · GitLabhttps://gitlab.nic.cz/labs/bird/-/commit/c1632ad0f39f7221d649a9e469cacc38105528e2


Leave a Reply

Your email address will not be published. Required fields are marked *