记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

OpenWrt软路由怎么实现双机热备份

OpenWrt软路由怎么实现双机热备份

双机热备份在OpenWrt软路由中可以通过VRRP实现,确保网络的稳定性和连续性。用户需要在两台OpenWrt设备上安装并配置keepalived软件包。主路由器配置为VRRP的主状态,而备份路由器为备份状态。
1. 双机热备份的概念
简单来说,双机热备份意味着有两台路由器(在本文中,我们用 OpenWrt 软路由)同时运行,但只有一台处于活跃状态,另一台处于备份状态。当活跃路由器出现问题时,备份路由器会自动接管网络,确保网络通信不被中断。
2. 实现双机热备份的基础:VRRP
VRRP(Virtual Router Redundancy Protocol)是实现双机热备份的关键协议。它允许两台或多台路由器共享一个虚拟 IP 地址。其中一台路由器作为主路由器,其他的作为备份。当主路由器失效时,其中一台备份路由器会自动成为新的主路由器,保持网络的连续性。
3. OpenWrt 下实现双机热备份的步骤
3.1 安装必要的软件包
首先,确保你的 OpenWrt 已经安装了keepalived软件包。你可以通过以下命令进行安装:
XML/HTML代码
  1. opkg update
  2. opkg install keepalived
3.2 配置 VRRP
接下来,我们需要在两台 OpenWrt 路由器上配置keepalived来实现 VRRP。
主路由器配置:
XML/HTML代码
  1. cat > /etc/keepalived/keepalived.conf <<-EOF
  2. vrrp_instance VI_1 {
  3.     state MASTER
  4.     interface br-lan
  5.     virtual_router_id 51
  6.     priority 100
  7.     advert_int 1
  8.     authentication {
  9.         auth_type PASS
  10.         auth_pass 1111
  11.     }
  12.     virtual_ipaddress {
  13.         192.168.1.1/24
  14.     }
  15. }
  16. EOF
备份路由器配置:
XML/HTML代码
  1. cat > /etc/keepalived/keepalived.conf <<-EOF
  2. vrrp_instance VI_1 {
  3.     state BACKUP
  4.     interface br-lan
  5.     virtual_router_id 51
  6.     priority 50
  7.     advert_int 1
  8.     authentication {
  9.         auth_type PASS
  10.         auth_pass 1111
  11.     }
  12.     virtual_ipaddress {
  13.         192.168.1.1/24
  14.     }
  15. }
  16. EOF
在这里,virtual_router_id是 VRRP 的唯一标识,确保在你的网络中是独一无二的。virtual_ipaddress则是两台路由器共享的虚拟 IP 地址。
3.3 启动和测试
分别在两个机器上运行这个命令,使自己的配置文件生效。
XML/HTML代码
  1. cat > /etc/config/keepalived <<-EOF
  2. config globals 'globals'
  3.   option alt_config_file "/etc/keepalived/keepalived.conf"
  4. EOF
在两台路由器上启动keepalived:
XML/HTML代码
  1. /etc/init.d/keepalived start
  2. /etc/init.d/keepalived enable
此时,你应该可以 ping 到192.168.1.1这个 IP 地址。当你断开主路由器的电源或网络时,备份路由器应该会自动接管,确保网络的稳定性。
4. 结语
OpenWrt 作为一个强大的开源软路由系统,其灵活性和扩展性为我们提供了实现高可用性网络的可能性。通过上述的步骤,即使在小型网络环境中,我们也可以享受到双机热备份带来的稳定性和连续性。
实验过程:
部署与配置
安装keepalived
在Openwrt上安装keepalived,可以通过opkg直接安装:
XML/HTML代码
  1. opkg update
  2. opkg install keepalived
运气好你可能直接安装好了,就可以跳到下一小节。但也可能你会收到这样的提示:
XML/HTML代码
  1. * satisfy_dependencies_for: Cannot satisfy the following dependencies for keepalived:
  2. * kernel (= 6.1.69-1-4bb6c728f5087dc3a67fcfdd70aa0707)
看起来是内核版本和源中的不太匹配了(或许你的OpenWRT太旧了)。但你或许也不想因为这就重新再刷个OpenWRT吧?有两种办法可解。
方案一:寻找对应版本的ipk
我们可以直接去源仓库下载和我们内核比较匹配的版本:下载keepalived.ipk后,安装它:
XML/HTML代码
  1. # 下载包,你可能要选择合适自己的版本
  2. wget https://downloads.openwrt.org/releases/23.05.2/packages/x86_64/packages/keepalived_2.2.7-10_x86_64.ipk
  3.  
  4. # 使用opkg安装此ipk
  5. opkg install keepalived_2.2.7-10_x86_64.ipk
要是像我一样不走运,还会报错:
XML/HTML代码
  1. Unknown package 'keepalived'.
  2. Collected errors:
  3.  
  4. - pkg_hash_check_unresolved: cannot find dependency libmagic for keepalived
  5. - pkg_hash_check_unresolved: cannot find dependency libnfnetlink0 for keepalived
  6. - pkg_hash_fetch_best_installation_candidate: Packages for keepalived found, but incompatible with the architectures configured
  7. - opkg_install_cmd: Cannot install package keepalived.
