Linux ARP/邻居表(NUD)完整笔记
Linux ARP 缓存生命周期由 NUD 状态机控制,而不是简单 TTL。状态主要为:INCOMPLETE、REACHABLE、STALE、DELAY、PROBE、FAILED、NOARP、PERMANENT。MetalLB Layer2 模式通过定期 GARP(默认 30s)不断刷新邻居表,使 VIP 的 ARP 永不过期。实际运行中,ARP 状态大多在 REACHABLE/STALE 间交替
目录标题
Linux ARP/邻居表(NUD)完整笔记
本笔记全面整理 Linux 下 ARP(邻居表)状态、生命周期、相关内核参数、MetalLB 影响、命令示例等内容,可直接作为学习与排障使用的参考文档。
1. ARP / 邻居表的本质
Linux 中,IPv4 使用 ARP(地址解析协议),IPv6 使用 NDP。两者在 Linux 内核中统一由 邻居子系统(Neighbor Subsystem) 管理,其运行机制称为 NUD(Neighbor Unreachability Detection)。
邻居表不仅保存 IP→MAC 映射,还保存对应条目的可达性状态,用于决定是否需要重新探测。
2. Linux 邻居表(ARP/NDP)所有状态(NUD State)
以下是 Linux 内核所有 NUD 状态及含义。
| 状态 | 名称 | 含义 / 触发时机 |
|---|---|---|
| INCOMPLETE | 未完成 | 已发送 ARP 请求,等待应答;MAC 尚未知。 |
| REACHABLE | 可达 | 最近一次通信成功;在一定时间内认为可达(默认 30 秒左右)。 |
| STALE | 过期 | 超过 REACHABLE 时间但尚未重新探测,不立即发起 ARP;下一次使用时触发探测。 |
| DELAY | 延迟 | 当使用 stale 条目时,内核等待短暂时间(默认 5 秒)以期收到对方的 unsolicited ARP。 |
| PROBE | 探测中 | 发送 ARP probe 以重新验证邻居是否可达。 |
| FAILED | 失败 | 多轮 ARP/Probe 均失败,确认无法到达。 |
| NOARP | 不需要 ARP | 多用于点对点链路(例如 gre、tun),无需 ARP。 |
| PERMANENT | 静态 | 手动添加的静态邻居条目,永不过期。 |
状态转换典型流程
REACHABLE → STALE → DELAY → PROBE → REACHABLE
↓
(失败)
FAILED
3. 如何查看邻居表状态
查看全部邻居表
ip neigh show
查看指定 IP
ip neigh show <IP地址>
查看某个网卡
ip neigh show dev <接口名>
持续监控状态变化
watch -n1 'ip neigh show | grep <IP或MAC>'
4. Linux ARP 缓存相关内核参数
Linux 并非简单“TTL”,而是 NUD 状态机 + 若干定时器。关键参数如下:
| 参数 | 默认值 | 意义 |
|---|---|---|
| base_reachable_time_ms | 30000 ms | REACHABLE 状态持续时间(30 秒,含随机扰动)。 |
| gc_stale_time | 60 秒 | 条目多久变为 STALE。 |
| delay_first_probe_time | 5 秒 | DELAY 状态持续时间。 |
| ucast_solicit / mcast_solicit | 3 次 | PROBE 阶段单播/广播 ARP 试探次数。 |
查看参数:
cat /proc/sys/net/ipv4/neigh/default/base_reachable_time_ms
cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
cat /proc/sys/net/ipv4/neigh/default/delay_first_probe_time
5. MetalLB Layer2 模式对 ARP 缓存的影响
MetalLB 在 Layer2 模式下,所有 VIP(LoadBalancer IP)依靠 Gratuitous ARP(GARP) 进行宣告,让局域网内所有主机更新其 ARP 缓存为当前的“owner node”。
MetalLB 行为:
- VIP 分配时 → 立即发送 GARP(刷新各主机 ARP)
- 周期性发送 GARP(默认 30 秒)
- 切换 owner 时 → 立即大量 GARP(快速收敛)
配置示例(可调整周期)
protocol: layer2
announcement-interval: 30s
6. MetalLB + Linux ARP 的综合行为(实际效果)
由于 Linux 的默认 ARP 过期时间为:
- REACHABLE:约 30 秒
- STALE:60 秒后触发验证
且 MetalLB 每 30 秒广播一次 GARP,因此:
⭐ 最终效果:
- 邻居表几乎一直保持 REACHABLE 或 STALE 后立即被刷新
- ARP 实际“有效时长” ≈ 30 秒(受 MetalLB GARP 周期支配)
- VIP 切换节点时收敛非常快,因为 GARP 会立即覆盖旧记录
7. 如何观察 MetalLB 对 ARP 的刷新
使用 Linux 主机:
watch -n1 'ip neigh show | grep <VIP>'
会看到类似循环:
REACHABLE → STALE → REACHABLE → ...
周期约 30 秒(默认 MetalLB 配置)。
8. 常见排障技巧
① 某节点无法访问 VIP
检查本机 ARP:
ip neigh show | grep <VIP>
错误 MAC 或 FAILED 会导致访问失败。重置:
ip neigh flush dev <接口>
② GARP 没有广播
检查 metallb-speaker 日志:
kubectl -n metallb-system logs -l component=speaker
③ VIP 切换慢
检查:
- announcement-interval 是否太大
- ARP 是否被交换机过滤
- 节点网卡是否有 ARP 抑制(如 bond 参数)
9. 总结
- Linux ARP 缓存生命周期由 NUD 状态机控制,而不是简单 TTL。
- 状态主要为:INCOMPLETE、REACHABLE、STALE、DELAY、PROBE、FAILED、NOARP、PERMANENT。
- MetalLB Layer2 模式通过 定期 GARP(默认 30s) 不断刷新邻居表,使 VIP 的 ARP 永不过期。
- 实际运行中,ARP 状态大多在 REACHABLE/STALE 间交替。
- 排障重点:
ip neigh show+metallb speaker logs。
如需,我可以继续补:
- MetalLB speaker 的 GARP 数量与周期调优
- ARP 包抓包示例(tcpdump)
- 针对 bond/team/VLAN 的特殊情况说明
- VIP 漂移时的 ARP 冲突排查
更多推荐

所有评论(0)