4、ARP协议:地址解析原理

ARP协议,说白了就是“问路协议”。

你在局域网里想跟另一台机器通信,只知道它的IP地址,但不知道它的MAC地址。ARP就是帮你把这个IP“翻译”成MAC地址的。没有它,二层交换机没法转发光包,三层包也发不出去。

我刚开始调网络时,总觉得ARP就是发个广播问一下,没什么技术含量。后来遇到一个间歇性丢包的问题,折腾了三天,最后发现是ARP缓存表出了问题。从那以后,我对ARP就再也不敢小瞧了。

4.1 ARP的核心思想与工作流程

ARP的工作流程其实特别简单。设备A要向设备B发数据,但它不知道B的MAC地址。这时A会发一个广播帧,问“谁的IP是172.16.1.2?请告诉我你的MAC地址”。B收到后,发现是在问自己,就单播回复“我是172.16.1.2,我的MAC是aa:bb:cc:dd:ee:ff”。A收到回复后,就把这个映射关系缓存下来,下次直接用。

关键点:ARP请求是广播,ARP响应是单播。

广播的目标MAC地址是 FF:FF:FF:FF:FF:FF,表示“局域网内所有设备”。

4.2 ARP缓存:为什么需要缓存?

你想想看,如果每次发数据之前都得广播问一下,那网络里就全是啊啊啊的广播风暴了。所以,操作系统会把学到的IP-MAC映射存在一张表里,这张表就叫ARP缓存表。

缓存表的结构:

  • IP地址:对端设备的逻辑地址。
  • MAC地址:对端设备的物理地址。
  • 接口:本机发出的物理端口。
  • 类型:动态(广播学习到的)或静态(手工配置的)。
  • 超时时间:动态条目默认存活时间(Windows约2分钟,Linux约30秒)。

我遇到过一个问题:一台新服务器上线后,网络老是不通。检查交换机、路由、防火墙都没问题。最后我登到对端机器上看了ARP表,发现记录的MAC地址还是旧服务器的。这就是典型的ARP缓存超时或冲突。清掉缓存就好了。

避坑指南:我曾经遇到一个生产环境,ARP缓存表被写满,导致新设备一直学不到MAC地址。建议你日常监控一下核心网络设备的ARP表项数量,不要超过设备规格的60%。

4.3 ARP请求/响应过程深度拆解

我们用一个典型的场景过一遍数据包的细节。

假设A(IP: 10.0.0.1/24, MAC: 00-11-22-33-44-55)要跟B(IP: 10.0.0.2/24, MAC: 00-11-22-33-44-66)通信。

第一步:检查本地ARP缓存

A先检查自己的ARP表。如果有B的条目,直接使用。如果没有,进入下一步。

第二步:构造ARP请求帧

  • 以太网目标MAC: FF:FF:FF:FF:FF:FF(广播)
  • ARP操作码: 0x0001(请求)
  • 发送方MAC: 00-11-22-33-44-55
  • 发送方IP: 10.0.0.1
  • 目标MAC: 00:00:00:00:00:00(未知)
  • 目标IP: 10.0.0.2

第三步:以太网交换机组播/广播该帧

交换机收到广播帧后,从所有端口转发出去(除接收端口外)。局域网内所有主机都会收到该帧。

第四步:目标主机响应

B收到后,看到目标IP是自己的IP。然后构造ARP响应帧:

  • 以太网目标MAC: 00-11-22-33-44-55(单播给A)
  • ARP操作码: 0x0002(响应)
  • 发送方MAC: 00-11-22-33-44-66(B的真实MAC)
  • 发送方IP: 10.0.0.2
  • 目标MAC: 00-11-22-33-44-55
  • 目标IP: 10.0.0.1

第五步:A更新ARP缓存,开始通信

A收到响应后,将IP 10.0.0.2 -> MAC 00-11-22-33-44-66写入缓存表。然后重新发起对B的数据传输。

为什么ARP请求的目标MAC填全0?因为我不知道对方的MAC啊,填0表示“未知,请补充”。

4.4 免费ARP(Gratuitous ARP)

