FRRouting(Free Range Routing,简称FRR)是从Quagga项目 fork 出来的开源路由套件,目前由FRR社区维护,思科、诺基亚等厂商也有参与贡献。它实现了BGP、OSPF、IS-IS、RIP、EIGRP、Babel等多种路由协议,既可以跑在物理服务器上,也能跑在容器和虚拟机里,是搭建软路由、SDN底层控制和网络实验环境的热门选择。Debian从 Buster 开始就已经把FRR收录进官方仓库,安装起来非常方便。这篇文章就从零开始,完整讲一遍在Debian上部署FRRouting并跑通OSPF动态路由的过程。

一、FRRouting的架构与安装前的准备
FRR不是单个程序,而是由一组协作的守护进程组成的套件。核心是zebra,它负责内核路由表的维护和接口管理,是所有协议进程的基础;其他进程如bgpd(BGP)、ospfd(OSPFv2)、ospf6d(OSPFv3)、isisd(IS-IS)、ripd(RIP)各自负责对应的协议,它们把学到的路由交给zebra,再由zebra计算最优路由并写入Linux内核的FIB。这种模块化设计的好处是:你只需要哪个协议就开哪个进程,资源开销可控。
安装之前先确认系统版本。建议使用Debian 11或12,内核转发功能是路由的基础,如果这台机器要当路由器用,必须先开启IP转发:
# 临时开启转发 sysctl -w net.ipv4.ip_forward=1 # 永久生效,写入配置文件 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p
如果仓库里默认的FRR版本太旧,也可以添加官方仓库获取新版本:
# 添加FRR官方源(以Debian 12 bookworm为例) curl -s https://deb.frrouting.org/frr/keys.asc | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null echo 'deb [signed-by=/usr/share/keyrings/frrouting.gpg] https://deb.frrouting.org/frr bookworm frr-stable' \ | sudo tee /etc/apt/sources.list.d/frr.list
接着用apt安装即可。使用官方仓库时,frr元包会拉起全部组件,也可以按需安装frr-pythontools等工具包。安装完成后系统会自动创建frr用户和frr组,服务文件也一并就位。
apt update apt install frr -y # 查看安装的版本 vtysh -c 'show version'
二、启用守护进程与vtysh的基本使用
Debian下的FRR由/etc/frr/daemons文件控制各进程的开关。安装完成后默认所有协议进程都是关闭的,只有zebra是开着的,这一点和源码编译安装的行为不太一样,很多人第一次用会以为配置没生效,其实是忘了改这个文件。文件内容是一系列xxxpd=yes/no的变量,把需要启用的协议改成yes即可。
# 编辑 /etc/frr/daemons,启用zebra和ospfd zebra=yes bgpd=no ospfd=yes ospf6d=no ripd=no isisd=no pimd=no ldpd=no nhrpd=no eigrpd=no babeld=no sharpd=no pbrd=no bfdd=no fabricd=no vrrpd=no # 重启服务使配置生效 systemctl restart frr systemctl status frr
注意vtysh_enable和zebra_options两个选项:vtysh_enable=yes可以让vtysh整合所有进程的配置视图;如果需要让zebra监听IPv6,把zebra_options里的-A 127.0.0.1改成-A ::1或直接删掉监听限制。
FRR的配置入口是vtysh,它的交互风格和思科IOS非常接近,熟悉思科设备的工程师几乎可以无缝上手。常用命令如下:
vtysh # 进入FRR交互式CLI show ip route # 查看路由表 show running-config # 查看当前配置 conf t # 进入配置模式 write integral # 保存配置(老写法) write memory # 保存配置到 /etc/frr/frr.conf
配置也可以直接写在/etc/frr/frr.conf里,格式和vtysh里敲的命令一致,改完执行systemctl reload frr即可。这个文件是所有进程共用的,不同协议的配置段落通过进入不同的配置节点来区分。
三、实战:两台Debian主机之间跑通OSPF
假设有R1和R2两台Debian机器,R1的eth1接口地址是10.0.0.1/30,R2的eth1接口地址是10.0.0.2/30,R1背后还有192.168.1.0/24网段,R2背后有192.168.2.0/24网段。目标是通过OSPF让两台机器互相学到对方的网段路由。
先在R1上操作。进入vtysh,宣告接口和网段:
R1# conf t R1(config)# interface eth1 R1(config-if)# ip address 10.0.0.1/30 R1(config-if)# ip ospf area 0 R1(config-if)# exit R1(config)# router ospf R1(config-router)# ospf router-id 1.1.1.1 R1(config-router)# network 192.168.1.0/24 area 0 R1(config-router)# end R1# write memory
R2的配置类似,把地址换成10.0.0.2/30,router-id设成2.2.2.2,宣告192.168.2.0/24到area 0。这种写法用的是接口级启用OSPF的方式,比传统的network反掩码写法更直观;如果坚持经典写法,在router ospf节点下用network 10.0.0.0/30 area 0也一样能生效。
配置完成后验证邻居状态和路由学习情况:
R1# show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface 2.2.2.2 1 Full/DR 30.114s 10.0.0.2 eth1 R1# show ip route ospf Codes: K - kernel, C - connected, O - OSPF, > - selected route O>* 192.168.2.0/24 [110/20] via 10.0.0.2, eth1, weight 1, 00:01:23
看到邻居状态是Full,路由表里出现O标记的路由,说明OSPF已经正常工作,R1访问192.168.2.0/24的流量会自动从eth1转发出去。如果在内核路由表里也能看到这条路由(ip route命令),就代表zebra已经把它成功下发到了Linux的FIB。
四、常见问题与排错思路
第一个高频问题是邻居起不来。排查顺序建议是:先用ip addr确认接口地址配置正确,再检查两端area号是否一致,然后看MTU——两端接口MTU不一致时OSPF卡在ExStart状态是经典故障。可以临时用ip ospf mtu-ignore验证是不是MTU的问题。
第二个问题是改了daemons文件没生效。一定要记住这个文件只在服务启动时读取,修改后必须执行systemctl restart frr,reload是不够的。可以用ps aux | grep ospfd确认进程是否真的在运行。
第三个问题涉及配置保存。vtysh里敲的配置默认存在内存里,重启就丢,务必用write memory落盘。另外FRR还支持集成配置和分进程配置两种模式,由/etc/frr/frr.conf的存在与否决定,保持默认的集成模式即可,排查时直接看这一个文件最省事。
最后提一句日志:在router ospf下配置log-adjacency-changes可以记录邻居状态变化,配合show logging和journalctl -u frr能快速定位协议层面的异常。掌握这些基础之后,再上BGP、路由策略或者MPLS就都有了落脚点,FRR的功能远不止于此,值得在网络实验环境里深入折腾。