告别 ALLinBOOM,用 VRRP 为折腾旁路由保驾护航
爱折腾的大伙都知道,ALLinONE 软路由一旦发生崩溃,便会造成全家断网(ALLinBOOM)。
解决这一问题的思路在于,把路由功能与扩展功能进行解耦处理,也就是采用“主路由 + 旁路由”这一架构。在常见的旁路由方案当中,要么需要客户端手动把网关指向旁路由(一旦旁路由故障,每个设备都要手动改回主路由),要么在旁路由上开启强制 DHCP 功能(旁路由宕机之后,DHCP 服务随之失效,新设备将无法获取 IP 地址)。这两种方式在自动化方面均有所欠缺,一旦遇到断网,全家人就要给你上压力了。
更为省心的做法是,引入 VRRP (虚拟路由冗余协议),让主路由与旁路由共同使用一个虚拟网关 IP 地址。在正常状态下,旁路由会作为 MASTER 角色来接管流量;一旦旁路由发生故障,主路由会在数秒内自动接替其工作,整个切换过程对客户端而言完全无感。
下面给出基于 VRRP 协议的具体配置方法。整个方案需要借助两台设备来完成:其中一台作为主路由,负责拨号、NAT 以及 DHCP 服务,其 VRRP 角色为 BACKUP ;另一台作为旁路由,负责处理特殊流量(例如去广告、科学上网等),其 VRRP 角色为 MASTER 。同时,还需要设置一个虚拟网关 IP ( VIP ),以此作为客户端统一的网关地址,并由 VRRP 协议动态地对其进行接管。
以下配置以具体的硬件设备为例(可以将其任意更换为手头其他支持 OpenWrt 系统的设备): 主路由:H3C NX30 Pro ( LAN 口 IP 地址为 10.0.0.1 ,默认网关指向运营商侧) 旁路由:斐讯 N1 ( IP 地址为 10.0.0.3 ,默认网关为 10.0.0.1 ,并关闭 DHCP 服务) VIP 虚拟网关地址:10.0.0.254⁄24
配置步骤基础准备:两台设备均已刷入 OpenWrt 系统,并且主路由的 WAN 口能够正常上网。 对旁路由进行静态 IP 地址的设置:IP 地址为 10.0.0.3 ,网关为 10.0.0.1 ,同时关闭其 DHCP 服务。
安装 keepalived 软件包 opkg update && opkg install keepalived 编写配置文件 旁路由( MASTER )的配置文件路径为 /etc/keepalived/keepalived.conf ,其内容如下: global_defs { router_id N1_MASTER } vrrp_instance VI_1 { state MASTER interface br-lan virtual_router_id 51 priority 150 advert_int 1 virtual_ipaddress { 10.0.0.254⁄24 }} 主路由( BACKUP )的配置文件路径同样为 /etc/keepalived/keepalived.conf ,其内容如下: global_defs { router_id NX30Pro_BACKUP }vrrp_instance VI_1 { state BACKUP interface br-lan virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 10.0.0.254⁄24 }}
解决 OpenWrt 系统中 UCI 配置覆盖的问题 在两台设备上分别创建 /etc/config/keepalived 文件,并写入以下内容: config globals ‘globals’ option alt_config_file ‘/etc/keepalived/keepalived.conf’ 启动 keepalived 服务并设置开机自启动 /etc/init.d/keepalived enable/etc/init.d/keepalived start
通过 DHCP 向客户端下发虚拟网关地址 在主路由的 LuCI 管理界面中,依次进入:网络 → 接口 → LAN → DHCP 服务器 → 高级设置 → DHCP-选项,然后填入 3,10.0.0.254 。
验证方案效果 正常状态下的验证:在旁路由上执行 ip addr show br-lan 命令,可以看到 10.0.0.254⁄24 地址存在,而主路由上则没有该 IP 地址。 客户端自动获取网关地址的验证:客户端能够自动获得网关地址 10.0.0.254 。 模拟旁路由故障的验证:执行 keepalived stop 命令停止旁路由的 keepalived 服务,3 秒之内主路由便会接管 VIP 地址。 恢复旁路由的验证:执行 keepalived start 命令重新启动旁路由的 keepalived 服务,VIP 地址会自动切换回旁路由。 重启测试的验证:将两台设备分别重启,重启之后 VIP 地址仍然位于旁路由上,客户端的网关地址也保持正确。
完成上述配置之后,一旦旁路由发生故障,系统会自动切换至主路由,用户几乎感觉不到断网的发生。这样一来,既能够放心地折腾各种插件功能,又不会影响到全家人的正常上网。虽然该配置过程相比手动修改网关的方式要稍微复杂一些,但是配置完成之后便可以实现一劳永逸的效果。
写得非常棒。给您锦上添花两点:1. 在 keepalived 中添加 ping 外网地址的功能,防止科学上网插件挂了但是 openwrt 还活着,PREROUTING 链依然存在,但客户端发出的数据包到达旁路由后,防火墙规则会将包扔给指定的端口,此时端口对应的监听进程已经没了,系统内核收到包后发现没有进程认领,通常会直接 DROP 或返回 RST 。2. 如果你所有设备只连接一个交换机就没问题。如果主从之间有交换机,然后下游还有交换机接设备,那么主从之间的交换机一旦坏了,主从都认为自己还活着是主机,就开始竞争给下游发包。这一点可以通过更改网络拓扑解决,大部分人遇不到的
@cloudsong #2 你说得非常对。基础 VRRP 配置只检测 keepalived 进程是否存活,无法感知业务层面的故障(如科学上网插件进程假死、dnsmasq 异常、内核转发失效等)。这种“半死”状态会导致 VIP 不切换,客户端流量依然指向已失效的旁路由,造成断网。
这部分需要根据各人自己使用的具体业务自定义需要检查的内容,就不单独写在文章里了,可以自行描述自己的需求让 AI 帮写合适的脚本逻辑
排版有点问题。。。