前
现在的家庭网络是华硕硬路由+Openwrt 软路由的架构。拨号流量统计等等的基本功能使用更可靠的硬路由,魔法以及其他的一下小服务使用软路由来实现。
习惯于用硬路由做主路由,主要原因由以下几点:
- 华硕官方提供定期的系统升级
- 系统稳定不折腾
- 软路由要不定期折腾,很容易导致全屋断网
在之前架构中,也是有一个切换的方式,是通过脚本运行在 路由器上,来Ping 8.8.8.8,如果ping不通就设置网关地址到本地。但是这样有很大的问题,会导致一个大概十秒钟的网络中断,wifi 也会断开,而且检测频率也是需要考量的点。简直是太不优雅了。
刚好周末有空,就思考了下这个方案可以优化的地方,了解到了 VRRP 协议。利用keepalived,软路由作为MASTER主节点,华硕路由作为BACKUP备用节点,当主节点挂了,自动漂到备用节点上。所以当我访问192.168.0.2 这个ip时,只要有一个节点可用,局域网设备都能访问到任意一个路由器。这样就实现了一个高可用的路由网关的设计
简单聊聊VRRP
虚拟路由冗余协议 (VRRP) 详解
为了实现我们想要的效果,我们需要了解下 VRRP协议(Virtual Router Redundancy Protocol, VRRP),根据百科的讲解。
虚拟路由冗余协议是一种网络协议,旨在通过多个路由器组成的冗余路由器组来提高网络的可靠性和可用性。在这种冗余路由器组中,一个路由器被选为主路由器(Master),其余的为备用路由器(Backup)。当主路由器发生故障时,备用路由器能够快速接管,保证网络的连续性。
VRRP 的工作原理
- 虚拟路由器:VRRP 创建一个虚拟路由器。这个虚拟路由器有一个虚拟 IP 地址,网络中的设备将这个 IP 地址作为它们的默认网关。
- 路由器角色:在一个 VRRP 组中,路由器可以是主路由器或备用路由器。主路由器负责处理数据流量,而备用路由器在主路由器故障时接管工作。
- 优先级:每个路由器有一个优先级(0-255),优先级最高的路由器成为主路由器。默认情况下,路由器的优先级为 100。
- 选举过程:初始选举过程基于优先级,优先级最高的路由器成为主路由器。如果两个路由器优先级相同,则接口 IP 地址最高的成为主路由器。
- 心跳机制:主路由器会定期发送 VRRP 广播包(心跳),备用路由器通过这些包监控主路由器的状态。如果主路由器的心跳包停止,备用路由器将开始选举过程,选出新的主路由器。
VRRP 的优势
- 高可用性:通过主备路由器的切换,VRRP 提供了冗余路径,确保了网络的高可用性。
- 快速故障恢复:当主路由器发生故障时,备用路由器能够在几秒钟内接管,保证网络流量不间断。
- 负载均衡:可以通过配置多个 VRRP 组,将流量分散到不同的路由器上,达到负载均衡的效果。
VRRP 是一种有效的提高网络可靠性和可用性的协议。通过虚拟路由器和优先级机制,VRRP 能够在主路由器发生故障时,快速切换到备用路由器,确保网络的连续性。
安装过程
在 ASUS 路由器上安装 Keepalived
-
安装 Entware:
请参考大量的在线教程,按照步骤安装 Entware。 - 安装 Keepalived:
shell
opkg update
opkg install keepalived
- 备份默认配置文件:
shell
mv /opt/etc/keepalived/keepalived.conf /opt/etc/keepalived/keepalived.conf.bak
- 应用新配置,请注意替换以下配置中的两个参数值:
shell
cat > /opt/etc/keepalived/keepalived.conf <<-EOF
global_defs {
router_id LVS_1
}
vrrp_instance VI_1 {
interface br0 # LAN 口网卡名,可通过 ip a
查看
state BACKUP
virtual_router_id 1
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.0.5 # 虚拟 IP 地址
}
}
EOF
- 启动 Keepalived:
shell
nohup /opt/sbin/keepalived -n -f /opt/etc/keepalived/keepalived.conf &
# 确认程序启动成功,以下命令有回显则表示启动成功
ps | grep keepalived | grep -v grep
- 设置开机启动(适用于梅林固件,其他固件请自行测试):
shell
cat >> /jffs/scripts/post-mount <<-EOF
nohup /opt/sbin/keepalived -n -f /opt/etc/keepalived/keepalived.conf &
EOF
在 OpenWRT 上安装 Keepalived
- 安装 Keepalived:
shell
opkg update
opkg install keepalived
- 备份默认配置文件:
shell
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
- 应用新配置,请注意替换以下配置中的两个参数值:
shell
cat > /etc/keepalived/keepalived.conf <<-EOF
global_defs {
router_id LVS_1
}
vrrp_instance VI_1 {
interface br-lan # LAN 口网卡名,可通过 ip a
查看
state MASTER
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.0.5 # 虚拟 IP 地址,与主路由相同
}
}
EOF
- 启动 Keepalived:
安装好了后,默认是作为service启动的, 这时就出现一个坑,keepalived不读取默认配置文件。这里需要使用service 来进行启动
shell
service keepalived stop
service keepalived disable
# 确认程序启动成功,以下命令有回显则表示启动成功
ps | grep keepalived | grep -v grep
- 设置开机启动:
shell
sed -i '/exit 0/i\nohup \/usr\/sbin\/keepalived -n -f \/etc\/keepalived\/keepalived.conf &' /etc/rc.local
测试
安装完成之后,使用ping 192.168.0.5 是可以ping 通的,然后kill掉 旁路由上的keepalived ,可以观察到中断大概 两秒钟之后便恢复 echo。自此 一个家庭的HA 路由搭建完成
后
再也不担心折腾软路由全屋断网了。