我们可以用opkg安装上面提示缺失的包:
XML/HTML代码
  1. opkg install libmagic
  2. opkg install libnfnetlink0
现在再次opkg install keepalived_2.2.7-10_x86_64.ipk或许能成功了。
方案二:自行编译keepalived
我们可以直接去keepalived官网(https://www.keepalived.org/download.html)下载对应版本的源码,基于里面的Makefile等编译,但这好像略麻烦。
更简单的是因为OpenWRT已经集成好了相关的编译脚本。
配置主机和备机
上面安装成功后,我们直接ps | grep keep可以看到相关keepalived的进程以及它使用的配置文件:
XML/HTML代码
  1. root@OpenWrt:~# ps | grep keep
  2. 7529 root      7308 S    /usr/sbin/keepalived -n -f /tmp/keepalived.conf
我知道你想编辑对应的配置了,但请等等,注意看这个文件的行首提醒了你人家是自动生成的,所以我们不能直接编辑/tmp/keepalived.conf。
XML/HTML代码
  1. cat > /etc/config/keepalived <<-EOF
  2. config globals 'globals'
  3.   option alt_config_file "/etc/keepalived/keepalived.conf"
  4. EOF
上面比较重要的是通过option alt_config_file告诉脚本使用写自己的配置文件,它的路径在/etc/keepalived/keepalived.conf。然后再配置主机和备机,配置稍有不同。
然后要确定一个关键的东西是VIP(虚拟IP),我的两台Openwrt的地址分别是:192.168.50.253,192.168.50.254。所以给VIP设定为一个不冲突的192.168.50.252。
主机:
XML/HTML代码
  1. cat > /etc/keepalived/keepalived.conf <<-EOF
  2. global_defs {
  3.     router_id LVS_1
  4. }
  5. vrrp_instance VI_1 {
  6.     interface br-lan # 这里是lan口网卡名,通过ip a查看
  7.     state MASTER
  8.     virtual_router_id 1  # 主机和备机这个需要一致
  9.     priority 100  # 主机建议设置比备机高
  10.     advert_int 1
  11.     authentication {
  12.         auth_type PASS
  13.         auth_pass 1111
  14.     }
  15.     virtual_ipaddress {
  16.         192.168.50.252/24 # 这里是虚拟ip地址
  17.     }
  18. }
  19. EOF
备机:
XML/HTML代码
  1. cat > /etc/keepalived/keepalived.conf <<-EOF
  2. global_defs {
  3.     router_id LVS_1
  4. }
  5. vrrp_instance VI_1 {
  6.     interface br-lan # 这里是lan口网卡名,通过ip a查看
  7.     state BACKUP
  8.     virtual_router_id 1  # 主机和备机这个需要一致
  9.     priority 50  # 主机建议设置比这个更高
  10.     advert_int 1
  11.     authentication {
  12.         auth_type PASS
  13.         auth_pass 1111
  14.     }
  15.     virtual_ipaddress {
  16.         192.168.50.252/24 # 这里是虚拟ip地址
  17.     }
  18. }
  19. EOF
这样配置后,分别重启主机和备机的keepalived进程:
XML/HTML代码
  1. /etc/init.d/keepalived restart
验证
接下来是见证奇迹的时刻,你肯定好奇这故障了多久能切换啊?我也是比较好奇,所以我这样抓了个包:
XML/HTML代码
  1. # 前面铺垫的知识知道了VRRP的广播地址是这个,直接tcpdump抓包:
  2. tcpdump -i any host 224.0.0.18
然后让主机故障,你可以通过ifconfig br-lan down来关闭设备,也可以更暴力点直接关掉那台机器。于是会收到:
XML/HTML代码
  1. 00:58:15.004593 IP 192.168.50.254 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20  
  2. 00:58:15.004612 IP 192.168.50.254 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20  
  3. 00:58:15.466668 IP 192.168.50.254 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 0, authtype simple, intvl 1s, length 20  
  4. 00:58:15.466696 IP 192.168.50.254 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 0, authtype simple, intvl 1s, length 20  
  5. 00:58:16.271598 IP 192.168.50.253 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 50, authtype simple, intvl 1s, length 20  
  6. 00:58:16.271604 IP 192.168.50.253 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 1, prio 50, authtype simple, intvl 1s, length 20  
从时间可以看到,大概用时1s就切换完成了。我们也可以看一下OpenWRT的日志:
XML/HTML代码
  1. # 使用logread查看openwrt的日志  
  2. > logread  
  3. Thu Dec 28 00:58:16 2023 daemon.info Keepalived_vrrp[7530]: (VI_1) Entering MASTER STATE  
  4. Thu Dec 28 00:58:16 2023 daemon.info avahi-daemon[3305]: Registering new address record for 192.168.50.252 on br-lan.IPv4.  
  5. Thu Dec 28 01:00:25 2023 daemon.info Keepalived_vrrp[7530]: (VI_1) Master received advert from 192.168.50.254 with higher priority 100, ours 50  
  6. Thu Dec 28 01:00:25 2023 daemon.info Keepalived_vrrp[7530]: (VI_1) Entering BACKUP STATE  
以上是备机日志,可以看到58分备机成为了Master,之后主恢复后,备机又因为优先级低于主,让出了主再次成为备。

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):