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 行为:

  1. VIP 分配时 → 立即发送 GARP(刷新各主机 ARP)
  2. 周期性发送 GARP(默认 30 秒)
  3. 切换 owner 时 → 立即大量 GARP(快速收敛)

配置示例(可调整周期)

protocol: layer2
announcement-interval: 30s

6. MetalLB + Linux ARP 的综合行为(实际效果)

由于 Linux 的默认 ARP 过期时间为:

  • REACHABLE:约 30 秒
  • STALE:60 秒后触发验证

且 MetalLB 每 30 秒广播一次 GARP,因此:

⭐ 最终效果:

  • 邻居表几乎一直保持 REACHABLESTALE 后立即被刷新
  • 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 冲突排查
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