4、ARP协议:地址解析协议工作原理、ARP缓存、ARP欺骗

聊到IP层,有个协议你绕不开——ARP。说白了,它干的事就一件:把IP地址翻译成MAC地址。

你想想看,网络层用的是IP地址,可到了数据链路层,设备只认MAC地址。这两层之间怎么对接?ARP就是那个翻译官。

我记得刚入行那会儿,有次排查一个“能ping通网关但上不了网”的奇葩问题,折腾了半天,最后发现是ARP表坏了。从那以后,我对这个“小协议”再也不敢轻视。

4.1 ARP干了什么

ARP全称是Address Resolution Protocol,地址解析协议。它的工作场景很简单:

  • 你知道目标主机的IP地址(比如192.168.1.1)
  • 但不知道它的MAC地址(比如00:1a:2b:3c:4d:5e)
  • ARP帮你把这个映射关系找出来

没有ARP,IP包到了数据链路层就卡住了——网卡不知道该把帧发给谁。

核心要点:ARP只工作在同一个广播域(即同一网段)内。跨网段的地址解析,交给网关处理。

4.2 工作原理:请求与应答

ARP的工作流程分两步:广播请求 + 单播应答。

假设主机A(IP: 192.168.1.10)想和主机B(IP: 192.168.1.20)通信,但A不知道B的MAC地址。这时候:

  1. A发送ARP请求:A在局域网内广播一个帧,内容大致是——“谁的IP是192.168.1.20?请告诉你的MAC地址给192.168.1.10”。这个帧的目标MAC地址填的是FF:FF:FF:FF:FF:FF,也就是广播地址。
  2. 所有主机都收到:因为广播,网段内每台设备都会收到这个请求。但只有B发现“嗯,问的是我的IP”。
  3. B回复ARP应答:B直接单播回复A,说“我就是192.168.1.20,我的MAC是00:1a:2b:3c:4d:5e”。
  4. A收到并缓存:A把B的IP-MAC映射写入自己的ARP缓存表,下次直接查表,不用再广播了。

整个过程,说白了就是“喊一嗓子,等一个人回话”。

小技巧:在Windows上可以用 arp -a 查看本机ARP缓存表。Linux/macOS用 arp -n。我排查网络问题时,第一件事就是看ARP表对不对。

4.3 ARP缓存:为什么要缓存?

如果每次通信都要广播一次,那网络里全是ARP请求,效率太低了。所以ARP引入了缓存机制。

每台主机和路由器都维护一张ARP缓存表,记录IP地址到MAC地址的映射。缓存条目有生存时间(TTL),过期后自动删除。

操作系统 默认ARP缓存超时(静态条目) 默认ARP缓存超时(动态条目)
Windows 10分钟(无活动则2分钟) 2分钟
Linux 永久(除非手动删除) 15-60秒(取决于内核参数)
macOS 20分钟 20分钟

我个人习惯在配置静态IP的设备上,把ARP缓存超时设长一点,减少广播流量。但要注意,缓存太久也可能导致问题——比如换了网卡,MAC变了,旧缓存还在,通信就断了。

4.4 ARP欺骗:一个经典的攻击手法

ARP协议有个“致命缺陷”——它不验证身份。任何主机都可以声称“我就是某个IP”。这就是ARP欺骗(ARP Spoofing)的根源。

攻击流程大致是这样:

  1. 攻击者C伪造一个ARP应答,告诉A:“192.168.1.1(网关)的MAC地址是CC:CC:CC:CC:CC:CC”。
  2. A收到后,傻傻地更新了自己的ARP缓存。
  3. 从此,A发给网关的所有流量,都送到了C的网卡上。
  4. C可以抓包、篡改、甚至转发给真正的网关——中间人攻击(MITM)就这么成了。

我曾经踩过的坑:有次在客户现场做渗透测试,用arpspoof工具做演示,结果忘了关,导致整个办公室断网半小时。ARP欺骗的破坏力,比你想象的大得多。做实验时一定记得在隔离环境里玩。

4.5 如何防御ARP欺骗

防御手段不多,但有效:

  • 静态ARP条目:把关键设备(网关、服务器)的IP-MAC映射写成静态的,不会被动态更新覆盖。命令示例:arp -s 192.168.1.1 00-11-22-33-44-55。缺点是大规模网络维护成本高。
  • DAI(Dynamic ARP Inspection):在交换机上启用,只信任DHCP Snooping绑定表中的IP-MAC对应关系,丢弃非法的ARP包。这是企业级网络的标配。
  • ARP防火墙:终端上装软件,检测ARP表异常变化时报警或阻止。

我建议:在家庭或小办公室网络里,至少把网关的ARP条目设成静态。花30秒配置,能省掉很多莫名其妙的“上不了网”问题。

4.6 ARP协议完整流程示意图

下面这张图把ARP请求、应答、缓存、欺骗的完整逻辑串起来了。你可以对照着理解。

ARP协议完整流程示意图 主机A 192.168.1.10 主机B 192.168.1.20 攻击者C 192.168.1.99 ① ARP请求(广播) “谁是192.168.1.20?” ② ARP应答(单播) “我是B,MAC=00:1a:2b:3c:4d:5e” A的ARP缓存表 192.168.1.20 → 00:1a:2b:3c:4d:5e 192.168.1.1 → 00:11:22:33:44:55 (TTL剩余:8分钟) ③ ARP欺骗攻击 C伪造应答:“网关的MAC是我” 关键点总结 ARP请求是广播,ARP应答是单播 ARP缓存减少广播流量,但也是欺骗攻击的入口 防御:静态ARP条目 + DAI + ARP防火墙 正常主机 攻击者 缓存/说明区域 广播/欺骗流量 单播流量

4.7 实战:用Wireshark抓一个ARP包

光说不练假把式。我建议你打开Wireshark,在局域网里随便ping一台设备,然后过滤 arp,你会看到:

  • 一个ARP请求包:目标MAC是广播地址,里面问的是“Who has 192.168.x.x?”
  • 一个ARP应答包:源MAC是目标设备的地址,回复“I have 192.168.x.x, my MAC is ...”

嗯,亲眼看到这两个包,你对ARP的理解就到位了。

避坑指南:我曾经在抓包时发现ARP请求包反复出现,但没人应答。查了半天,发现是目标设备关机了。所以,ping不通的时候,先看看ARP有没有解析到——如果ARP表里没有目标MAC,那IP层根本发不出去。