🌐OpenWRT配置Bird使用OSPF国内外动态路由分流

2024-12-29|2025-1-1
Yawatasensei
Yawatasensei
type
status
date
slug
summary
tags
category
icon
password
🛠
之前写过一篇关于RouterOS上使用OSPF("Open Shortest Path First",翻译为中文是“开放式最短路径优先”)进行国内外动态路由分流的文章,当时就在想,国内使用RouterOS作为主路由的人群应该不是很多,大多数的人有这个需要的人,使用的主路由系统应该都是OpenWRT或者其衍生版本。今天的文章就把之前的坑补上,将在OpenWRT系统中,使用Bird实现OSPF动态路由的国内外分流。

📝 配置背景

  • 主路由器:OpenWRTImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
    • 光猫桥接,接口为wan
    • 内核版本为5.15.167(stable)
    • 架构X86_64
  • 旁路由(旁路网关):OpenWRT(ImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
    • 接口为br-lan,网关为主路由IP地址
    • 运行OpenClash作为科学服务
    • 内核版本为5.15.167(stable)
    • 架构X86_64

📝 为什么要使用OSPF进行分流

在目前大多数网友使用OpenWRT路由系统的场景中,旁路由(旁路网关)应该是很大一部分,从而决定有一定基数的用户还保留着使用代理需要使用旁路由(旁路网关)这种习惯,从最初的各种盒子,到后来的Hyper-V虚拟机,再进阶到All in One的PVE,将Clash、SingBox、Dae等代理软件放在旁路由(旁路网关)应该已经称为很多使用者的一种习惯。而在使用过程中所配置的网络拓扑结构,随着不断的修改、缝补、优化,迁移起来的工作量也相对较大,从而在另一方面也继续维持这种习惯的惯性。
以上都是我个人作为使用者的一些猜测。对于我来说,在使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因主要有以下两点:

增加直连效率

不管是Clash系列还是Singbox系列,或者直连性能非常恐怖的Dae,最终都需要由程序根据规则进行国内外的流量分流,不管是用Geosite还是GeoIP,数据均需要由代理程序进行一次处理,在对国内直连网站的效率上,或多或少都会产生影响。而由于这多出来的一层处理,对于国内的直连流量来说,也增加的不确定性。所以我选择在主路由使用路由表功能对国内与国外的流量进行拆分分流,国内流量直接通过主路由的网关出去,国外的流量再交给旁路由(旁路网关)根据规则进行处理,最大化直连性能。
至于为什么使用路由表而不是防火墙转发:路由表的查询发生在网络层(L3),是数据包转发的第一步,防火墙规则在路由决策之后处理,会增加额外的处理开销,更占用CPU,效率也没有路由表更高,当规则很多时,防火墙的性能会受到很明显的影响。路由器的主要工作就是根据目的地址,为数据包选择最优路由路径,这是路由器最为基础也是最为核心的功能。

增加网络容错性

代理这个东西,不是一直都很稳的。如果在主路由上使用,如果代理程序出现问题(尤其是喜欢劫持防火墙规则的一些程序),那么就意味着家里的网络直接出现问题,无法正常使用。如果自己一个人还好,但是如果家里有其他人使用,例如老人、孩子、夫人等等,那么就可能会因为网络出现问题而耽误使用,或者造成更多家庭问题。OSPF的动态路由可以很好的解决这一点,收敛速度与接收速度都很快,即便是旁路出现问题,那么也能在5秒之内完成路由表的收敛工作,将主路由的路由表恢复至默认状态,不耽误日常的使用。
综上两点,这也是我为什么使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因。

📝 OpenWRT配置接收Bird的OSPF动态路由

此教程配置需要在主路由和旁路由进行操作。操作前建议备份或镜像,避免出现不可逆的网络问题。

OpenWRT旁路由(旁路网关)配置

旁路网关的配置可以参考《🔀RouterOS使用OSPF智能分流国外流量》中的具体说明,这里只列出步骤与相关的代码。
确认/etc/sysctl.d/10-default.conf开启以下选项:

安装Bird2

当使用OSPF协议时,通常需要一个路由守护进程来实现其功能。Bird是一种轻量且高性能的解决方案,能够同时支持IPv4和IPv6路由表。作为一款支持多种路由协议的软件,Bird同时也支持OpenWRT系统及其大部分衍生版本。
  • 通过opkg安装所需软件包
  • 编辑配置文件
创建route路由表文件目录,用于存放生成的route4.confroute6.conf路由表文件。
bird的基础配置文件位于/etc/bird.conf ,使用你喜欢的编辑器进行编辑。其中router id 为旁路由的局域网IP地址,interface 为网络接口名称,例如我的是eth0 ,是与主路由连接的接口的名称。

生成动态路由规则

使用dndx/nchnroutes: !chnroutes - chnroutes negated的框架进行动态路由规则生成,原理是根据获取到的国内IPv4地址范围和APNIC内的国内IPv6地址范围取反。
  • 编辑Produc.py
在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是eth0,就改成eth0
替换48IPv4Network('172.16.0.0/12')的保留地址,替换为IPv4Network('172.24.0.0/13'),避免影响Cloudflare访问。
原因在于Cloudflare IP Range中包括:172.64.0.0/13 这个地址范围,如果将IPv4Network('172.16.0.0/12') 配置为保留地址,那么Cloudflare所使用的172.64.0.0/13 也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
  • 编辑Makefile
取消567行的注释。并修改china_ip_list上游地址为mayaxcn 提供的china-ip-list
  • 生成路由表
需要确保你已经安装make,如果没有安装可以通过opkg install make 进行安装。执行:
返回结果:
  • 确认Bird2路由表状态
执行命令birdc show route protocol static1查看IPv4路由表
notion image
执行命令birdc show route protocol static2查看IPv6路由表:
notion image
  • 添加定时任务

OpenWRT主路由配置

安装Bird2

配置Bird2

配置文件同样位于/etc/bird.conf ,文件内容如下,包括IPv4地址的路由表以及IPv6地址的路由表。
其中router id为主路由的局域网IP地址,interface为网桥名称,例如br-lan ,是提供DHCP服务的接口名称。
保存后执行以下命令重启bird并配置bird为开启自动启动:

查看bird获取OSPF邻居信息

返回结果:
其中10.0.0.10 为我的旁路网关地址,State显示为Full即表示已经完成与OSFP邻居的连接建立完成。

查看bird获取OSPF动态路由信息

返回结果大概类似于以下这种,数量太多就截取一部分:

🤗 总结归纳

需要注意的是,通过OSPF输出到OpenWRT内核的路由表并不会在Luci界面的的路由信息中进行展示。如果需要查看,可以通过ip route show命令。
本篇文章基本是在之前文章的基础上,完善了一下OpenWRT路由系统下使用Bird建立OSPF动态路由分流的操作指南,大部分内容都是以前已经写过的。
今天在进行环境测试的时候,也发现了一些有趣的问题,例如:
Bird中的type pointopoint 其实只允许两台主机建立动态路由的邻居关系,当第三台机器想要加入的时候,通过syslog会发现提示:
同时neighbor state会显示ExStart
这时候需要修改typebroadcast才可以。

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
使用Pipedream同步RSS至Twitter(X.com)卸载Xbox Game Bar
Loading...