FRR 与 BGP 简析

0 阅读4分钟

image.png

结论先行:

FRR (FreeRangeRouting) 是一个开源的高性能 Linux/Unix 路由协议套件。从本质上讲,FRR 是一个纯粹的“控制平面” (Control Plane) 软件实现。它负责运行 BGP、OSPF、IS-IS 等动态路由协议的状态机,计算出最优路由,并将这些路由下发给宿主机的“数据平面” (Data Plane,通常是 Linux 内核的 FIB 路由表或通过 SDN 控制器编程的硬件),从而实现网络的动态互通。

结合你提供的截图来看,这是一个典型的云原生网络场景:FRR 作为 BGP 路由器,接收到了来自上游节点(如 Kubernetes 集群的 Worker 节点)宣告的 Service VIP (192.168.100.0/32),并形成了 ECMP (等价多路径) 路由,最终实现了对该 Service 的负载均衡访问。

在软件工程和网络领域,我们可以从第一性原理出发,自底向上分析 FRR 的技术原理:

1. 需求分析 (Requirement Analysis)

为什么我们需要 FRR?

在静态网络中,手动配置 ip route 即可满足需求。但在动态变化的复杂网络(如数据中心、Kubernetes 集群)中,节点频繁上下线,Pod IP 或 Service VIP 动态漂移。

  • 通信标准化: 需要标准的协议(如 BGP)让节点之间自动同步网络拓扑和可达性信息。
  • 控制与数据解耦: 现代 SDN 架构要求将“计算路径”(控制面)与“转发数据包”(数据面)分离。我们需要一个轻量级、高性能的软件守护进程专门负责控制面计算。

2. 架构设计 (Architecture Design)

FRR 采用了模块化、多守护进程 (Multi-Daemon) 的架构,这是其核心设计哲学:

  • Zebra (核心中枢): 它是 FRR 的核心守护进程,扮演着“路由代理”和“内核抽象层”的角色。它负责管理全局的路由信息库 (RIB),并与底层操作系统的内核进行通信。
  • 协议守护进程 (Protocol Daemons):bgpd (处理 BGP)、ospfd (处理 OSPF)。它们各自独立运行,专门负责处理对应协议的网络报文、邻居状态机和特定协议的最优路径计算。
  • VTYSH: 你在截图中使用的 vtysh 是 FRR 的统一命令行 Shell。它通过 Domain Socket 连接到各个守护进程,提供类似 Cisco IOS 的统一交互接口。

3. 代码实现与工作流 (Implementation & Data Flow)

当 FRR 运行时,其底层的数据流转逻辑如下:

  1. 建立邻接 (Peering): 以 BGP 为例,bgpd 通过 TCP 179 端口与邻居(如 172.18.0.2 和 172.18.0.3)建立 BGP Session。
  2. 接收与计算 (RIB): bgpd 接收到邻居发来的 NLRI (网络层可达性信息,即 192.168.100.0/32)。它根据 BGP 的选路算法(Local Pref, AS Path 等)将计算出的最优路由存入 BGP 专属的 RIB 中。
  3. 路由注入 (Zebra 仲裁): bgpd 将其最优路由发送给 Zebra。如果同时运行了 OSPF,Zebra 会根据管理距离 (Administrative Distance) 仲裁出全局最优路径。
  4. 内核编程 (FIB 更新): 关键的一步,Zebra 通过 Linux 内核的 Netlink 接口,将最优路由写入宿主机的内核路由表 (ip route)。
  5. 数据面转发 (Data Plane):curl http://192.168.100.0:8080 发起请求时,数据包到达 Linux 网络栈,内核直接查询其 FIB 进行报文转发。此时 FRR 不参与任何实际的数据包转发,它只负责铺路。

4. 结合截图的场景解析

截图中的输出揭示了 FRR 在现代容器网络中的典型应用:

  • show ip route bgp 查看到 192.168.100.0/32 有两个下一跳 (172.18.0.2172.18.0.3),且状态为 * (Valid) 和 > (Best)。
  • 本质: 这是 BGP 形成的 ECMP (Equal-Cost Multi-Path) 。Linux 内核默认支持 ECMP,Zebra 将这两条下一跳同时写入内核。当流量到达时,内核会基于 5-tuple (源 IP、目的 IP、协议、源端口、目的端口) 进行 Hash 分发。
  • 结果: curl 请求被成功路由到了后端的 echo 服务。这在逻辑上等同于一个 L3 层的 Load Balancer。

5. 简化与创新 (云原生网络中的 FRR)

在传统的网络硬件中,控制面和数据面紧耦合在专用 ASIC 路由器内。FRR 将其解耦后,极大地推动了云原生网络的发展:

  • 与 CNI 深度融合: 现代 Kubernetes 网络插件(例如 Kube-OVN 和 Cilium)经常利用 BGP 与物理网络(或环境中的 FRR 实例)打通。CNI 组件在节点上作为 BGP Speaker,将 Pod 网段或 LoadBalancer VIP 宣告给 FRR 控制台。
  • BGP Unnumbered: 现代实现中,FRR 常配合 IPv6 链路本地地址 (Link-Local) 使用 BGP Unnumbered 功能。这省去了底层物理网络的 IPv4 编址规划,实现了拓扑的自动化发现与极简配置。
  • 数据面的替换: 尽管 FRR 默认通过 Zebra 配置 Linux 内核路由,但因为其控制面的纯粹性,底层的转发面完全可以被替换为 OVS 甚至 eBPF(如 Cilium 的 XDP/tc 层面拦截),从而在保持标准 BGP 互通的同时,获得极致的转发性能。