Keepalived 的 track_interface 仅检查接口存在性、UP 状态及 IP 配置,无法感知物理链路中断;需结合 vrrp_script 读取 /sys/class/net/eth0/carrier 等实现真实链路探测。

Keepalived 的 track_interface 本身**不直接监控物理网卡“状态”(如 link up/down)**,它只检查接口是否存在、是否处于 UP 状态(即内核接口 flag 中的 IFF_UP),且该接口是否配置了 IP 地址。它**无法感知网线拔掉、光模块故障、对端设备宕机等真实链路层中断**——这些场景下 Linux 内核通常仍维持接口为 UP 状态(尤其在无 MII/ETHTOOL 支持或未启用 carrier detection 的情况下)。
但你可以结合 track_interface 与外部脚本 + vrrp_script,构建真正可靠的物理链路自愈机制。核心思路是:用脚本主动探测链路连通性(如 ping 网关、检查 ethtool 输出、读取 sysfs carrier 状态),再让 Keepalived 根据脚本结果触发 VIP 切换。
✅ 正确理解 track_interface 的作用范围
track_interface 是 VRRP 实例级别的配置项,用于声明哪些网络接口的“存在性”和“UP+IP 配置”状态会影响当前节点的 VRRP 优先级。它的典型行为包括:
- 若指定接口不存在(如网卡驱动未加载),Keepalived 会立即降低优先级(默认降 50),可能触发主备切换
- 若接口存在但
ip link show eth0显示state DOWN(IFF_DOWN),同样触发降权 - 若接口 UP 但无 IP(
ip addr show eth0无 inet 条目),也会被判定为异常 -
⚠️ 注意:即使
ethtool eth0显示Link detected: no,只要内核没将接口设为 DOWN,track_interface就不会响应
? 补充真实链路探测:用 vrrp_script + ethtool/sysfs
要捕获“网线拔掉但接口仍 UP”的情况,推荐使用系统原生的 /sys/class/net/eth0/carrier 文件(需内核支持 netdev-carrier),它能准确反映物理链路状态(1=link up,0=link down):
创建探测脚本 /etc/keepalived/check_link.sh:
#!/bin/bash
INTERFACE=${1:-eth0}
CARRIER_FILE="/sys/class/net/${INTERFACE}/carrier"
<p>if [[ -f "$CARRIER_FILE" ]] && [[ "$(cat "$CARRIER_FILE" 2>/dev/null)" == "1" ]]; then
exit 0 # 链路正常
else
exit 1 # 链路中断
fi
赋予执行权限并测试:
chmod +x /etc/keepalived/check_link.sh /etc/keepalived/check_link.sh eth0 # 应返回 0;拔网线后应返回 1
? 在 keepalived.conf 中集成链路探测
在全局定义中注册脚本,在 VRRP 实例中调用:
vrrp_script chk_eth0_link {
script "/etc/keepalived/check_link.sh eth0"
interval 2 # 每 2 秒执行一次
weight -30 # 失败时优先级减 30(确保足以触发切换)
fall 2 # 连续失败 2 次才判定为故障
rise 2 # 连续成功 2 次才恢复
}
<p>vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100</p><pre class="brush:php;toolbar:false;">track_interface {
eth0 # 仍保留,覆盖接口消失/强制 DOWN 等基础故障
}
track_script {
chk_eth0_link # 关键:真实链路探测
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}}
这样,当网线拔掉 → /sys/class/net/eth0/carrier 变为 0 → 脚本返回 1 → 连续两次失败 → 优先级从 100 降至 70 → 若备机优先级为 90,则自动完成主备切换。
? 进阶建议:多维度验证更稳妥
单一 carrier 文件依赖内核驱动支持(部分老旧网卡或虚拟化环境可能不暴露)。可叠加以下方式增强鲁棒性:
-
ping 网关:探测三层可达性(
ping -c1 -W1 192.168.1.1 &>/dev/null),避免二层通但网关宕机的情况 -
ethtool 检查:解析
ethtool eth0 | grep "Link detected"输出(注意需 root 权限,Keepalived 默认以非 root 运行,需加! /usr/bin/sudo或调整 sudoers) -
双接口冗余 track:若服务器有双网卡上联不同交换机,可同时
track_interface { eth0 eth1 }并配独立脚本,实现链路级高可用

















