博主头像

人間になりたい!!!!!


皖ICP备2025096275号

Linux 运维 - 新版 OpenWrt 基于 Bird 的 OSPF 组网实现

前言

在配置工作室/企业网络时, 常常需要实现多网段互通, 而这些网段通常处于同一层级或不同层级, 并非上下级的关系, 所以并不可以直接互通. 这时我们就需要在路由器上配置 OSPF. 本篇文章将教你如何在搭载 OpenWrt 的路由器上实现 OSPF 组网.

示例环境

  • 主路由 OS: X-WRT 25.04_b202510240128 Plucky
  • 副路由 OS: X-WRT 26.04_b202601250827 Plucky
按照本文进行配置需要您对 OSPF 协议拥有基本的认识

开整

1. 安装 Bird

  • 转至 系统 (System) --> 软件 (Software) 页面, 安装如图所示的两个软件包

Bird Installation
Bird Installation

Q. 为什么不选择 Bird 3?
A. Bird 2 经过社区长期验证, 被认为是稳定且可靠的选择, 拥有大量的实际配置案例与故障处理经验. 且 Bird 2 几乎满足了绝大部分网络配置的需求, 无需使用 Bird 3 的新特性.

2. 配置 Bird

  • 打开 init.d 中的 Bird 配置
vim /etc/init.d/bird
  • BIRD_CONF="/etc/bird.conf 改为
BIRD_CONF="/etc/bird/bird.conf"
  • 新建配置文件夹和主要配置文件
mkdir /etc/bird
vim /etc/bird/bird.conf
  • 按照以下格式填写配置
define INTRA_ROUTER_ID      = <your_router_id>;
define INTRA_PREFIX_V4      = [ <your_network_segments>/<netmask>+ ];
define INTRA_PREFIX_V6      = [ <your_network_segments>/<netmask>+ ];

protocol device {
    scan time 10;
};

ipv4 table intra_table_v4;
ipv6 table intra_table_v6;

include "config/defs.conf";
include "config/kernel.conf";
include "config/ospf.conf";

配置条目解析

  • INTRA_ROUTER_ID: 当前设备的 Router-ID
  • INTRA_PREFIX_V4: 定义 IPv4 内部网络前缀的宏
  • INTRA_PREFIX_v6: 定义 IPv6 内部网络前缀的宏

    前缀命名规范

    • define INTRA_... # 内部路由相关
    • define INTER_... # 外部/边界路由相关
    • define CUSTOMER_... # 客户路由相关
    • define PEERING_... # 对等路由相关
  • scan time 10: 扫描接口的间隔为 10s
  • ipv4 table: IPv4 路由表名称
  • ipv6 table: IPv6 路由表名称
  • include: 指定包含哪些配置文件, 可以添加自己的配置文件. 以下是建议添加的配置文件

    • defs.conf: 可以存放路由条目过滤规则等函数
    • kernel.conf: 存放写进内核路由表的过滤规则
    • ospf.conf: 配置 OSPF 的配置文件

示例配置

define INTRA_ROUTER_ID      = 100.64.0.163;
define INTRA_PREFIX_V4      = [ 100.64.0.0/16+, 192.168.0.0/16+ ];
define INTRA_PREFIX_V6      = [ fd18:3e15:61d0::/48+ ];

protocol device {
    scan time 10;
};

ipv4 table intra_table_v4;
ipv6 table intra_table_v6;

include "intra/defs.conf";

include "intra/kernel.conf";
include "intra/ospf.conf";
  • 新建子配置文件并按照示例格式填写配置
文章中提供的配置文件均为示例, 十分建议自行另外编写, 可以使用 AI
mkdir infra
cd infra
  • defs.conf
vim defs.conf
function is_intra_net4() {
    return net ~ INTRA_PREFIX_V4;
}

function is_intra_net6(){
    return net ~ INTRA_PREFIX_V6;
}
  • kernel.conf
vim kernel.conf
protocol kernel intra_kernel_v4 {
    kernel table 254;
    scan time 20;
    ipv4 {
        table intra_table_v4;
        import none;
        export filter {
            if source = RTS_STATIC then reject;
            accept;
        };
    };
};

