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地址。这时候:
- A发送ARP请求:A在局域网内广播一个帧,内容大致是——“谁的IP是192.168.1.20?请告诉你的MAC地址给192.168.1.10”。这个帧的目标MAC地址填的是FF:FF:FF:FF:FF:FF,也就是广播地址。
- 所有主机都收到:因为广播,网段内每台设备都会收到这个请求。但只有B发现“嗯,问的是我的IP”。
- B回复ARP应答:B直接单播回复A,说“我就是192.168.1.20,我的MAC是00:1a:2b:3c:4d:5e”。
- 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)的根源。
攻击流程大致是这样:
- 攻击者C伪造一个ARP应答,告诉A:“192.168.1.1(网关)的MAC地址是CC:CC:CC:CC:CC:CC”。
- A收到后,傻傻地更新了自己的ARP缓存。
- 从此,A发给网关的所有流量,都送到了C的网卡上。
- 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请求、应答、缓存、欺骗的完整逻辑串起来了。你可以对照着理解。
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层根本发不出去。