环境介绍

内网:192.168.50.0/24

主路由:华硕AX86U,主路由做DHCP、AP

旁路由:群晖虚拟机跑的OpenWrt,跑一些插件

习惯于用硬路由做主路由,主要原因由以下几点:

  1. 华硕官方提供定期的系统升级
  2. 系统稳定,不折腾
  3. 软路由要不定期折腾,要升级换代

出现的问题

由于网关和DNS都指向软路由,当软路由挂了,家里的网络就瘫痪了,这绝不能忍。

今天突然想到既然各种web应用服务可以负载均衡,为啥网络ip不行,于是发现神器keepalived。其实以前知道这个东西,只是不懂这个是干啥的,跟nginx有啥区别。这里顺便粗略介绍一下三种负载均衡工具的区别:

  1. nginx
    一般用于http/https等七层负载均衡,新版本支持四层负载均衡
  2. haproxy
    支持四层和七层的负载均衡
  3. keepalived
    一般放在nginx和haproxy的前,做传输层负载均衡。

我的应用场景

利用keepalived,软路由作为MASTER主节点,华硕路由作为BACKUP备用节点,当主节点挂了,自动漂到备用节点上。所以当我访问192.168.50.5这个ip时,只要有一个节点可用,局域网设备都能访问到任意一个路由器。

配置过程

华硕安装keepalived

这里使用Entware来安装,以下步骤使用ssh执行

1.先安装Entware,不会还有人用华硕不用梅林固件吧?如果不是则使用手动安装教程

2.安装keepalived

opkg update
opkg install keepalived

3.备份默认配置

mv /opt/etc/keepalived/keepalived.conf /opt/etc/keepalived/keepalived.conf.bak

4.应用配置,注意替换下面2处参数值

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 1111
    }
    virtual_ipaddress {
        192.168.50.5 # 这里是虚拟ip地址
    }
}
EOF

5.启动程序

nohup /opt/sbin/keepalived -n -f /opt/etc/keepalived/keepalived.conf &
# 以下命令有回显则启动成功
ps | grep keepalived | grep -v grep

6.添加开机启动,以下为梅林固件添加方式,其他固件未测试

cat >> /jffs/scripts/post-mount <<-EOF
nohup /opt/sbin/keepalived -n -f /opt/etc/keepalived/keepalived.conf &
EOF

OpenWrt旁路由配置

以下步骤使用ssh执行

1.安装keepalived

opkg update
opkg install keepalived

2.备份默认配置

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

3.应用配置,注意替换下面2处参数值

cat > /opt/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 1111
    }
    virtual_ipaddress {
        192.168.50.5 # 这里是虚拟ip地址,与主路由相同
    }
}
EOF

4.启动程序

nohup /usr/sbin/keepalived -n -f /opt/etc/keepalived/keepalived.conf &
# 以下命令有回显则启动成功
ps | grep keepalived | grep -v grep

6.添加开机启动

sed -i '/exit 0/i\nohup \/usr\/sbin\/keepalived -n -f \/etc\/keepalived\/keepalived.conf &' /etc/rc.local 

华硕主路由DHCP配置

将局域网设备的默认网关和DNS Server都指向虚拟IP地址192.168.50.5

收尾测试

在我局域网的电脑上持续ping虚拟IP

1.重启旁路由OpenWrt,查看ping的波动情况
关机时ping有几秒中断

开机时ping也有几s的中断和延迟波动

开机后由于keepalived主节点的权重设置的比备份节点高,所以请求成功切换到主节点,整体上体验还是比较满意的

2.重启华硕主路由
这里我没有外部的AP,华硕主路由重启后WIFI丢失,无法测试。不过理论上,重启备份节点,虚拟IP持续可以访问。我这里暂时不需要双路由可用的场景,所以就不做测试了。

设想一下双路由负载的使用场景

  • 线路1:光猫 => 路由A keepalived => AP1 => 用户
  • 线路2:光猫 => 路由B keepalived => AP1 => 用户

DHCP的网关和DNS配置需要配置为keepalived的虚拟IP,这里有个问题,局域网只能有一台路由器开启DHCP,不过即使DHCP的节点挂了,也不影响网络的临时的可用性

最后修改:2022 年 05 月 07 日
如果觉得我的文章对你有用,请我喝杯咖啡吧☕️~