免费ARP是一个很有意思的东西。它的请求包里的发送方IP和目标IP都是自己的IP。也就是说,我自己发个广播问“我是XXX,我的MAC是XXX,你们有谁用这个IP吗”。

免费ARP的用途:

  • 探测IP地址冲突:如果在局域网上广播,有另一台设备回应了,那就说明IP冲突了。
  • 更新其他主机的ARP缓存:比如网卡更换了,MAC地址变了。发一个免费ARP,局域网里所有设备都会更新自己的缓存,把旧MAC替换成新MAC。我做过一次网卡更换,就是通过免费ARP瞬间完成切换,没有任何业务中断。

我记得有一次做故障演练,换了个网卡插上去,结果Ping不通那台服务器。排查了半天,发现是免费ARP没发,交换机和其他主机的ARP表里还是旧MAC。手动发一次免费ARP就恢复了。

4.5 ARP欺骗与安全

ARP有两个天然缺陷:一是无状态,任何设备都可以主动回复ARP请求;二是无认证,收到ARP包就信了,直接更新缓存。这就给了攻击者机会。

ARP欺骗攻击流程:

  1. 攻击者(C)伪装成网关(G)的IP地址,向受害者(A)发送ARP响应,声称“网关的MAC是我”。
  2. A更新缓存,认为网关的MAC是C的MAC。
  3. A的所有出站流量都发给了C。
  4. C抓取数据包后,可以转发给真正的网关G,完成中间人攻击。

ARP欺骗的危害极大:可以窃听、篡改数据,甚至可以造成整网瘫痪。我曾经在一个安全评估项目中,用ARP欺骗成功绕过企业防火墙,拿到了办公区的所有HTTP流量。

防御措施:

  • 静态ARP条目:对关键设备(网关、DNS、重要服务器)手工配置静态ARP条目,不受动态更新影响。
  • DAI(Dynamic ARP Inspection):在支持DAI的交换机上开启,交换机检查ARP包是否合法。
  • ARP表项变化告警:监控网络设备上的ARP变化,特别是网关的MAC地址是否有异常变更。
  • 使用IPSec或HTTPS:即使被欺骗抓取了流量,加密的数据也无法被直接利用。

4.6 ARP协议知识结构图

下面这张图,总结了我们这一章的核心知识点。它从左到右展示了ARP协议的完整生态:从通信需求出发,经过请求、响应、缓存,最终形成数据交换;同时标出了免费ARP的不同用法,以及ARP欺骗这个安全风险。你可以把它当作一个思维导图来复习。

ARP协议知识结构图 ARP协议:地址解析 1. 请求/响应过程 2. ARP缓存机制 3. 免费ARP 广播请求(目标MAC=FF:FF:FF:FF:FF:FF) 单播响应(操作码0x0002) 动态条目(广播学习,超时30s~2min) 静态条目(手工配置,不老化) 探测IP冲突(发方IP == 目标IP) 更新其他主机的缓存(网卡更换时) ARP欺骗(中间人攻击) 攻击手法:伪造ARP响应,篡改缓存 危害:窃听、篡改、断网 防御:静态ARP、DAI、加密 提示:ARP无状态、无认证,是二层攻击的入口

4.7 故障排查小贴士

最后分享几个我在实际项目中用过的排查技巧,希望能帮你省点时间。

现象 问题可能原因 排查命令 解决方案
间歇性Ping不通 ARP缓存超时或冲突 arp -a (Windows/Linux) 清除缓存:arp -d,或者等待自动刷新
新设备接入后无法通信 网关ARP表未更新,仍是旧MAC show ip arp (网络设备) 手工清除网关的ARP条目,或者重启交换机
内网丢包率异常高 可能存在ARP欺骗攻击 抓包分析,查看是否有多条ARP响应来自不同MAC 部署DAI,防ARP欺骗
IP冲突提示 两台设备使用了同一IP 查看系统日志,或使用ARP请求分析 修改其中一台的IP

重要提醒:在生产环境上批量清除ARP缓存前,一定要确认影响范围。我见过有人直接在核心交换机上清ARP,导致中断了30秒。建议在业务低峰期操作,或者逐台设备进行。