protocol kernel intra_kernel_v6 {
    kernel table 254;
    scan time 20;
    ipv6 {
        table intra_table_v6;
        import none;
        export filter {
            if source = RTS_STATIC then reject;
            accept;
        };
    };
};
  • ospf.conf
vim ospf.conf
protocol ospf v3 intra_ospf_v4 {
    router id INTRA_ROUTER_ID;

    ipv4 {
        table intra_table_v4;
        import where is_intra_net4() && source != RTS_BGP;
        export where is_intra_net4() && source != RTS_BGP;
    };

    include "ospf/*";
};

protocol ospf v3 intra_ospf_v6 {
    router id INTRA_ROUTER_ID;

    ipv6 {
#       table dn42_table_v6;
        table intra_table_v6;
        import where is_intra_net6() && source != RTS_BGP;
        export where is_intra_net6() && source != RTS_BGP;
    };

    include "ospf/*";
};

配置 OSPF

  • 创建 OSPF 相关目录与配置文件
mkdir intra/ospf
vim intra/ospf/0.conf
OSPF 的配置文件可以自行命名, 但建议以 <AeraID>.conf 的规则进行命名
  • 按照如下格式编写 OSPF 配置文件
area 0.0.0.0 {
    interface "<lan_interface>" { stub; };
    interface "<ospf_interface>" {
        type <type>;
        cost <cost>;
        hello <time>;
        retransmit <time>;
        priority <num>;
        authentication <type>;
        ecmp weight <num>;
        bfd <yes/no>;
    };
};

配置条目解析
aera: OSPF AeraID
interface: 接口独立配置

  • stub 接口为末节接口, 仅接受路由信息但不进行 OSPF 相关的活动
  • 没有任何标注的接口为 OSPF 的活动接口, 会正常的进行邻居的发现与握手
  • type: 接口网络类型

    • broadcast(默认/推荐): 广播网络. 适用于以太网/令牌环等广播介质. 该方式会选举 DR/BDR, 支持多台路由器
    • pointopoint: 点对点网络. 适用于 PPP, HDLC, 点对点隧道, 不选举 DR/BDR, 直接建立邻居
    • nonbroadcast: 非广播多路访问 (NBMA). 适用于帧中继, ATM, X.25, 需要手动配置邻居
    • pointomultipoint: 点对多点. 适用于部分网状连接, 将 NBMA 模拟为多个点对点链路
    • stub: 末节网络, 适用于只有单个路由器的网络, 不发送 Hello, 不形成邻居.
  • cost: 接口开销. 一般内网可以直接填写为 1, VPN 等隧道链路建议设置为稍大的值, 如 100
  • hello: Hello 报文的发送间隔, 单位为秒

    若邻居间 Hello 报文的发送间隔不同, 则会直接无法握手成为邻居, 因此此参数在不同路由器之间必须相同
  • retransmit: 重传间隔, 单位为秒
  • authentication: OSPF 认证类型
  • ecmp weight: ECMP 权重
  • bfd: 是否启用 BFD 支持

示例配置

area 0.0.0.0 {
    interface "br-lan" { stub; };
    interface "zta7oqfzy6" {
        type broadcast;
        cost 100;
        hello 20;
    };
};
  • 完成上述所有配置后重启 Bird
/etc/init.d/bird restart

验证

  • 使用以下指令来查看 Bird 的生效状况
birdc s p
  • 如看到 OSPF 协议为 Running 即表明生效成功
intra_ospf_v4 OSPF       intra_table_v4 up     16:49:39.948  Running
intra_ospf_v6 OSPF       intra_table_v6 up     16:49:39.948  Running

相关链接


结语

  • 本人非网络领域专业人士, 如有错误欢迎指出!
  • 如果觉得文章对您有所帮助, 请将其分享给需要的人, 感谢!
Linux 运维 - 新版 OpenWrt 基于 Bird 的 OSPF 组网实现
https://blog.nanami.tech/archives/216/
本文作者 Madobi Nanami
发布时间 2026-02-10
许可协议 CC BY-NC-SA 4.0
发表新评论