Keepalived通过vrrp_script调用自定义网关检测脚本实现故障切换:脚本用ping或ip route验证网关,exit 0/1标识状态,配合weight -5、fall 2、rise 2参数控制优先级变化,触发主备切换。

Keepalived 本身不直接监控网关连通性,但通过 vrrp_script 自定义检测脚本,可将网关可达性(如 ping、curl 或路由表检查)转化为 VRRP 实例的权重变化,从而触发主备切换。关键在于让脚本返回明确的退出码,并与 weight 配合实现“网关失效 → 降低优先级 → 让出 MASTER 角色”逻辑。
编写可靠的网关健康检查脚本
脚本需快速、稳定、避免误判。推荐使用 ping -c1 -W1 检测默认网关,或用 ip route get 验证下一跳是否活跃:
- 脚本路径建议统一放在
/etc/keepalived/check_gateway.sh,并赋予可执行权限(chmod +x) - 必须以
exit 0表示“网关正常”,exit 1表示“异常”;Keepalived 只识别这两个状态 - 避免使用耗时操作(如多次重试、sleep),单次检测应在 1 秒内完成;超时由 Keepalived 的
interval和timeout控制 - 示例脚本片段:
#!/bin/bash<br>GW=$(ip route | awk '/default/ {print $3; exit}')<br>[ -z "$GW" ] && exit 1<br>ping -c1 -W1 "$GW" &> /dev/null && exit 0 || exit 1
在 keepalived.conf 中配置 vrrp_script
定义脚本及其执行频率和失败阈值,确保 Keepalived 能及时感知网关变化:
- 在
global_defs外、vrrp_instance前添加:vrrp_script chk_gateway {<br> script "/etc/keepalived/check_gateway.sh"<br> interval 2<br> weight -5<br> fall 2<br> rise 2<br>} -
weight -5表示每次检测失败,该节点 VRRP 实例优先级减 5;若原 priority 是 100,连续失败两次后变为 90,低于备机的 100 就会触发切换 -
fall 2表示连续 2 次失败才判定为“down”,rise 2表示连续 2 次成功才恢复,防止抖动
绑定脚本到 VRRP 实例并验证行为
在 vrrp_instance VI_1 块中引用脚本,并确认优先级设置合理:
- 添加
track_script { chk_gateway },使实例监听该检测结果 - MASTER 节点初始
priority 100,BACKUP 节点设为priority 99(或更低,留出 weight 调整空间) - 启动 Keepalived 后,用
ip a确认 VIP 是否落在预期节点;手动断开网关(如拔线或iptables -A OUTPUT -d [gateway] -j DROP),观察日志(journalctl -u keepalived -f)是否出现 “VRRP_Script chk_gateway failed” 及 “Changing effective priority” 记录 - 恢复网关后,检查是否自动切回,且无脑震荡(依赖
rise参数防误恢复)
增强健壮性的实用建议
生产环境需考虑单点故障和多层判断:
- 不要只 ping 网关 IP:有些网关会禁 ping,改用
curl -I --connect-timeout 1 http://[gateway]:80或检查 ARP 表(ip neigh show | grep -q "$GW.*REACHABLE") - 可组合多个检测:例如同时跟踪网关连通性和上游 DNS 可达性,任一失败即降权,提升判断准确性
- 在脚本中加入日志记录(如
echo "$(date): gateway down" >> /var/log/keepalived-gw.log),便于事后排查 - 避免与系统防火墙冲突:确保脚本使用的 ping/curl 端口未被 DROP,必要时在 local rules 中放行










