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欺骗攻击流程:
- 攻击者(C)伪装成网关(G)的IP地址,向受害者(A)发送ARP响应,声称“网关的MAC是我”。
- A更新缓存,认为网关的MAC是C的MAC。
- A的所有出站流量都发给了C。
- 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欺骗这个安全风险。你可以把它当作一个思维导图来复习。
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秒。建议在业务低峰期操作,或者逐台设备进行。