4. 网卡与驱动层性能调优

ARP,地址解析协议。说白了,就是问一句「谁有这个 IP?请告诉我你的 MAC」。在网络世界里,IP 是门牌号,MAC 才是身份证。没有 ARP,数据包连二层都出不去。

我刚开始做运维那会儿,遇到过一次全网断流。查了半天,最后发现是一台测试机在疯狂发送虚假 ARP 应答。从那以后,我对 ARP 的敬畏心就刻在骨子里了。

核心要点:ARP 是 IP 到 MAC 的映射表。这张表一旦乱了,网络就「精神分裂」了。

4.1 两个核心命令:arp 与 ip neigh

排查 ARP 问题,你只需要两个命令。一个老派,一个新派。我建议你直接上手 ip neigh,但老系统上 arp 依然好用。

4.1.1 arp 命令(传统派)

# 查看完整 ARP 缓存表
arp -n

# 删除某个 ARP 条目
arp -d 192.168.1.1

# 静态绑定 MAC(慎用,用于防欺骗)
arp -s 192.168.1.100 00:11:22:33:44:55

-n 参数很重要。不加它,命令会尝试反向解析主机名,慢得要命。我在排查故障时,第一件事就是加 -n。

4.1.2 ip neigh 命令(现代派)

# 查看邻居表(ARP 缓存)
ip neigh show

# 删除条目
ip neigh del 192.168.1.1 dev eth0

# 添加静态条目
ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent

nud permanent 表示永久有效,不会老化。这个在防 ARP 欺骗时很管用。

我的习惯:能用 ip neigh 就不用 arp。前者输出更规范,而且支持更多状态标识。

4.2 ARP 缓存表深度分析

一张健康的 ARP 表,应该只有你需要的条目。如果出现几百条,八成是中招了。

4.2.1 表项状态解读

状态 含义 说明
REACHABLE 可达 最近通信过,条目有效
STALE 过期 超过老化时间,需要重新探测
DELAY 延迟 刚发过探测,等待应答
PROBE 探测中 正在发送单播探测
FAILED 失败 多次探测无响应
PERMANENT 永久 静态绑定,不会老化

你想想看,如果网关的条目状态一直是 STALE 或 FAILED,那网络肯定有问题。我遇到过一台机器,ARP 表里网关状态反复在 REACHABLE 和 STALE 之间跳,最后发现是网线接触不良。

4.2.2 缓存老化机制

Linux 默认的 ARP 老化时间是 60 秒。你可以通过内核参数调整:

# 查看当前老化时间(单位:秒)
cat /proc/sys/net/ipv4/neigh/default/gc_stale_time

# 临时修改为 120 秒
echo 120 > /proc/sys/net/ipv4/neigh/default/gc_stale_time

但我不建议改得太大。老化时间过长,网络拓扑变化时,你会等很久才能恢复通信。

避坑指南:我曾经把老化时间改成 600 秒,结果交换机割接后,所有机器等了 10 分钟才恢复。那 10 分钟,运维群里炸了锅。

4.3 ARP 欺骗:网络里的「李鬼」

ARP 欺骗的原理很简单:伪造 MAC 地址。攻击者发送虚假 ARP 应答,告诉网关「我是受害者」,告诉受害者「我是网关」。然后所有流量都经过攻击者。

4.3.1 如何发现 ARP 欺骗

第一步,看 ARP 表里有没有重复的 IP:

# 检查网关 MAC 是否唯一
arp -n | grep 192.168.1.1

# 用 ip neigh 更直观
ip neigh show | grep 192.168.1.1

如果同一个 IP 对应两个不同的 MAC,那基本可以断定有人在搞鬼。

第二步,用 arping 验证:

# 发送 ARP 请求,看谁应答
arping -I eth0 192.168.1.1

# 收到多个 MAC 应答,就是有问题

4.3.2 实战排查步骤

  1. 抓包确认:用 tcpdump 抓 ARP 包,看谁在发虚假应答。
  2. 定位源头:根据 MAC 地址查交换机端口。
  3. 临时防御:在网关和关键服务器上做静态绑定。
  4. 永久方案:部署 DAI(动态 ARP 检测)或 DHCP Snooping。
# 抓取 ARP 包,只看请求和应答
tcpdump -i eth0 -n arp

# 输出示例
# 08:12:33.123456 ARP, Request who-has 192.168.1.1 tell 192.168.1.100
# 08:12:33.123789 ARP, Reply 192.168.1.1 is-at 00:11:22:33:44:55 (正常的)
# 08:12:33.124001 ARP, Reply 192.168.1.1 is-at aa:bb:cc:dd:ee:ff (假的!)

关键判断:正常网络里,一个 IP 只对应一个 MAC。出现两个以上,立刻报警。

4.4 ARP 冲突:谁动了我的 MAC?

ARP 冲突和欺骗不一样。冲突是两台机器配置了相同的 IP,或者 MAC 地址重复。欺骗是故意的,冲突多半是配置失误。

4.4.1 冲突的典型症状

  • 网络时通时断,丢包严重。
  • 系统日志里出现 IP address conflict 提示。
  • ARP 表里同一个 IP 的 MAC 频繁变化。

4.4.2 排查方法

# 查看系统日志
dmesg | grep -i conflict
journalctl -k | grep -i arp

# 持续监控 ARP 表变化
watch -n 1 'ip neigh show | grep 192.168.1.1'

我遇到过最奇葩的一次:两台虚拟机用了相同的 MAC 地址。因为模板克隆时忘了重置 MAC。结果这两台机器一上线,整个网段都跟着遭殃。

快速定位:拔掉疑似冲突机器的网线,看 ARP 表是否稳定。如果稳定了,就是那台机器的问题。

4.5 知识体系总览

下面这张图,把 ARP 相关的知识点串起来了。你可以把它当作排查时的「作战地图」。

ARP 协议与邻居发现 · 知识体系 ARP 协议核心 排查命令 arp -n ip neigh arping ARP 缓存表 状态解读 老化机制 gc_stale_time 常见问题 ARP 欺骗 ARP 冲突 MAC 重复 排查口诀:先看表,再抓包,静态绑定是绝招 一个 IP 一个 MAC,多出来的就是鬼

4.6 总结与建议

ARP 问题,说白了就是「谁是谁」的问题。IP 和 MAC 的对应关系一旦乱了,网络就跟着乱。

我个人建议你养成几个习惯:

  • 定期检查 ARP 表,尤其是网关的条目。
  • 关键服务器做静态绑定,别偷懒。
  • 遇到网络异常,第一个想到的就是查 ARP。

嗯,ARP 这块就聊到这儿。记住一句话:网络无小事,ARP 无小事。